Wechseln Sie zu übereinstimmenden XML-Tags in Vim

140

Der Vim- %Operator springt zu übereinstimmenden Klammern, Kommentarenden und einigen anderen Dingen. Es stimmt jedoch nicht mit XML-Tags überein (oder nach meinem besten Wissen mit einem anderen Tag).

Was ist der beste Weg, um mit Vim zum passenden XML-Tag zu springen?

Hinweis: Ich möchte wirklich einen Abschnitt in einer XML-Datei duplizieren, ohne manuell nach dem passenden Tag zu suchen.

Nathan Fellman
quelle
4
In der ursprünglichen Frage Adressierung (vor der Klärung Hinweis: ), die v + a + t Kombination scheint , dass Sie an der Unterseite der visuellen Auswahl fallen zu lassen. Die andere Seite davon scheint der Befehl "o" im visuellen Modus zu sein, der Sie zum alternativen Ende Ihrer aktuellen Auswahl führt. Dies ist ein effektiver Trick nicht nur in XML-Dokumenten, sondern auch beim Bearbeiten von PHP / HTML (wie es bei mir der Fall war).
Justin Bell

Antworten:

73

Es gibt ein vim-Plugin namens matchit.vim. Sie finden es hier: http://www.vim.org/scripts/script.php?script_id=39 . Es wurde so ziemlich genau zu dem Zweck erstellt, den Sie beschreiben.

Installieren Sie das, platzieren Sie den Cursor auf dem Hauptteil des Tags (nicht auf dem <>, sonst stimmt er mit diesen überein) und drücken Sie%, um zum anderen Tag zu springen. Auf der Seite des Skripts erfahren Sie, was sonst noch dazu passt.

Sykora
quelle
4
Schön. Hat die ganze Zeit auf meiner Festplatte gesessen.
InnaM
34
Es gibt eine Version von Matchit, die übrigens bereits mit Vim geliefert wird. runtime macros/matchit.vimsollte es aktivieren und erlauben %, XML-Tags abzugleichen.
Svend
1
mtchit.vim scheint in NeoVim standardmäßig aktiviert zu sein.
James
Möglicherweise haben Sie bereits Matchit, es ist jedoch standardmäßig nicht aktiviert. Hinzufügen packadd! matchitzu .vimrc, um es zu aktivieren. Lesen Sie mehr:help matchit
Ruuter
241

Sie können dies ohne zusätzliche Plugins tun:

  • Platzieren Sie den Cursor auf dem Tag
  • vat - wählt das (äußere) Tag aus und platziert den Cursor am Ende
  • Sobald Sie Ihre Auswahl getroffen haben, können Sie mit o( Update basierend auf Michael Grubers Notiz ) zwischen oben und unten wechseln.
  • c- ändern oder, y- kopieren oder entkommen, um den visuellen Modus zu verlassen ...

Eine weitere nützliche Operation ist: vit- wählt den Inhalt des Tags (inner) aus.

Update (dank @elrado) Beispiel: Mit dieser Optionvito können Sie den inneren Inhalt des Tags auswählen und den Cursor am Anfang des ausgewählten Textes positionieren.

Referenz: /superuser/182355/how-can-i-select-an-html-tags-content-in-vim

Vim-Referenz (danke an @Geek für den Hinweis):

:help visual-operators

Du wirst kriegen:

4. Operating on the Visual area             *visual-operators*

The objects that can be used are:
    ...
    at  a <tag> </tag> block (with tags)        |v_at|
    it  inner <tag> </tag> block            |v_it|
    ...
Robert Lujo
quelle
1
Ich möchte zu einem Tag springen und nicht den beigefügten Inhalt "auswählen". Und wenn ich es mit 1 oder 2 Tastenanschlägen machen kann, warum mache ich dann jedes Mal 5 Tastendrücke, wenn ich ein Tag auswählen möchte? (was tatsächlich
viele
2
Schön, dass es eine eingebaute, wenn auch verschlungene Möglichkeit gibt, zum schließenden Tag zu springen. Ist ein Umweg durch den visuellen Modus der einzige Weg dorthin?
Mu Mind
2
Heilige Molly, mit Vim lernst du immer Neues! Es gibt so viel zu lernen, das hat mir sehr geholfen, danke!
Gosukiwi
23
Nur zur Anmerkung: Sobald Sie Ihre Auswahl getroffen haben, können Sie mit 'o' zwischen oben und unten wechseln
Michael Gruber
3
@Geek, 't' steht für 'tag'. Um 'a' zu verstehen, müssen Sie zuerst 'i' verstehen. citändert die i nterior des Tags - nur den Inhalt. catändern ein ll des Tags - die Inhalte und eine lso den Tag selbst, sowohl das Öffnen und Schließen.
Edward
37

Das OP erklärte, dass er wirklich einen Abschnitt von XML kopieren wollte, ohne das passende Tag finden zu müssen. Dies ist im normalen Modus mit yat<motion>peinfach möglich. Dabei wird der Text in die entsprechenden Tags gezogen und eingefügt. yit<motion>pist fast das gleiche, enthält jedoch nicht die äußeren Tags.

Das 'y' in der Zeichenfolge ist natürlich der Normalmodus-Befehl "yank". ( :help y)

aoder ikann zur Objektauswahl nach einem Operator verwendet werden , wie beispielsweise yoder in einer visuellen Auswahl. Das Symbol nach aoder igibt an, was ausgewählt werden soll. Der hier verwendete Objekttyp tgibt ein SGML-Tag an. ( :help object-select).

Natürlich <motion>bedeutet nur, sich mit den Mitteln Ihrer Wahl irgendwohin zu bewegen und pden gezogenen Text an dieser Stelle abzulegen.

Codie CodeMonkey
quelle
isteht für "innen" (oder "inner"). asteht für "a"?
Nilon
@nilon asteht für "alle".
Codie CodeMonkey
Die Mnemonik, die ich benutze, asteht für herum . Es macht für mich mehr Sinn.
Kit Johnson
5

Nur mein Trick, "yank", "object-select" (Tag-Auswahl) und "zum letzten zerrten Text springen" zu verwenden.

yit`] 

vor dem Schließen des Tags nach rechts springen

und

yit

nach dem Öffnen des Tags nach rechts springen

Hinweis: Dadurch wird der Inhalt des Standardregisters geändert

transang
quelle