Wie kann man in Vim zwischen Klammern (oder Anführungszeichen oder…) wählen?


219

Ich bin mir sicher, dass es früher ein Plugin für diese Art von Sachen gab, aber jetzt, wo ich es brauche, kann ich es (natürlich) nicht finden, also frage ich einfach nett und einfach.

Was ist der einfachste Weg, um zwischen Klammern, Anführungszeichen oder allgemein einer Liste übereinstimmender Zeichen zu wählen?

   write ( *, '(a)' ) 'Computed solution coefficients:'

Zum Beispiel möchte ich hier auswählen (a), oder Computed solution coefficients:.

Ich interessiere mich nicht für mehrzeilige Fälle, sondern nur für Fälle, die in einer Zeile auftreten.

Antworten:


276

Verwenden Sie eine beliebige Navigationstaste, die in die Klammern eingefügt werden soll. Anschließend können Sie entweder yi(oder yi)alles innerhalb der entsprechenden Parens kopieren. Dies funktioniert auch mit eckigen Klammern (z. B. yi]) und geschweiften Klammern. Neben ykönnen Sie auch löschen oder ändern Text (zB ci), di]).

Ich habe dies mit doppelten und einfachen Anführungszeichen versucht und es scheint auch dort zu funktionieren. Für Ihre Daten mache ich:

write (*, '(a)') 'Computed solution coefficients:'

Bewegen Sie den Cursor auf Cund geben Sie ein yi'. Bewegen Sie den Cursor auf eine leere Zeile, drücken Sie pund holen Sie

Computed solution coefficients:

Als CMS bemerkte , wie gut das funktioniert für visuelle Modus Auswahl - nur nutzen vi), vi}, vi'etc.


1
Ich suche im Allgemeinen nach einer Möglichkeit, alles zwischen vordefinierten übereinstimmenden Zeichen auszuwählen (normalerweise nur einfache und doppelte Anführungszeichen und Klammern aller Art).
Turm

2
Was meinst du mit getrennten Wörtern? Ich habe es mit "[x, y, z]" versucht und es hat "x, y, z" ausgewählt
Tim Whitcomb

4
Ignorieren Sie den letzten Kommentar - gefunden, was das Problem war. Funktioniert wie ein Zauber :-)
Rook

es scheint auch mit Anführungszeichen zu funktionieren, yi"wählen Sie alle mit Anführungszeichen aus
stefanB

ci(oder ci)macht es für das, wonach ich gesucht habe. Vielen Dank. Ich verstehe das iin diesem Fall immer noch nicht ganz , aber wen interessiert es, solange es funktioniert, oder? :)
Justnorris

279

Um zwischen den einfachen Anführungszeichen zu wählen, mache ich normalerweise ein vi' ("innere Anführungszeichen auswählen").

Innerhalb eines Klammerblocks verwende ich vib ("inneren Block auswählen")

Innerhalb eines geschweiften Klammerblocks können Sie verwenden viB("Großbuchstabe B")

Um die Auswahl "inklusive" zu treffen (wählen Sie auch die Anführungszeichen, Klammern oder Klammern aus), können Sie astattdessen verwenden i.

Weitere Informationen zur Auswahl von :help text-objectsTextobjekten finden Sie im Handbuch oder in vim.


danke für diesen tipp, ich habe nach etwas ähnlichem gesucht und gefragt und war mit meinen ergebnissen nicht zufrieden. Genial.
Alfredodeza

Dieser Tipp ist sehr einfach und leicht in meinem Gehirn- und Muskelgedächtnis zu verankern. Vielen Dank.
Ghazaly

Dies ist ein sehr nützlicher Tipp. Kein Fummeln mehr mit zusätzlichen Tastenanschlägen. Danke für den Link.
Rai

27

Diese Auswahlmethode ist in der Vim-Hilfe integriert und wird ausführlich behandelt. Es umfasst XML-Tags und mehr.

Siehe :help text-objects.


1
: Hilfe Text-Objekte kommt näher an die nützlichen Dinge ... Sie könnten zumindest einige der häufigsten erwähnen, wie ein "und ein" (im visuellen Modus.
Stobor

2
(Auch +1, weil ich, obwohl ich ein langjähriger Vim-Benutzer bin, nichts davon wusste!)
Stobor

@Stobor. Cheers
korrigierte

21

Zur Auswahl in einfachen Anführungszeichen verwenden vi'.

Zur Auswahl in Klammern verwenden vi(.


3
Hinweis: ci'oder ci(zum Ändern anstelle einer visuellen Auswahl. Aber es macht genau das, was ich wollte. Danke :)
Justnorris

Der zweite funktioniert nur, wenn er sich in diesem () Block befindet, also mache ich das normalerweise %vi(oder%vib
816-8055

7

Verwenden Sie Pfeile oder hjkl, um zu einem der Klammerausdrücke zu gelangen, vwählen Sie dann den visuellen Modus (dh den Auswahlmodus) %und springen Sie dann zur anderen Klammer.


5
(macht leider keine Zitate ...)
Stobor

3

Schreiben Sie eine Vim-Funktion in .vimrc mit der searchpairintegrierten Funktion:

searchpair({start}, {middle}, {end} [, {flags} [, {skip}
            [, {stopline} [, {timeout}]]]])
    Search for the match of a nested start-end pair.  This can be
    used to find the "endif" that matches an "if", while other
    if/endif pairs in between are ignored.
    [...]

( http://vimdoc.sourceforge.net/htmldoc/eval.html )


2

Ich würde der am häufigsten gewählten Antwort ein Detail hinzufügen:

Wenn Sie gvim verwenden und in die Zwischenablage kopieren möchten, verwenden Sie

"+<command>

So kopieren Sie den gesamten Inhalt zwischen Klammern (oder Parens oder geschweiften Klammern)

Beispiel: "+yi}Kopiert den gesamten Inhalt zwischen den geschweiften Klammern Ihres Cursors in die Zwischenablage.


2
Dies ist völlig orthogonal zum Problem und sollte keine Antwort sein. Sie können dies auf jede Frage schreiben, nach der gefragt wird y.
Pipe

Dies ist eine Ergänzung zur Antwort, keine Antwort selbst.
Yuriploc

Dann sollte es eine Bearbeitung dieser Antwort sein, dieser Beitrag wie er ist beantwortet die Frage nicht.
Pipe

Dies ist eine Werbung für die NICHT-Verwendung von gvim :) Wer braucht in seinem Leben zwei zusätzliche Schichten + Tastendrücke?
Paul Parker

1

Ich habe ein Plugin erstellt vim-textobj-quotes: https://github.com/beloglazov/vim-textobj-quotes

Es bietet Textobjekte für die nächsten Anführungszeichenpaare eines beliebigen Typs. Wenn Sie nur iqoder verwenden aq, können Sie den Inhalt von einfachen ('), doppelten (") oder hinteren (`) Anführungszeichen bearbeiten, die den Cursor derzeit umgeben, sich vor oder hinter dem Cursor befinden (in dieser Reihenfolge). Mit anderen Worten, es springt bei Bedarf vorwärts oder rückwärts, um die Anführungszeichen zu erreichen.

Es ist einfacher zu verstehen, wenn man sich Beispiele ansieht (der Cursor wird mit angezeigt |):

  1. Vorher foo '1, |2, 3' bar;; nach dem Drücken von diq:foo '|' bar
  2. Vorher foo| '1, 2, 3' bar;; nach dem Drücken von diq:foo '|' bar
  3. Vorher foo '1, 2, 3' |bar;; nach dem Drücken von diq:foo '|' bar
  4. Vorher foo '1, |2, 3' bar;; nach dem Drücken von daq:foo | bar
  5. Vorher foo| '1, 2, 3' bar;; nach dem Drücken von daq:foo | bar
  6. Vorher foo '1, 2, 3' |bar;; nach dem Drücken von daq:foo | bar

Die obigen Beispiele gelten für einfache Anführungszeichen. Das Plugin funktioniert für doppelte (") und hintere (`) Anführungszeichen genauso.

Sie können auch alle anderen Operatoren: ciq, diq, yiq, viq, usw.

Weitere Informationen finden Sie auf der oben verlinkten Github-Seite.


-6

Eine einfache Keymap in vim würde dieses Problem lösen. map viq F ”lvf” hh Dieser obige Befehl ordnet viq den Schlüsseln zu, um zwischen Anführungszeichen zu suchen. Ersetzen Sie "durch ein beliebiges Zeichen und erstellen Sie Ihre Keymaps. Stecken Sie diese beim Start in vimrc und Sie sollten sie jedes Mal verwenden können.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.