การเยื้องไม่ถูกต้องเมื่อแก้ไข Yaml ใน Vim


92

ดูเหมือนว่ากลุ่มจะไม่ตอบสนองอย่างถูกต้องที่สัญลักษณ์ขีดในไฟล์ YAML ดังนั้นจึงทำลายรูปแบบ

ตัวอย่างเช่นฉันมีบล็อกที่ควรมีลักษณะดังนี้:

  handlers:
        - name: restart exim4
          service: name=exim4 state=restarted

เมื่อฉันพิมพ์เสร็จrestart exim4และพิมพ์service:Vim reindents serviceบรรทัดสุดท้ายของฉัน:

  handlers:
        - name: restart exim4
        service: name=exim4 state=restarted

เห็นได้ชัดว่า Vim พยายามจัดแนวประโยคให้เป็นคอลัมน์แต่นั่นไม่ใช่สิ่งที่จำเป็นใน YAML ฉันต้องการสร้างอาร์เรย์ที่มีสองค่า

จะแก้ไขได้อย่างไร?

คำตอบ:


25

ติดตั้งปลั๊กอินนี้:

https://github.com/chase/vim-ansible-yaml

มันถูกสร้างขึ้นโดยคำนึงถึง Ansible แต่ในทางทฤษฎีมันจะใช้ได้กับไฟล์ YAML ทุกประเภท คุณจะต้อง: set filetype = ansible น่าเสียดายถ้าคุณไม่ได้ทำงานกับไฟล์ที่เกี่ยวข้อง ansible


ฉันเห็นปลั๊กอินนี้ - คาดว่าชื่อไฟล์จะมีชื่อที่แน่นอนและ / หรืออยู่ในโฟลเดอร์เฉพาะ Ansible playbooks ไม่ใช่ไฟล์เดียวที่ฉันแก้ไข นั่นเป็นเหตุผลที่ฉันไม่ได้ลองติดตั้ง ขอบคุณฉันจะตั้งค่า yml ให้เป็นประเภท "ansible"
Glueon

1
ว้าวสร้างความแตกต่างอย่างมากฉันคิดว่าแม้ว่าyamlไวยากรณ์ปกติก็ควรค่าแก่การแก้ไขเช่นกัน
akostadinov

ความจริงถ้าคุณไปเส้นทางนี้คุณต้องใส่# vim:ft=ansible:ไฟล์ที่ไม่สามารถตอบได้ทั้งหมดของคุณ
Elijah Lynn

170

เพื่อให้ได้ YAML 2 ช่องว่างที่ดีเป็นค่าเริ่มต้นเมื่อฉันกด carriage return หลังเครื่องหมายโคลอนฉันเพิ่มสิ่งนี้ใน.vimrc:

autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab

นอกจากนี้ยังเล่นได้ดีกับเส้นประสำหรับผลลัพธ์ที่คาดหวังของ OP


3
ขอบคุณมันทำงาน
Gayan Weerakutti

5
ลองใส่ใน ~ / vim / ftplugin / yaml.vim และแทนที่ชื่อสั้น ๆ ด้วยชื่อยาวเพื่อให้อ่านได้ในอนาคต
exic

3
@LeviNoecker ใช่แค่ลูกน้ำแยกพวกเขาแบบนี้autocmd FileType yaml,yml setlocal ...
Trey Stout

2
เพื่อให้ได้ผลฉันต้องมีfiletype plugin indent onก่อน นอกจากนี้ยังมีสัมผัสที่ดีที่จะมีsyntax onก่อนหน้านั้น
Elijah Lynn

4
นี่คือผลรวมของความคิดเห็นของฉันด้านบน -> gist.github.com/dragonken/c29123e597c6fdf022284cf36d245b64
Elijah Lynn

20

คุณสามารถปิดการใช้งาน reindent ได้เมื่อคุณพิมพ์:คีย์:

:set indentkeys-=<:>

โปรดแก้ไข~/.vimrcไฟล์และเพิ่มบรรทัดเหล่านี้:

filetype plugin indent on
autocmd FileType yaml setl indentkeys-=<:>

หมายเหตุ: มาหลังจากautocmdfiletype


คุณสามารถทริกเกอร์การย้อนกลับได้โดยพิมพ์CTRL-FในโหมดINSERTตัวอย่างเช่น:

hello: world
    foo: bar<C-F>

11

คุณสามารถใช้คำสั่งอัตโนมัตินี้เพื่อสร้าง Vim เยื้องไฟล์ YAML อย่างถูกต้อง (ใส่ไว้ในไฟล์ของคุณ.vimrc):

" Fix auto-indentation for YAML files
augroup yaml_fix
    autocmd!
    autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab indentkeys-=0# indentkeys-=<:>
augroup END

โดยทั่วไปสำหรับไฟล์ YAML จะสั่งให้ Vim:

  • ใช้ช่องว่าง 2 ช่องสำหรับการเยื้อง
  • ใช้ช่องว่างแทนแท็บ
  • ข้ามบรรทัดการเยื้องซ้ำหลังจากแทรกอักขระข้อคิดเห็น ( #) ที่จุดเริ่มต้นของบรรทัดหรือโคลอน

การเพิ่ม .yml ยังช่วยได้
เกิร์ตแวนเดนเบิร์ก

คืออะไร? ที่ไหน?
mr.zog

3

คุณสามารถเพิ่มความคิดเห็นใน YAML ของคุณเพื่อบอก Vim config พิเศษสำหรับไฟล์นี้ ตัวอย่างเช่น:

# vim: set shiftwidth=2 tabstop=2 softtabstop=-1 expandtab:
foo:
  bar:
  - a
  - b

จากนั้นทุกคนที่ใช้ไฟล์นี้กับกลุ่มเริ่มต้นจะสามารถแชร์การกำหนดค่าของผู้สร้างไฟล์ได้ ทำงานได้ดีโดยเฉพาะเมื่อร่วมมือกัน


1

นี่คือสิ่งที่augroupฉันมีสำหรับมันแกว:

augroup filetype_yaml
    autocmd!
    autocmd BufNewFile,BufReadPost *.{yaml,yml} set filetype=yaml foldmethod=indent
    autocmd FileType yaml |
        setlocal shiftwidth=2 |
        setlocal softtabstop=2 |
        setlocal tabstop=2
augroup END

0

ฉันพบว่าhttps://github.com/stephpy/vim-yamlทำงานได้ดี เป็นปลั๊กอินกลุ่มที่ทำหน้าที่เยื้อง (และเน้นไวยากรณ์) ของไฟล์ yaml การติดตั้งจะช่วยแก้ปัญหาเฉพาะที่คุณถามได้เช่นกัน

คุณต้องติดตั้งปลั๊กอิน (ดู doco ใน GitHub repo) และตราบใดที่filetype=yamlมันจะแก้ไขการเยื้องของคุณ มันจะช่วยคุณทั้งคู่

  1. ขณะที่คุณพิมพ์ตัวอย่างข้อมูลที่คุณให้ไว้หรือ
  2. หากคุณมี yaml เขียนอยู่แล้วคุณสามารถเลือกได้ ( Vสำหรับการเลือกแบบเส้นจากนั้นใช้jหรือkเพื่อเลือกบรรทัดเพิ่มเติม) จากนั้นเรียกใช้การจัดรูปแบบกลุ่มด้วย=
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.