Gibt es ein Textobjekt für den gesamten Puffer?

28

Ich finde mich oft dabei, Befehle wie gg"+yGoder einzugeben, ggdGund möchte eine effizientere Möglichkeit, dies zu tun, ohne den Cursor zweimal bewegen zu müssen. Gibt es einen Befehl, mit dem ich zB y[movement]den gesamten Puffer kopieren kann, ohne den Cursor zu bewegen?

Random832
quelle

Antworten:

36

Da vim das Prozentzeichen verwendet, um auf den aktuellen Puffer zu verweisen, können Sie damit alles schnell abrufen.

:%ywird den gesamten Puffer :%y+in das +Register ziehen (und vermutlich die Zwischenablage, sofern vim mit den richtigen Optionen kompiliert wurde).

:%dund :%d+tun dasselbe zum Löschen.

In jedem dieser Fälle bleibt der Cursor an Ort und Stelle.

Schnarchfrosch
quelle
Wow, die ganze Zeit habe ich das benutzt mmgg"+yG`mund nie daran gedacht. Danke, das geht in der .vimrc richtig.
Türknauf
@Doorknob anstatt Markierungen zu setzen und zu verwenden, können Sie diese C-ozweimal verwenden, um zurückzukehren.
Ruslan
10

Eine andere Lösung ist die Verwendung eines Plugins namens vim-textobj-whole . Standardmäßig stellt dieses Plugin das Textobjekt aefür den gesamten Puffer bereit , mit ieAusnahme von führenden und nachfolgenden Leerzeilen.

Dieses Plugin hängt von vim-textobj-user desselben Autors ab, mit dem Benutzer beliebige Textobjekte bequem definieren können. Es gibt viele Plugins , die davon Gebrauch machen.

Yosh
quelle
8

Standardmäßig gibt es kein Textobjekt für die gesamte Datei, aber es ist möglich, sie mit zu erstellen omap. In diesem Fall würde es ungefähr so ​​aussehen:

onoremap f :<c-u>normal! mzggVG<cr>`z

Hier ist eine Aufschlüsselung, wie es funktioniert:

onoremap f " make 'f' the text object name
:<c-u> " use <c-u> to prevent vim from inserting visual selection marker at the beginning of the command automatically.
normal! " use normal to make key presses ignoring any user mappings
mzggVG<cr>`z " make a marker in register z, select the entire file in visual line mode and enter the normal command, and go back to the z marker

Anmerkungen:

Ctrlukann im Befehlszeilenmodus verwendet werden, um alles links von der Cursorposition zu löschen. Der Grund dafür ist, dass, wenn Sie die Befehlszeile direkt aus dem visuellen Modus eingeben, diese automatisch '<,'>in die Befehlszeile eingefügt wird, und das ist nicht das, was wir wollen. Ich würde auch vorschlagen, dass Sie etwas anderes als verwenden f, da fnormalerweise zum nächsten gesuchten Zeichen in der Zeile gewechselt wird. Beispielsweise fiwird in ider aktuellen Zeile zur nächsten übergegangen.

Relevante Hilfethemen:

:help omap-info
:help :normal
:help c_CTRL-U
:help v_:
Immergrüner Baum
quelle
Gibt es eine Möglichkeit, dies zu tun, während der Cursor in Ruhe gelassen wird?
Random832
@ Random832 Durch Hinzufügen von a ``am Ende wird der Cursor an die vorherige Position zurückgesetzt.
SnoringFrog
Ich bin besorgt, dass dies dazu führt, dass die Auswahl nicht auf den Befehl yank angewendet wird. Ich werde heute einige experimentieren.
Random832
1
Ich habe der Zuordnung einen Markierungsbefehl hinzugefügt, der den Cursor an der Stelle belassen soll, an der er sich jetzt befindet.
EvergreenTree
2

Hier sind ein paar schnelle und schmutzige Zuordnungen, um die Aufgabe zu erledigen:

nnoremap yY :%yank <c-r>=v:register<cr><cr>
nnoremap dD :%delete <c-r>=v:register<cr><cr>

Jetzt können Sie mit yYund dDruckeln bzw. löschen. Es ist nicht so schön wie die Verwendung eines vollständigen Textobjekts, aber manchmal sind die einfachsten Lösungen die besten.

Weitere Hilfe finden Sie unter:

:h :y
:h :d
:h [range]
:h v:register
:h c_ctrl-r
:h @=
Peter Rincker
quelle