Können Sie in vi / vim zwischen Klammern greifen oder löschen?

128

Angesichts dieser Codezeile in C:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));

Gibt es eine Möglichkeit, die erste fette Klammer in die entsprechende Klammer zu löschen oder zu ziehen? Ich habe über df) nachgedacht , aber das bringt dich erst kurz nach dem 9.0.

Gibt es eine ähnliche Möglichkeit, vim dazu zu bringen, alles zwischen passenden Klammern zu erfassen, unabhängig von Zeilenumbrüchen?

Romandas
quelle

Antworten:

167

Verschiedene Anträge:%

Der %Befehl springt zur Übereinstimmung des Elements unter dem Cursor. Positionieren Sie den Cursor auf dem öffnenden (oder schließenden) Paren und verwenden Sie ihn y%zum Ziehen oder d%Löschen von allem vom Cursor zum passenden Paren.

Dies funktioniert, weil %es sich um einen "Bewegungsbefehl" handelt, sodass er überall dort verwendet werden kann, wo vim einen solchen Befehl erwartet. Von :help y:

["x]y{motion}       Yank {motion} text [into register x].  When no
                    characters are to be yanked (e.g., "y0" in column 1),
                    this is an error when 'cpoptions' includes the 'E'
                    flag.

Standardmäßig enthält "Element" Klammern, Klammern, Parens, Kommentare im C-Stil und verschiedene Precompiler-Anweisungen ( #ifdefusw.).

Es gibt ein Plugin für "Extended% Matching", das Sie auf der Vim-Homepage finden .

Sie können die Dokumentation zu %und zugehörige Bewegungsbefehle lesen, indem Sie :help various-motionsin den Befehlsmodus wechseln.

Objektauswahl

Es gibt einen weiteren Satz von Bewegungsbefehlen, mit denen Sie im visuellen Modus verschiedene Textobjekte auswählen können.

Um Ihr spezifisches Problem zu lösen, gehen Sie wie folgt vor:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                   ^

Angenommen, Ihr Cursor befindet sich auf ^. Geben Sie die folgende Reihenfolge ein, um das gesuchte Teil auszuwählen:

v2a)

Zuerst vtritt visuellen Modus, Sie dann angeben , dass Sie gehen wollen 2Ebene des Pars auf. Schließlich a)wählt das "einen Block". Danach können Sie verwenden doder xlöschen usw.

Wenn Sie die äußeren Parens nicht einbeziehen möchten, können Sie stattdessen "innerer Block" verwenden:

v2i)

Siehe :help object-selectdie vollständige Liste der im Zusammenhang Befehle.


quelle
Vielen Dank! Ich wusste, dass% zwischen passenden Elementen wechselt. Ich wusste nicht, dass es auch innerhalb von Befehlen nützlich ist. +1 und akzeptiert.
Romandas
5
Interessant, dachte ich immer a"um" und nicht "a". Fühlen Sie sich wie es "innerlich" besser ergänzt. Es vergeht kein Tag, an dem man anscheinend nichts Neues über Vim lernt.
Andrew Marshall
217

Was ist mit diboder di(.

Der innere (...) Block, in dem sich der Cursor befindet, wird gelöscht .

Ich liebe Text-Objekt Bewegungen und Auswahl!

CMS
quelle
10
Glücklicherweise ist diese Frage der erste Treffer, wenn ich danach google - ich weiß nicht, wie oft mich diese Antwort gerettet hat. Und ich vergesse es immer… :-(
Konrad Rudolph
16
Ist es möglich, einschließlich der Klammern zu löschen? (Ja, ich habe meine eigene Frage beantwortet: dab=>
Lösche
5
Ich stimme ab. Wenn Sie ein Wort in Klammern korrigieren möchten, tun Sie dies zusätzlich .
Entwickler Marius Žilėnas
5
+1! Ich war überwältigt, als ich kürzlich Textobjektbewegungen entdeckte! kein Versuch mehr, den Cursor an der richtigen Stelle zu positionieren, um den Text zu ziehen: D
verboze
36

Um alles zu löschen, was sich in einem Klammerpaar befindet, können Sie immer di(und seine Ableitungen ausgeben .

Hinweis :

Wie @porglezomb in seinem Kommentar vorgeschlagen hat, können Sie a("zusammen mit") anstelle von i("inside") verwenden, um die Klammern einzuschließen. Also, mit da(Löschungen alles innerhalb (und )einschließlich (und ).

Löschen von Text innerhalb des unmittelbaren äußeren Klammerpaars:

Also für diese Codezeile

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                ^       ^
                                |       |
                                 \_______\___---> Cursor range

Unter der Annahme, dass sich Ihr Cursor innerhalb des oben genannten Cursorbereichs befindet, können Sie die folgenden Befehle ausführen:

di(   --> Deletes '5.0/9.0'
ci(   --> Substitutes '5.0/9.0'
yi(   --> Yanks '5.0/9.0'

Löschen von Text innerhalb des n-ten äußeren Klammerpaars:

Um alles in das n-te äußere Klammerpaar aufzunehmen, fügen Sie es einfach nvor dem obigen Befehl hinzu. Also, mit der gleichen Cursorposition wie oben,

2di(   --> Deletes '(5.0/9.0) * (fahr-32)'
2ci(   --> Substitutes '(5.0/9.0) * (fahr-32)'
2yi(   --> Yanks '(5.0/9.0) * (fahr-32)'

3di(   --> Deletes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3ci(   --> Substitutes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3yi(   --> Yanks '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
Kevin
quelle
3
Sie sollten eine Notiz hinzufügen, über die aals Gegenstück gesprochen wird i, da dies wahrscheinlich vielen Menschen helfen wird.
Porglezomp
@romandas dies sollte die akzeptierte Frage sein. Ich habe heute nach genau dem gleichen Problem gesucht und @ Kevin ist der einzige hier, der die richtige Antwort gibt. Natürlich könnte ich %dieses Problem "missbrauchen" , aber dies nimmt mehr Zeit in Anspruch und sollte meiner Meinung nach nur für komplexere Szenarien verwendet werden. Das Löschen von Objekten innerhalb eines bestimmten Bereichs ist genau der Anwendungsfall di.
Daniel451
19

Sie können d%zum Löschen und y%zum Ziehen verwenden.

ahy1
quelle
3
% ist der Bewegungsspezifizierer für "übereinstimmende Klammern, Klammern oder Klammern". Jede Bewegungsspezifikation kann mit d und y (und vielen anderen Dingen) gepaart werden.
Chaos
10

Setzen Sie den Cursor auf die erste Klammer und drücken Sie v%yoder v%d.

David Norman
quelle
3
Toll! % springt zum passenden Paren. Sie können also sogar d% und y% verwenden.
1
Beachten Sie auch, dass 'd%' am Anfang eines Funktionsnamens beginnen kann und den gesamten Funktionsaufruf löscht. Es funktioniert auch für '{}', '[]' und sogar '<>' Paare.
Jonathan Leffler
@Leffler, Danke für die Tipps! Und es ist gut zu wissen, dass% auch im visuellen Modus funktioniert.
Strager
3

Versuchen Sie es mit ci [Block-Surrounder]

Platzieren Sie in Ihrem Fall den Cursor irgendwo zwischen den beiden Klammern, die Sie hervorgehoben haben, und versuchen Sie es mit den Tasten: ci (

Justin Nguyen
quelle
Fast. Wenn Sie dies testen, muss sich der Cursor in der ersten Klammer befinden, nicht zwischen, und 'c' ist der Änderungsbefehl. Mit dem Cursor auf der öffnenden Klammer wird 'di (' in die passende schließende Klammer gelöscht und 'yi (' yanks.
Richard Neish
ci arbeitet die ganze Zeit für mich. Ich muss nur sicherstellen, dass sich der Cursor zwischen den Klammern befindet, die den zu löschenden Textblock umgeben.
Justin Nguyen
2

Als Antwort von David Norman sagt:

Setzen Sie den Cursor auf die erste Klammer und drücken Sie v%yoder v%d.

Erläuterung von http://vimdoc.sourceforge.net/htmldoc/vimindex.html :

Tag-Char-Note-Aktion im normalen Modus        
-------------------------------------------------- ----------------------------
| v | v Starten Sie den zeichenweisen visuellen Modus
|% | % 1 finden Sie die nächste (geschweifte / quadratische) Klammer
                                       diese Zeile und gehen Sie zu seiner Übereinstimmung, oder gehen Sie zu
                                       passende Kommentarklammer oder gehen Sie zu Matching
| d | ["x] d {motion} 2 delete Nmove text [in buffer x]

Dies bedeutet, dass alles zwischen und einschließlich der beiden Klammern ( %) ausgewählt wird, während die Auswahl visuell vangezeigt wird ( ) und dann gezogen / kopiert yoder gelöscht / ausgeschnitten dwird. (Zum Standardpuffer.)

Sie können mit setzen / einfügen mit p.

Machte diese Antwort, um "mir das Fischen beizubringen" .

n611x007
quelle
Hinweis: vimdoc.sourceforge.net ist von vim.org verlinkt, der offiziellen Website von vim ab 2015.
n611x007