ฉันจะเพิ่มกฎการเน้นไวยากรณ์เพิ่มเติมใน vimrc ในพื้นที่ได้อย่างไร


12

ฉันติดตั้ง gvim บนทั้ง Fedora และ Win7 ฉันพบว่าทั้ง vim และ gvim บน Fedora ไม่ได้เน้นชื่อฟังก์ชั่นในรหัส c ในขณะที่ gvim บน win7 ได้เน้นไว้

ฉันพบว่าใน win7 vim73/syntax/c.vimมีสายเพิ่มเติมในตอนท้าย:

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

ถ้าฉันเพิ่มบรรทัดเหล่านี้c.vimใน Fedora, gvim สามารถเน้นชื่อฟังก์ชั่นได้เช่นกัน

เพื่อรักษาความสะดวกในการพกพาฉันต้องการเพียงปรับเปลี่ยน.vimrcเพื่อเน้นชื่อฟังก์ชั่น อย่างไรก็ตามหลังจากเพิ่มบรรทัดเหล่านี้ลงใน.vimrcมันไม่ทำงาน

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


5
ลองเพิ่มลงไป~/.vim/after/syntax/c.vimแทน
muru

@muru ใช่มันใช้งานได้ แต่วิธีการเกี่ยวกับการเพิ่มลงใน.vimrc?
tamlok

คุณอาจจะต้องใช้สิ่งที่ต้องการแต่คุณควรเก็บไว้ในautocmd BufEnter *.c hl ... after/syntax/c.vimใด ๆ รุ่นที่ทันสมัยของกลุ่มจะเข้าใจ.vim/after/ไดเรกทอรี บน Windows เส้นทางจะเป็นvimfiles/after/...ดังนั้นการพกพาจึงไม่เป็นปัญหามากนัก (โดยเฉพาะถ้าคุณใช้ปลั๊กอิน)
muru

คำตอบ:


15

อย่างไรก็ตามหลังจากเพิ่มบรรทัดเหล่านี้ใน. vimrc แล้วมันไม่ทำงาน

สาเหตุของสิ่งนี้คือ Vim จะล้างไอเท็มไวยากรณ์ที่มีอยู่เมื่อตั้งค่า'syntax'อ็อพชัน สิ่งนี้เกิดขึ้นเนื่องจากการรักษาไอเท็มไวยากรณ์เก่าจะนำไปสู่สถานการณ์แปลก ๆ ; ถ้าคุณมีบัฟเฟอร์ที่มีsyntax=fooและใช้set syntax=barแล้วคุณจะจบลงด้วยบัฟเฟอร์ที่มีการเน้นไวยากรณ์สำหรับทั้งสอง และfoobar

เมื่อ 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

ใช้Syntaxautocmd:

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 เพื่อให้สามารถสะท้อนข้ามเครื่องได้อย่างง่ายดาย )

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