ข้ามไปที่การจับคู่แท็ก XML ใน Vim


140

%ตัวดำเนินการกลุ่มกระโดดข้ามการจับคู่วงเล็บข้อคิดเห็นสิ้นสุดและสิ่งอื่น ๆ อย่างไรก็ตามไม่ตรงกับแท็ก XML (หรือแท็กอื่นใดเพื่อความรู้ของฉัน)

อะไรคือวิธีที่ดีที่สุดในการข้ามไปยังแท็ก XML ที่ตรงกันโดยใช้ Vim

หมายเหตุ: สิ่งที่ฉันต้องการทำจริงๆคือทำซ้ำส่วนในไฟล์ XML โดยไม่ต้องค้นหาแท็กที่ตรงกันด้วยตนเอง


4
ในการตอบคำถามเดิม (ก่อนหน้าคำชี้แจงที่ชัดเจน) : ชุดค่าผสม v + a + tดูเหมือนจะทำให้คุณตกอยู่ที่ด้านล่างของส่วนที่เลือกด้วยภาพ อีกด้านหนึ่งของสิ่งนี้ดูเหมือนจะเป็นคำสั่ง "o" ภายในโหมดภาพซึ่งจะนำคุณไปยังจุดสิ้นสุดอื่นของการเลือกปัจจุบันของคุณ นี่เป็นเคล็ดลับที่มีประสิทธิภาพไม่เพียง แต่ในเอกสาร XML เท่านั้น แต่ยังรวมถึงเมื่อทำการแก้ไข PHP / HTML (เช่นเดียวกับตัวฉันเอง)
Justin Bell

คำตอบ:


73

มี vim plugin ที่เรียกว่า matchit.vim คุณสามารถค้นหาได้ที่นี่: http://www.vim.org/scripts/script.php?script_id=39 มันถูกสร้างขึ้นตามวัตถุประสงค์ที่คุณอธิบาย

ติดตั้งนั้นวางเคอร์เซอร์ไว้ที่ส่วนของแท็ก (ไม่ใช่ <> มิฉะนั้นจะตรงกับแท็กนั้น) แล้วกด% เพื่อข้ามไปยังแท็กอื่น ดูหน้าของสคริปต์เพื่อค้นหาสิ่งที่ตรงกัน


4
ทำได้ดีนี่. นั่งบนฮาร์ดดิสก์ตลอดเวลา
innaM

34
มี matchit บางเวอร์ชันซึ่งมาพร้อมกับ Vim แล้ว btw runtime macros/matchit.vimควรเปิดใช้งานและอนุญาตให้%จับคู่แท็ก XML
Svend

1
ดูเหมือนว่าจะเปิดใช้งาน mtchit.vim เป็นค่าเริ่มต้นใน NeoVim
James

อาจเป็นเพราะคุณมี matchit อยู่แล้ว แต่ไม่ได้เปิดใช้งานโดยค่าเริ่มต้น เพิ่มpackadd! matchitเป็น.vimrcเพื่อเปิดใช้งาน อ่านเพิ่มเติม:help matchit
ruuter

242

คุณสามารถทำได้โดยไม่มีปลั๊กอินเพิ่มเติม:

  • วางเคอร์เซอร์บนแท็ก
  • vat - จะเลือกแท็ก (ด้านนอก) และวางเคอร์เซอร์ที่ท้าย
  • เมื่อคุณได้รับสิ่งที่คุณเลือกคุณสามารถสลับระหว่างด้านบนและด้านล่างด้วยo( อัปเดตตามบันทึกของ Michael Gruber )
  • c- เปลี่ยนหรือy- คัดลอกหรือหนีออกจากโหมดภาพ ...

การดำเนินการอื่นที่มีประโยชน์คือ: vit- จะเลือกเนื้อหาของแท็ก (ภายใน)

อัปเดต (ขอบคุณ @elrado)ตัวอย่าง: vitoจะช่วยให้คุณสามารถเลือกเนื้อหาภายในของแท็กและเคอร์เซอร์ตำแหน่งที่ด้านบนของข้อความที่เลือก

การอ้างอิง: /superuser/182355/how-can-i-select-an-html-tags-content-in-vim

การอ้างอิงเป็นกลุ่ม (ขอบคุณ @Geek สำหรับการสังเกตสิ่งนี้):

:help visual-operators

คุณจะได้รับ:

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
ฉันต้องการข้ามไปยังแท็กไม่ใช่ "เลือก" เนื้อหาที่แนบมา และถ้าฉันสามารถทำได้ด้วยการกดปุ่ม 1 หรือ 2 ครั้งทำไมฉันจะกดปุ่ม 5 ครั้งทุกครั้งที่ฉันต้องการเลือกแท็ก (ซึ่งเกิดขึ้นบ่อยครั้ง)
kumarharsh

2
ยินดีที่มีวิธีการติดตั้งในตัวแม้ว่าจะมีวิธีการที่ซับซ้อนในการข้ามไปยังแท็กปิด การอ้อมผ่านโหมดภาพเป็นวิธีเดียวที่จะไปถึงที่นั่นได้หรือไม่?
Mu Mind

2
ศักดิ์สิทธิ์คุณสามารถเรียนรู้สิ่งใหม่ ๆ ด้วย Vim ได้เสมอ! มีอะไรมากมายให้เรียนรู้สิ่งนี้ช่วยฉันได้มากขอบคุณ!
gosukiwi

23
ที่ควรทราบ: เมื่อคุณได้รับการเลือกของคุณคุณสามารถสลับระหว่างด้านบนและด้านล่างด้วย 'o'
Michael Gruber

3
@Geek 't' สำหรับ 'แท็ก' เพื่อทำความเข้าใจ 'a' คุณต้องเข้าใจ 'i' ก่อน citเปลี่ยนi nront ของแท็ก - เฉพาะเนื้อหา catเปลี่ยนLL ของแท็ก - เนื้อหาและLSO แท็กของตัวเองทั้งเปิดและปิด
Edward

37

OP ระบุว่าสิ่งที่เขาต้องการทำจริงๆคือคัดลอกส่วนของ XML โดยไม่ต้องค้นหาแท็กที่ตรงกัน สิ่งนี้ทำได้ง่ายในโหมดปกติด้วยyat<motion>pซึ่งจะดึงข้อความภายในและรวมถึงแท็กที่ตรงกันจากนั้นจึงวาง yit<motion>pเกือบเหมือนกัน แต่ไม่มีแท็กด้านนอก

'y' ในสตริงนั้นแน่นอนว่าคำสั่ง "yank" ในโหมดปกติ ( :help y)

aหรือiสามารถใช้สำหรับการเลือกวัตถุหลังจากผู้ประกอบการเช่นyหรือภายในการเลือกภาพ สัญลักษณ์หลังaหรือiระบุสิ่งที่ควรเลือก ประเภทวัตถุที่tใช้ที่นี่บ่งชี้ว่าแท็ก SGML ( :help object-select)

แน่นอน<motion>ว่าหมายถึงการย้ายที่ใดที่หนึ่งโดยใช้วิธีที่คุณเลือกและpวางข้อความที่ดึงไว้ในตำแหน่งนั้น


iย่อมาจาก "Inside" (หรือ "Inner") aย่อมาจาก "a"?
nilon

@nilon aหมายถึง "all"
Codie CodeMonkey

การใช้งานที่ฉันจำคือว่าaย่อมาจากรอบ ๆ มันสมเหตุสมผลมากกว่าสำหรับฉัน
Kit Johnson

5

เพียงกลอุบายของฉันในการใช้ "ดึง", "เลือกวัตถุ" (เลือกแท็ก) และ "ข้ามไปยังข้อความกระชากสุดท้าย"

yit`] 

เพื่อข้ามไปทางขวาก่อนปิดแท็ก

และ

yit

เพื่อข้ามไปทางขวาหลังจากเปิดแท็ก

หมายเหตุ: สิ่งนี้จะเปลี่ยนเนื้อหาของการลงทะเบียนเริ่มต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.