อย่างไรก็ตามหลังจากเพิ่มบรรทัดเหล่านี้ใน. vimrc แล้วมันไม่ทำงาน
สาเหตุของสิ่งนี้คือ Vim จะล้างไอเท็มไวยากรณ์ที่มีอยู่เมื่อตั้งค่า'syntax'
อ็อพชัน สิ่งนี้เกิดขึ้นเนื่องจากการรักษาไอเท็มไวยากรณ์เก่าจะนำไปสู่สถานการณ์แปลก ๆ ; ถ้าคุณมีบัฟเฟอร์ที่มีsyntax=foo
และใช้set syntax=bar
แล้วคุณจะจบลงด้วยบัฟเฟอร์ที่มีการเน้นไวยากรณ์สำหรับทั้งสอง และfoo
bar
เมื่อ Vim เริ่มทำงานจะโหลดvimrc
หนึ่งครั้ง (เมื่อเริ่มต้น) แต่จะโหลดไฟล์ประเภทและไฟล์ไวยากรณ์ทุกครั้งที่มีการตั้งค่าfiletype
หรือsyntax
ตัวเลือกซึ่งจะรีเซ็ตค่าที่คุณตั้งไว้ใน vimrc ของคุณ
แม้ว่ามันจะไม่รีเซ็ตมันจะไม่เป็นความคิดที่ดีที่จะเพียงแค่เพิ่มเข้าไปใน vimrc ของคุณเพราะมันจะนำไปใช้กับทุกบัฟเฟอร์และไม่เพียง syntax=c
แต่กับบัฟเฟอร์
ข้อความด้านล่างถือว่าเป็นกลุ่มบนระบบ Unix-y แต่มันจะใช้ได้กับผู้ใช้ Neovim และ Windows เช่นกัน:
- Neovimผู้ใช้ควรเปลี่ยนด้วย
~/.vim/
~/.config/nvim/
- ของ Windowsผู้ใช้ควรเปลี่ยนด้วย
~/.vim/
%USERPROFILE%\vimfiles\
การเอาชนะไฟล์ทั้งหมด
วิธีที่ง่ายที่สุดเพื่อสิ่งที่เปลี่ยนแปลงคือการเพียงแทนที่ ~/.vim/<file>.vim
ต้องการทำเช่นนั้นสร้างไฟล์ใน
<file.vim>
เป็นเส้นทางที่สัมพันธ์กับ$VIMRUNTIME
(รวมถึงไดเรกทอรีย่อย) syntax/c.vim
ในตัวอย่างของมันควรจะเป็น $VIMRUNTIME
มันจะถูกโหลดแทนของไฟล์ใน
ผลที่สุดของเรื่องนี้ก็คือการเปลี่ยนแปลงได้ง่ายขึ้น - การแก้ไขไฟล์ไวยากรณ์ที่ออกจากอาจเป็นเรื่องยากในบางครั้ง ข้อเสียคือคุณจะไม่ได้รับการอัพเดตใด ๆ ในอนาคตที่ทำกับไฟล์ทั่วทั้งระบบ
ฉันมักจะใช้สิ่งนี้เป็นจุดเริ่มต้นในการทดสอบกับไฟล์ไวยากรณ์และหลังจากนั้นแยกการเปลี่ยนแปลงในระบบของฉันเป็นการเพิ่มส่วนภายในโดยใช้วิธีใดวิธีหนึ่งที่อธิบายไว้ด้านล่าง
ข้อมูลเพิ่มเติมในท้องถิ่น
มีสองวิธีในการเพิ่มการเพิ่มลงในโลคัลลงในไฟล์ไวยากรณ์ซึ่งมีหน้าที่เหมือนกันและคุณสามารถใช้วิธีที่คุณต้องการ
Syntax
autocmd
ใช้Syntax
autocmd:
augroup ft_c
autocmd!
autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2
autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1
autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end
โปรดสังเกตว่าการโยงหลายคำสั่งด้วย|
เป็นปัญหาที่นี่เนื่องจากพวกเขามักจะตีความเป็นส่วนหนึ่งของ:syn
คำสั่งซึ่งเป็นสาเหตุที่ฉันซ้ำautocmd Syntax c
หลายครั้ง ทางเลือกอื่นคือใช้ฟังก์ชั่น:
fun s:c()
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1
hi cFunction gui=NONE guifg=#B5A1FF
endfun
augroup ft_c
autocmd!
autocmd Syntax c call s:c()
augroup end
ข้อดีคือการเปลี่ยนแปลงทั้งหมดสามารถอยู่ในไฟล์เดียว ข้อเสียคือมันค่อนข้างน่าเกลียดโดยเฉพาะถ้าคุณมีการเปลี่ยนแปลงมากมาย
หลังจากไดเรกทอรี
~/.vim/after/<file>.vim
ใช้ไดเรกทอรีหลัง:
สิ่งนี้จะถูกโหลดหลังจาก<file>.vim
นั้นโดยที่<file.vim>
เป็นเส้นทางที่สัมพันธ์กับ$VIMRUNTIME
(รวมถึงไดเรกทอรีย่อย) syntax/c.vim
ในตัวอย่างของมันควรจะเป็น
:help after-directory
ยังเห็น
ข้อดีคือมันสามารถอ่านได้มากกว่า autocmd โดยเฉพาะถ้าคุณมีการเปลี่ยนแปลงมากมาย ข้อเสียคือคุณจะต้องคัดลอกไฟล์เพิ่มเติมหากคุณต้องการจำลองการตั้งค่า Vim ของคุณไปยังเครื่องอื่น ๆ (นี่เป็นเหตุผลสำคัญที่หลายคนเก็บไฟล์ Vim ไว้ใน GitHub repo เพื่อให้สามารถสะท้อนข้ามเครื่องได้อย่างง่ายดาย )
~/.vim/after/syntax/c.vim
แทน