Gibt es eine spezielle Methode, um zwei Textblöcke durch Verschachteln von Zeilen zusammenzuführen, wie z.
a1
a2
a3
a4
b1
b2
b3
b4
dazu:
a1
b1
a2
b2
a3
b3
a4
b4
in ein paar befehlen?
EDIT : Die Lösung von Sato Katsura gefällt mir sehr gut. So habe ich sie implementiert:
function! Interleave()
" retrieve last selected area position and size
let start = line(".")
execute "normal! gvo\<esc>"
let end = line(".")
let [start, end] = sort([start, end], "n")
let size = (end - start + 1) / 2
" and interleave!
for i in range(size - 1)
execute (start + size + i). 'm' .(start + 2 * i)
endfor
endfunction
" Select your two contiguous, same-sized blocks, and use it to Interleave ;)
vnoremap <pickYourMap> <esc>:call Interleave()<CR>
vimscript
formatting
merge
iago-lito
quelle
quelle
scroll-binding
zwei Vim-Fenster zu denken .b1
, dann traf ichvip
die ganze Brocken aus, und,it
was die ist<map-I've-Picked>
. Funktioniert es nicht auf Ihrer Seite?Antworten:
Es gibt keine spezielle Möglichkeit, dies zu tun (soweit ich weiß), aber ja, dies kann mit ein paar Befehlen erreicht werden:
Sie können es mit ausführen
:call Interleave(5, 8, 1)
. Der erste Parameter ist die erste Zeile, die zweite Zeile die letzte und die dritte Zeile, in die sie verschoben werden sollen. Sie möchten wahrscheinlich die Zeilennummern einschalten, um zu sehen, was Sie tun (:set number
).Dies setzt voraus, dass sich die Blöcke nicht überlappen. Sehen
:help :move
und:help range()
verstehen Sie, wie die Funktion funktioniert.Es gibt wahrscheinlich bessere Möglichkeiten, die beiden Blöcke aufzunehmen. Es gibt ein Plugin, mit dem Sie zwei Blöcke tauschen können. Ich kann mich nicht an den Namen des Plugins erinnern, aber der Autor (vielleicht der berühmte Dr. Chip?) Hat mehr darüber nachgedacht, ein Interface zu finden als ich. :)
quelle
start
undsize
. Mit einer Homebrew-Funktion, die diese Werte aus einer Auswahl abruft, ist sie einfach perfekt. Ich arbeite dran. :)Hier ist eine andere Alternative:
Kopieren Sie zuerst die 4 Zeilen darunter nach der aktuellen Zeile (
:h :t
) und löschen Sie dann die aufeinander folgenden b Zeilen (:h :d
)Noch besser ist dieser Befehl:
Das heißt, für jede Zeile, die mit a beginnt, wird die nächste Zeile gesucht, die mit 'b' beginnt, und unter die aktuelle Zeile verschoben.
quelle
.+,$d
stattdessen versucht , und das hat funktioniert (wie auch.+,.+4d
)./^\s*b
einem anderen wechseln:range
. zB: 1. Block auswählen, ausführen'<,'>g/^/'>+1m.
'>+1
Beginn des 2. Blocks markieren, wird nichts fest codiert .Wenn Sie ein bisschen Spaß mit Makros und Markierungen haben möchten, können Sie Folgendes ausprobieren:
Setzen Sie zuerst eine Markierung (hier
a
) auf die Zeilea1
mitma
Gehen Sie zu der Zeile mit
b1
und markieren Sie sie mitmb
Starten Sie die Aufnahme eines Makros in das gewünschte Register (hier das Register
q
) mitqq
Fügen Sie folgendes in Ihr Makro ein:
ddmb'apjma'b
Beenden Sie die Aufzeichnung des Makros mit
q
Spielen Sie es so oft wie nötig,
X@q
wobeiX
die Zeit angegeben ist, in der es gespielt werden soll.So detaillieren Sie das Makro:
Bearbeiten Wie in den Kommentaren von lago-lito erwähnt, überschreibt diese Methode die Markierungen und die Puffer.
Für die Noten halte ich das nicht für ein wirkliches Problem: Ich verwende selten alle 26 Noten in einem Puffer und ich denke, man wird die meiste Zeit 2 freie Noten finden.
Für den Puffer ist es möglich, ihn in einer temporären Variablen zu speichern: Verwenden Sie vor dem Aufzeichnen des Makros
:let saveReg=getreg('"')
, um das Register zu speichern, und verwenden Sie, wenn die Aktion abgeschlossen ist,,:call setreg('"', saveReg)
um das Register in seinen vorherigen Zustand zurückzusetzen.Auf jeden Fall muss ich zugeben, dass diese Lösung nur eine schnelle Umgehung ist und nicht optimal: Meiner Meinung nach ist Christans Antwort die beste und sollte akzeptiert werden, da sie nicht mit Puffern und Markierungen zu tun hat und den Benutzer nicht zum Erstellen zwingt eine Funktion und zeigt die Leistung des globalen Befehls.
quelle
getreg()
undsetreg()
, um den Puffer zu speichern. Aber ich stimme zu, dass es keine optimale Lösung ist :-)Ich habe gerade eine ähnliche Frage gesehen und die Lösung besteht aus:
Springe zur Mitte plus eins:
Und Renn:
quelle