Kopieren Sie mehrere Wörter (aus verschiedenen Zeilen) und fügen Sie sie gleichzeitig ein

7

Ich möchte verschiedene Zeichenfolgen aus verschiedenen Zeilen der Datei kopieren und sie dann gleichzeitig zusammenfügen. Mit anderen Worten, ich möchte verschiedene Wörter in einem Korb sammeln und sie dann sofort einfügen. Wie kann ich das machen?

John
quelle

Antworten:

15

Verwenden Sie beim Ziehen (Kopieren) ein Großbuchstabenregister:

"Ay

"Asagt, an das Register anzuhängena , im Gegensatz dazu "awürde der Inhalt des Registers ersetzena .

Sobald Sie alles in das Register kopiert haben, können Sie alles auf einmal einfügen mit:

"ap
8bittree
quelle
Wie lösche ich nun den Inhalt eines Registers?
John
1
@ John Sie können ein Register löschen, indem Sie ein leeres Makro wie folgt aufzeichnen : qaq. Alternativ können Sie Ihr erstes Wort mit dem Kleinbuchstabenregister kopieren, wenn Sie nur vermeiden möchten, dass vorheriger Müll darin enthalten ist : "ay. Denken Sie daran aund Abeziehen Sie sich auf dasselbe Register. Sie wirken sich nur darauf aus, wie Dinge hinzugefügt werden.
8bittree
6

Sie können auch Ihren eigenen benutzerdefinierten Operator definieren, der jedes Textobjekt oder jeden Text, der von einer Bewegung abgedeckt wird, schrittweise zieht:

fu! Incremental_yank(type, ...) abort
    if a:type ==# 'char'
        norm! `[v`]y
    elseif a:type ==# 'line'
        norm! '[V']y
    elseif a:0
        norm! gvy
    endif

    call setreg('z', @".(a:type ==# 'char' ? ' ' : ''), 'a' . getregtype('"'))
    call setreg('"', @z, getregtype('z'))
endfu

nno <silent> zy  :<C-U>set opfunc=Incremental_yank<CR>g@
xno <silent> zy  :<C-U>call Incremental_yank(visualmode(), 1)<CR>
nno <silent> zyy :<C-U>set opfunc=Incremental_yank<Bar>exe 'norm! '.v:count1.'g@_'<CR>

nno <silent> zyc :<C-U>let [@", @z] = ['', '']<CR>p

In diesem Beispiel sind 4 Tastenkombinationen installiert:

  • zy normaler Bediener, um ein Textobjekt oder eine Bewegung schrittweise zu ziehen
  • zyy ähnlicher Operator, der auf Linien arbeitet
  • zy ähnlicher Operator, der an der visuellen Auswahl arbeitet
  • zycnormaler Befehl zum Leeren der Register "und z; nützlich, bevor Sie anfangen, eine Folge von Texten zu ziehen

Damit könnten Sie:

  • Kopieren Sie einige Wörter, die zyiwauf das erste Wort treffen , und wiederholen Sie den Vorgang mit dem Befehl dot auf den nächsten
  • Kopieren Sie einige Zeilen, die zyyauf die erste treffen , und wiederholen Sie den Vorgang mit dem Befehl dot auf der nächsten
  • Kopieren Sie einige visuelle Auswahlen und treffen Sie zysie

Der aktuelle Code überfüllt das zRegister. Wenn Sie xbeispielsweise ein anderes Register verwenden möchten , können Sie die folgenden Zeilen ändern:

call setreg('z', @", 'a' . getregtype('"'))                call setreg('x', @", 'a' . getregtype('"'))
             ^                                                          ^
call setreg('"', @z, getregtype('z'))                 →    call setreg('"', @x, getregtype('x'))
                  ^              ^                                           ^              ^
nno <silent> zyc :<C-U>let [@", @z] = ['', '']<CR>p        nno <silent> zyc :<C-U>let [@", @x] = ['', '']<CR>p
                                 ^                                                          ^

Weitere Informationen finden Sie unter:

:h g@
:h getregtype()
:h setreg()

Geben Sie hier die Bildbeschreibung ein

user9433424
quelle
Was ist das für ein Programm?
Segfault
byzanz-record und screenkey
user9433424
Das ist fantastisch! Könnte dies geändert werden, um eine Schleife zum Yank-Append bei mehreren visuellen Auswahlen hinzuzufügen? Angenommen, ich möchte alle Abschnitte ohne Markdown-Datei ziehen. Ich könnte /^#\s.\+und dann zyvzum Beispiel!
Luciano