Vim เยื้องไฟล์ xml


103

ฉันกำลังเรียนรู้ Vim แต่ฉันคิดว่านี่เป็นงานง่ายๆ แต่ฉันไม่สามารถใช้งานได้ ฉันมีเบราว์เซอร์ SO แต่วิธีแก้ปัญหาไม่ได้ผลสำหรับฉัน

ฉันกำลังพยายามเยื้องไฟล์ (xml) อย่างถูกต้อง คำสั่งที่ฉันใช้คือ:

gg=G 

หรือ ggVG = (สร้างขึ้นมาเองอาจจะทำอะไรที่แตกต่างออกไป;)

. vimrc ของฉันคือ:

syntax on 
filetype plugin indent on 
set nu 

ผลลัพธ์ดั้งเดิมผลลัพธ์และผลลัพธ์ที่คาดหวังคืออะไร
Ingo Karkat

สิ่งที่การส่งออกของ:set ft? indentexpr?มันไม่ได้อ่านfiletype=xml indentexpr=XmlIndentGet(v:lnum,1)?!
Ingo Karkat

filetype = xml indentexpr = XmlIndentGet (v: lnum, 1) Yup
Haagenti


1
ฉันต้องการเพิ่มเพียงเล็กน้อยลงในแผนที่นี้และสร้างมันm'ggVG=''ขึ้นมาซึ่งจะช่วยบันทึกเส้นที่คุณอยู่และย้ายกลับไปที่แผนที่หลังจากการกลับไฟล์
Hovis Biddle

คำตอบ:


199

ฉันชอบคำตอบของ Berei อย่างไรก็ตามฉันคิดว่าสิ่งต่อไปนี้จะยืดหยุ่นกว่าเล็กน้อยโดยที่คุณไม่ต้องแก้ไขvimrcไฟล์ของคุณ นอกจากนี้ยังง่ายกว่าในการจัดรูปแบบเลือกบางส่วนของไฟล์ XML (สิ่งที่ฉันทำบ่อยมาก)

ขั้นแรกให้เน้น XML ที่คุณต้องการจัดรูปแบบ

จากนั้นในโหมดปกติให้พิมพ์ ! xmllint --format -

บรรทัดคำสั่งของคุณที่ด้านล่างจะมีลักษณะดังนี้:

:'<,'>!xmllint --format -

จากนั้นกด Enter

คำอธิบายทางเทคนิค

ข้อความที่เลือกจะถูกส่งไปยังxmllintคำสั่งตามด้วย--format'ed และผลลัพธ์ของxmllintจะถูกวางไว้เหนือข้อความที่คุณเลือกเป็นกลุ่ม -ในตอนท้ายของคำสั่งที่มีการรับเข้ามาตรฐาน - xmllintซึ่งในกรณีนี้คือข้อความที่เลือกที่เป็นกลุ่มส่งไปยัง


6
แน่นอนว่าจะใช้ได้เฉพาะเมื่อคุณติดตั้งและเพิ่มเครื่องมือภายนอก xmllint ลงในพา ธ
Polymorphix

71
เพื่อให้ง่ายต่อคำสั่ง:%!xmllint --format -, %หมายความว่าทั้งขอบเขตของไฟล์ XML นี้
hakunami

1
ทำไมทุกคนถึงคาดหวังว่าจะมีเครื่องมือ xmllint? ใน Ubuntu 15.04 ไม่มีและ apt-get ก็ไม่พบเช่นกัน
erikbwork

8
@ erikb85 ใช้apt-cache searchไม่ใช่apt-getเมื่อค้นหาแพ็คเกจและเนื้อหาแพ็คเกจ libxml2-utilsมีเครื่องมือที่ขาดหายไป
ParanoiaPuppy

@hakunami ฉันหวังว่าฉันจะโหวตให้คุณ 1,000 ครั้งเพื่อให้กระบวนการนั้นง่ายขึ้น
niken

69

ใช้โปรแกรมภายนอกเพื่อเยื้องxmlไฟล์ของคุณ ในกรณีนี้ฉันได้เลือกxmllintดังนั้นตั้งค่าคำสั่งเป็นequalprgตัวเลือก:

:set equalprg=xmllint\ --format\ -

ตอนนี้คุณสามารถดำเนินการ

gg=G

เพื่อให้จัดxmllintรูปแบบxmlไฟล์ของคุณ

เพื่อให้ได้ทุกครั้งที่ใช้ ใช้autocommandเพื่อตั้งค่า

autocommand จากความคิดเห็นด้านล่าง

au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null

ไม่แน่ใจว่าทำไมถึงใช้งานได้จึงเป็นผู้เริ่มต้น แต่ฉันจะคิดออก;) ขอบคุณที่ใช้งานได้ในขณะนี้;)
Haagenti

8
คุณสามารถใช้ต่อไปใน .vimrc ของคุณเพื่อเปิดใช้งานเมื่อมีการแก้ไขไฟล์ XML au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null- ที่มา - ku1ik.com/2011/09/08/…
studgeek

1
ขอบคุณ! ผิดหวังมากกับไฟล์ XML ขนาดใหญ่และเป็นกลุ่มใน Sublime พวกเขา reindents เร็วมาก (5,000-10000 บรรทัดและข้อมูล base64) แต่ใน Vim พวกมันจะย้อนกลับไปหลายนาที วิธีนี้แก้ไขปัญหาไฟล์ XML ขนาดใหญ่ อีกครั้งที่ฉันมีความสุขกับ Vim
Sonique

หากคุณใช้ Ubuntu คุณจะต้องติดตั้งlibxml2-utilsแพ็คเกจเพื่อรับ xmllint
hoffmanc

33

วิธีง่ายๆที่ฉันชอบซึ่งไม่ต้องใช้เครื่องมือของบุคคลที่สามคือการแทรกขึ้นบรรทัดใหม่ก่อนแท็กเปิดแต่ละแท็ก "<... >" จากนั้นคุณสามารถใช้การเยื้องอัตโนมัติเป็นกลุ่มมาตรฐาน ในระยะสั้น:

  1. %s/</\r</g
  2. gg=G เพื่อเยื้องอัตโนมัติ

ฉันได้ลองใช้ไฟล์ xml ขนาดใหญ่และใช้เวลาดำเนินการนานมาก
Luc M

ขอบคุณ. ง่ายพอและทำงานได้โดยไม่ต้องใช้เครื่องมือภายนอก
บิน

6
ฉันชอบ%s/></>\r</gเพื่อให้องค์ประกอบข้อความแต่ละรายการอยู่ในบรรทัดเดียวกัน
Nicola Musatti

2
@NicolaMusatti หรือบางครั้งมีช่องว่างระหว่างแท็ก%s/> *</>\r</g
Arthur Tacca

12

คำตอบสั้น:เปิดmatchit.vim คุณสามารถเพิ่มpackadd matchitที่คุณ.vimrcหรือใช้เป็นกลุ่ม-ที่เหมาะสมซึ่งจะช่วยให้ได้โดยเริ่มต้นที่

คำตอบยาว:ฉันได้พยายามหลายกลยุทธ์เพื่อ XML อัตโนมัติเยื้องในกลุ่มรวมทั้งวิธีการ xmllint หารือเกี่ยวกับวิกิพีเดียเป็นกลุ่ม ปัญหาของxmllint(และแนวทางเดียวกันกับเครื่องมือ CLI ภายนอกอื่น ๆ เช่นxmlformatและtidyเช่นกัน) คือพวกเขาทั้งหมดยืนยันที่จะบีบบรรทัดใหม่ที่ว่างเปล่า หากสิ่งที่คุณต้องการคือการเยื้อง XML ของคุณโดยไม่ต้องลบบรรทัดว่างความคิดเห็นและ / หรือการจัดรูปแบบโดยเจตนาอื่น ๆ ก็xmllintไม่ใช่ทางเลือกที่ดีที่สุด

ปรากฎว่าคำสั่งเท่ากับ (=) ของ Vim รองรับ XML แล้วตราบเท่าที่เปิดใช้งานสคริปต์matchit.vim วิธีการหนึ่งที่ง่ายสุดในการเปิดใช้งานคือเพื่อนำมาใช้ tpope ของกลุ่ม-เหมาะสม อีกประการหนึ่งคือการเพิ่มของคุณpackadd matchit .vimrcจากนั้นการจัดรูปแบบ XML จะ "ใช้ได้ผล" ทันที


1
เพื่อให้แม่นยำยิ่งขึ้นดูเหมือนว่าmatchit.vimเป็นวิธีแก้ปัญหาที่แท้จริง คุณสามารถเปิดใช้งานได้vimrcโดยเพิ่มบรรทัดนี้:packadd matchit
Christian Rondeau

1
ขอบคุณคริสเตียน; ฉันอัปเดตคำตอบเพื่อชี้แจงว่า matchit.vim คือสิ่งที่ช่วยแก้ปัญหาได้
ctrueden

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

1
@tohuwawohu ใช้=คำสั่ง หากคุณอยู่ที่ด้านบนสุดของไฟล์คุณสามารถพิมพ์=Gได้ อีกวิธีหนึ่งคุณสามารถไปที่ด้านบนสุดของไฟล์โดย1Gเข้าสู่โหมดเลือกเส้นภาพVจากนั้นพิมพ์Gเพื่อไปที่ด้านล่างของไฟล์เลือกทุกอย่าง จากนั้นกด=เพื่อเยื้องไฟล์ทั้งหมด =ในทำนองเดียวกันถ้าคุณเพียงต้องการที่จะเป็นส่วนหนึ่งของการเยื้องไฟล์เลือกเดียวที่เป็นส่วนหนึ่งและกด
ctrueden

1
@tohuwawohu ฉันเพิ่งรู้ว่าคุณพูดว่า "ไม่มีการแบ่งบรรทัด" =คำสั่งจะไม่แทรก (หรือลบ) แบ่งบรรทัดที่ไม่ได้อยู่แล้ว มีผลกับการเยื้องหน้าเท่านั้น ดังนั้นจึงmatchit.vimไม่ใช่วิธีแก้ปัญหาสำหรับ XML การพิมพ์แบบสวย ๆ ทั้งหมดที่รวมอยู่ในบรรทัดเดียว ใช้xmllintหรือคล้ายกันสำหรับสิ่งนั้น
ctrueden

11

ทำได้ง่ายเพียงครั้งเดียว ~ / .vimrc ได้รับการตั้งค่าอย่างถูกต้อง

ตั้งค่าตัวเลือกต่อไปนี้ใน ~ / .vimrc:

filetype indent on
set smartindent

ซึ่งจะช่วยให้คุณเลื่อนเคอร์เซอร์ไปที่ด้านบนสุดของไฟล์และเยื้องไปจนสุด: gg = G

คุณยังสามารถเลือกข้อความที่ต้องการด้วยโหมดภาพและกด = เพื่อเยื้อง


2
ฉันคิดว่ามันจะเป็นแทน.vimrc .bashrc
Birei

1
อ๊ะ. ตรง แก้ไขที่. ขอบคุณ.
jarederaj

ซึ่งจะใช้ได้ผลเมื่อทุกแท็กอยู่ในบรรทัด หาก XML ไม่มีช่องว่างหรือสิ้นสุดบรรทัดนี้จะไม่ทำอะไรเลย
JoséRamón

มันใช้ได้ผลสำหรับฉันเสมอตราบเท่าที่มาร์กอัปนั้นถูกต้อง
jarederaj

หากมาร์กอัปของคุณไม่ได้อยู่บนบรรทัดที่แตกต่างกันคุณสามารถเปลี่ยนได้อย่างไม่ระมัดระวังด้วย:% s / </ \ r </ g แล้ว:% s / \ n \ n / \ r /
jarederaj

4

ใน VIM ฉันจะเยื้องไฟล์ทั้งหมดโดยอัตโนมัติ (โดยใช้ฮาร์ดแท็บ) โดยใช้คำสั่งต่อไปนี้:

:%!XMLLINT_INDENT="^I" xmllint --format -

^Iเป็นตัวละครเดียวที่คุณสร้างผ่าน: CTRL+ v, CTRL+i


1

ผมมีปัญหาเหมือนกัน. ปรากฎว่าสาย

set viewdir=~\.vim\views\

ใน.vimrcสาเหตุของปัญหาของฉัน ตรวจสอบให้แน่ใจว่าคุณไม่มี


1

คำตอบของ Jesse Hogan นั้นดี แต่ฉันอยากจะตอบง่ายๆมากกว่านี้:

ในขณะที่คุณอยู่ในกลุ่มและไฟล์ XML ของคุณเปิดอยู่ในโหมดปกติให้เขียนสิ่งนี้:

:%!xmllint --format %

จากนั้นกด Enter ไฟล์ XML ทั้งหมดของคุณจะได้รับการจัดรูปแบบ

จำไว้ว่าคุณควรติดตั้งxmllintมาก่อน


0

สำหรับผู้ที่ใช้coc.nvimปลั๊กอินคุณสามารถติดตั้งcoc-xmlโดย:CocInstall coc-xml แล้วแมปคีย์รูปแบบในไฟล์กำหนดค่าของคุณ: nmap <silent> fm <Plug>(coc-format). จากนี้ไปคุณสามารถจัดรูปแบบไฟล์ xml ไม่เพียง แต่ไฟล์อื่น ๆ ได้ง่ายมาก

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