Fügen Sie wiederholt einen vertikalen Block in vim ein

1498
G Gordon Worley III

Wenn ich einen vertikalen Block ausgewählt habe (z. B. eine einzelne Textspalte), möchte ich in der Lage sein, alles, was sich im aktuellen Register befindet, wiederholt einfügen (einfügen) zu lassen. Wenn ich zum Beispiel so etwas hatte:

Benutzername0 Passwort0 Personal_info0 Benutzername1 Kennwort1 Personal_info1 ... Benutzername9 Passwort9 Personal_info9 

und ich wähle die Textspalte zwischen Benutzername. und Passwort. (dh die Spalte der Leerzeichen zwischen den beiden) möchte ich dort einfügen (einfügen) können. Das funktioniert in gewissem Sinne gut: Ich kann etwas einfügen, aber wenn die Auswahl länger als das Register ist, wird der Rest der Auswahl einfach durch nichts ersetzt. Stattdessen würde ich es gerne tun, indem Sie die Registrierung in der Auswahl wiederholen. Gibt es eine Möglichkeit, dies zu tun, um eine Regex zu verwenden?

1

1 Antwort auf die Frage

3
Chris Johnsen

Wenn die neue Spalte in jeder Zeile den gleichen Wert haben wird (dh Ihr anfänglicher Ruck war in einer einzigen Zeile), dann ist es wahrscheinlich einfacher, das Leerzeichen zwischen der Spalte Benutzername und Kennwort und den Typ A(oder I) zu wählen anhängen (einfügen). Wenn Sie zum normalen Modus ( Esc) zurückkehren, fügt Vim den Text auch an den Rest der ursprünglichen Auswahl an.

Wenn Sie wirklich ein sich wiederholendes Muster ausführen müssen, können Sie eine Funktion und ein Mapping wie folgt verwenden:

:function! PutRegFilledToRange() range : let l:fill = '' : let l:lines = getreg() : let l:lineStart = 0 : let l:linesLen = strlen(l:lines) : let l:lineIndex = 0 : let l:linesNeeded = a:lastline - a:firstline + 1 : while l:lineIndex < l:linesNeeded  : let l:lineEnd = matchend(l:lines, "\n\\|$", l:lineStart) : let l:line = strpart(l:lines, l:lineStart, l:lineEnd - l:lineStart) : if l:lines[l:lineEnd - 1] != "\n"  : let l:line = l:line . "\n" : endif : let l:fill = l:fill . l:line : let l:lineStart = l:lineEnd < l:linesLen ? l:lineEnd : 0 : let l:lineIndex = l:lineIndex + 1 : endwhile : : normal gv : " This probably does not make much sense in any mode : " other than block modes, but we will try to cope. : if mode() == "\<C-V>" || mode() == "\<C-S>" : let l:newMode = "\<C-V>" : elseif mode() == 'v' || mode() == 's' : let l:newMode = 'v' : else : let l:newMode = 'V' : endif : let l:origReg = getreg('') : let l:origRegType = getregtype('') : try : call setreg('', l:fill, l:newMode) : execute 'normal ' . v:count1 . 'p' : finally : call setreg('', l:origReg, l:origRegType) : endtry :endfunction :vmap _f :call PutRegFilledToRange()<CR> 

Fügen Sie Ihre .vimrc-Datei oder eine andere Datei ein (und führen Sie Folgendes aus: source / path / to /). Oder fügen Sie es direkt in eine Vim-Sitzung ein.

Um es zu benutzen:

  • C-Vy: Blockieren Sie den Text, den Sie für das wiederholte Einfügen verwenden möchten, visuell
  • C-V: Wählen Sie den Block aus, den Sie ersetzen möchten
  • _f: füllt den ausgewählten Block mit wiederholten Zeilen des aktuellen Registers ( "a_ffüllt den Block mit Zeilen aus Register a)
Tolle. Macht genau das, was ich brauchte. Vielen Dank!!! G Gordon Worley III vor 14 Jahren 0