Lompat ke tag XML yang cocok di Vim

140

%Operator Vim melompat ke tanda kurung yang cocok, komentar berakhir dan beberapa hal lainnya. Namun, itu tidak cocok dengan tag XML (atau tag lainnya, sejauh yang saya ketahui).

Apa cara terbaik untuk melompat ke tag XML yang cocok menggunakan Vim?

Catatan: Yang benar - benar ingin saya lakukan adalah menduplikasi bagian dalam file XML tanpa mencari tag yang cocok secara manual.

Nathan Fellman
sumber
4
Dalam menjawab pertanyaan awal (sebelum Catatan klarifikasi:) , kombinasi v + a + t tampaknya menjatuhkan Anda ke bagian bawah pemilihan visual. Sisi lain dari ini tampaknya adalah perintah "o" dalam mode visual, yang membawa Anda ke ujung alternatif dari pilihan Anda saat ini. Ini adalah trik yang efektif tidak hanya dalam dokumen XML, tetapi juga ketika mengedit PHP / HTML (seperti yang terjadi pada saya sendiri).
Justin Bell

Jawaban:

73

Ada plugin vim yang disebut matchit.vim. Anda dapat menemukannya di sini: http://www.vim.org/scripts/script.php?script_id=39 . Itu dibuat cukup banyak tujuan persis yang Anda gambarkan.

Instal itu, tempatkan kursor Anda pada badan tag (bukan <>, kalau tidak akan cocok dengan itu) dan tekan% untuk melompat ke tag lain. Lihat halaman skrip untuk mencari tahu apa yang cocok.

sykora
sumber
4
Bagus Telah duduk di hard disk saya sepanjang waktu.
innaM
34
Ada beberapa versi matchit, yang dikirimkan bersama Vim sudah btw. runtime macros/matchit.vimharus mengaktifkannya, dan memungkinkan %untuk mencocokkan tag XML.
Svend
1
mtchit.vim tampaknya diaktifkan secara default di NeoVim.
James
Mungkin Anda sudah memiliki matchit, tetapi tidak diaktifkan secara default. Tambahkan packadd! matchitke .vimrcuntuk mengaktifkannya. Baca selengkapnya:help matchit
ruuter
242

Anda dapat melakukan ini tanpa plugin tambahan:

  • tempatkan kursor pada tag
  • vat - akan memilih tag (luar) dan menempatkan kursor di akhir
  • setelah mendapatkan pilihan, Anda dapat beralih antara bagian atas dan bawah o( pembaruan berdasarkan catatan Michael Gruber )
  • c- mengubah atau, y- menyalin atau, melarikan diri karena meninggalkan mode visual ...

Operasi lain yang bermanfaat adalah: vit- akan memilih konten dari tag (bagian dalam).

Pembaruan (terima kasih kepada @elrado) Contoh: vitoakan memungkinkan Anda untuk memilih konten bagian dalam dari tag dan kursor posisi pada awal teks yang dipilih.

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

Referensi Vim (terima kasih kepada @Geek untuk mencatat ini):

:help visual-operators

Anda akan mendapatkan:

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
sumber
1
Saya ingin melompat ke tag, bukan "memilih" konten terlampir. Dan jika saya bisa melakukannya dengan 1 atau 2 stroke tombol, mengapa saya harus melakukan 5 penekanan tombol setiap kali saya ingin memilih tag? (yang terjadi BANYAK kali sebenarnya)
kumarharsh
2
Bagus bahwa ada cara bawaan, meskipun berbelit-belit, untuk melompat ke tag penutup. Apakah mengambil jalan memutar melalui mode visual satu-satunya cara untuk sampai ke sana?
Mu Mind
2
Astaga, kau selalu belajar hal-hal baru dengan Vim! Ada begitu banyak yang harus dipelajari, ini banyak membantu saya, terima kasih!
gosukiwi
23
Sebagai catatan: setelah Anda mendapatkan pilihan, Anda dapat beralih antara bagian atas dan bawah dengan 'o'
Michael Gruber
3
@Geek, 't' adalah untuk 'tag'. Untuk memahami 'a', Anda harus terlebih dahulu memahami 'i'. citmengubah i nterior tag - hanya konten. catmengubah suatu ll tag - isi dan sebuah LSO tag itu sendiri, baik pembukaan dan penutupan.
Edward
37

OP menyatakan bahwa apa yang benar-benar ingin ia lakukan adalah menyalin bagian XML tanpa harus menemukan tag yang cocok. Ini mudah dilakukan dalam mode normal dengan yat<motion>p, yang menarik teks di dalamnya dan termasuk tag yang cocok, lalu menempelkannya. yit<motion>phampir sama, tetapi tidak termasuk tag luar.

The 'y' dalam string tentu saja adalah mode normal "yank" perintah. ( :help y)

aatau idapat digunakan untuk pemilihan objek setelah operator seperti yatau di dalam pemilihan visual. Simbol setelah aatau imenentukan apa yang harus dipilih. Jenis objek yang tdigunakan di sini menunjukkan tag SGML. ( :help object-select).

Tentu saja <motion>hanya berarti pindah ke suatu tempat dengan pilihan Anda dan pmeletakkan teks yang ditarik di lokasi itu.

Codie CodeMonkey
sumber
isingkatan dari "inside" (atau "inner"). asingkatan dari "a"?
nilon
@nilon aadalah singkatan dari "all".
Codie CodeMonkey
Mnemonik yang saya gunakan adalah asingkatan dari sekitar . Itu lebih masuk akal bagi saya.
Kit Johnson
5

Hanya trik saya menggunakan "yank", "objek-pilih" (pilih tag) dan "lompat ke teks yang ditarik terakhir".

yit`] 

untuk melompat ke kanan sebelum tag penutup

dan

yit

untuk melompat ke kanan setelah tag pembuka

Catatan: ini akan mengubah isi register default

transang
sumber