Chuyển đến các thẻ XML phù hợp trong Vim


140

%Toán tử Vim nhảy đến khớp ngoặc, kết thúc bình luận và một vài thứ khác. Tuy nhiên, nó không khớp với các thẻ XML (hoặc bất kỳ thẻ nào khác, theo sự hiểu biết tốt nhất của tôi).

Cách tốt nhất để chuyển sang thẻ XML phù hợp bằng Vim là gì?

Lưu ý: Điều tôi thực sự muốn làm là sao chép một phần trong tệp XML mà không cần tìm kiếm thẻ phù hợp theo cách thủ công.


4
Khi giải quyết câu hỏi ban đầu (trước Ghi chú làm rõ :), kết hợp v + a + t dường như thả bạn xuống cuối lựa chọn trực quan. Mặt khác của điều này dường như là lệnh "o" trong chế độ trực quan, đưa bạn đến đầu cuối thay thế của lựa chọn hiện tại của bạn. Đây là một thủ thuật hiệu quả không chỉ trong các tài liệu XML mà cả khi chỉnh sửa PHP / HTML (như đã xảy ra đối với bản thân tôi).
Justin Bell

Câu trả lời:


73

Có một plugin vim gọi là matchit.vim. Bạn có thể tìm thấy nó ở đây: http://www.vim.org/scripts/script.php?script_id=39 . Nó được tạo ra khá nhiều mục đích chính xác mà bạn mô tả.

Cài đặt nó, đặt con trỏ của bạn trên thân thẻ (không phải <>, nếu không nó sẽ khớp với các thẻ đó) và nhấn% để chuyển sang thẻ khác. Xem trang của tập lệnh để tìm hiểu những gì nó phù hợp.


4
Đẹp một. Đã ngồi trên đĩa cứng của tôi tất cả các thời gian.
innaM

34
Có một số phiên bản matchit, được phát hành với Vim đã btw. runtime macros/matchit.vimnên kích hoạt nó và cho phép %khớp các thẻ XML.
Svend

1
mtchit.vim dường như được bật theo mặc định trong NeoVim.
James

Có thể bạn đã có matchit, nhưng không được bật theo mặc định. Thêm packadd! matchitvào .vimrcđể kích hoạt nó. Đọc thêm:help matchit
ruuter

241

Bạn có thể làm điều này mà không cần bổ sung:

  • đặt con trỏ trên thẻ
  • vat - sẽ chọn thẻ (bên ngoài) và đặt con trỏ ở cuối
  • một khi bạn đã có lựa chọn của mình, bạn có thể chuyển đổi giữa đỉnh và đáy o( cập nhật dựa trên ghi chú của Michael Gruber )
  • c- thay đổi hoặc, y- sao chép hoặc thoát khỏi chế độ trực quan ...

Một thao tác hữu ích khác là: vit- sẽ chọn nội dung của thẻ (bên trong).

Cập nhật (nhờ @elrado) Ví dụ: vitosẽ cho phép bạn chọn nội dung bên trong của thẻ và con trỏ vị trí ở đầu văn bản đã chọn.

Tham khảo: /superuser/182355/how-can-i-select-an-html-tags-content-in-vim

Tham khảo Vim (cảm ơn @Geek đã lưu ý điều này):

:help visual-operators

bạn sẽ nhận được:

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|
    ...

1
Tôi muốn chuyển đến một thẻ, không "chọn" nội dung kèm theo. Và nếu tôi có thể làm điều đó với 1 hoặc 2 lần nhấn phím, tại sao tôi sẽ thực hiện 5 lần nhấn phím mỗi lần tôi muốn chọn một thẻ? (thực sự xảy ra RẤT NHIỀU lần)
kumarharsh

2
Rất vui vì có một cách tích hợp, mặc dù một cách phức tạp, để nhảy đến thẻ đóng. Là đi đường vòng qua chế độ trực quan là cách duy nhất để đến đó?
Mu Tâm

2
Holy molly, bạn luôn học hỏi những điều mới với Vim! Có quá nhiều thứ để học, điều này đã giúp tôi rất nhiều, cảm ơn!
gosukiwi

23
Chỉ cần lưu ý: một khi bạn đã có lựa chọn của mình, bạn có thể chuyển đổi giữa đỉnh và đáy bằng 'o'
Michael Gruber

3
@Geek, 't' là cho 'thẻ'. Để hiểu 'a' trước tiên bạn phải hiểu 'i'. citthay đổi thứ i của thẻ - chỉ nội dung. catthay đổi một ll của thẻ - nội dung và một lso thẻ chính nó, cả hai khai mạc và bế mạc.
Edward

37

OP tuyên bố rằng những gì anh ta thực sự muốn làm là sao chép một phần của XML mà không phải tìm thẻ phù hợp. Điều này được thực hiện dễ dàng trong chế độ bình thường với yat<motion>p, bao gồm văn bản bên trong và bao gồm các thẻ phù hợp, sau đó dán nó. yit<motion>pgần như giống nhau, nhưng nó không bao gồm các thẻ bên ngoài.

'Y' trong chuỗi dĩ nhiên là lệnh "yank" chế độ bình thường. ( :help y)

ahoặc icó thể được sử dụng để lựa chọn đối tượng sau một toán tử như yhoặc bên trong một lựa chọn trực quan. Biểu tượng sau ahoặc ichỉ định những gì nên được chọn. Loại đối tượng tđược sử dụng ở đây chỉ ra thẻ SGML. ( :help object-select).

Tất nhiên <motion>chỉ có nghĩa là di chuyển đi đâu đó bằng phương tiện bạn chọn và pđặt văn bản được kéo dài ở vị trí đó.


ilà viết tắt của "bên trong" (hoặc "bên trong"). alà viết tắt của "a"?
nilon

@nilon alà viết tắt của "tất cả".
Codie CodeMonkey

Bản ghi nhớ tôi sử dụng là aviết tắt của xung quanh . Nó có ý nghĩa hơn với tôi.
Kit Johnson

5

Chỉ cần mẹo của tôi là sử dụng "yank", "object-select" (chọn thẻ) và "nhảy đến văn bản được kéo dài cuối cùng".

yit`] 

nhảy sang phải trước khi đóng thẻ

yit

nhảy sang phải sau khi mở thẻ

Lưu ý: điều này sẽ thay đổi nội dung của thanh ghi mặc định

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.