การเพิ่มเน้นไวยากรณ์เพิ่มเติมใน nvim; ไม่สามารถรับ. config / nvim / after / syntax เพื่อโหลดไฟล์. vim
ฉันกำลังพยายามเพิ่มการเน้นไวยากรณ์เพิ่มเติมให้กับปลั๊กอินที่ฉันใช้สำหรับการเน้นไวยากรณ์ ฉันได้ลองเพิ่มไฟล์ไวยากรณ์เพิ่มเติมfstrings.vim
ใน~/.config/nvim/after/syntax
โฟลเดอร์แล้ว แต่ nvim ของฉันไม่ได้หยิบมันขึ้นมา
สิ่งที่ฉันได้ลอง:
- ตรวจสอบว่ามีการเพิ่ม
~/.config/nvim/after
และ / หรือ~/.config/nvim/after/syntax
ในพา ธ รันไทม์ของฉันหรือไม่
- เพียง แต่
~/.config/nvim/after
จะมีการเพิ่มเส้นทางของฉัน - ตรวจสอบกับ:set rtp
>>runtimepath=~...,...,~/.config/nvim/after
-:scriptnames
แต่ฉันไม่เห็นไฟล์ในการโหลด ฉันจะโหลดไฟล์ได้อย่างไร?
- เปลี่ยนตำแหน่งของไฟล์
~/.config/nvim/after
แทน~/.config/nvim/after/syntax
- สิ่งนี้ใช้ไม่ได้เช่นกัน
- โหลดไฟล์ด้วยตนเอง
- นี้ที่จริงไม่ทำงานที่น่าแปลกใจ ฉันสามารถเปลี่ยนไวยากรณ์ของไฟล์ด้วยตนเองโดยใช้
:set syntax=fstrings
อย่างไรก็ตามการเน้นไวยากรณ์ดั้งเดิมทั้งหมดที่มีให้โดยปลั๊กอินจะหายไปและมีเพียงการเน้นที่มีให้ (ดูคำสั่งการพิมพ์ในภาพด้านล่าง) โดยfstrings.vim
ใช้ สิ่งนี้ทำให้ฉันเชื่อว่าเส้นทางถูกตั้งค่าอย่างถูกต้อง แต่ nvim ไม่ต้องการโหลดระหว่างการเริ่มต้นและ / หรือละเว้นเนื่องจากมีการใช้ปลั๊กอิน
ฉันรู้ว่า/after/
โฟลเดอร์นี้ใช้เพื่อใช้การตั้งค่าหลังจากการตั้งค่าก่อนหน้านี้แทนที่จะเขียนทับ ฉันได้ลองวิธีแก้ปัญหาแล้วที่นี่และที่นี่แต่ฉันไม่สามารถทำให้มันใช้งานได้ ความช่วยเหลือใด ๆ เกี่ยวกับวิธีการแก้ไขข้อบกพร่องนี้จะได้รับการชื่นชม
" ~/.config/nvim/after/syntax/fstrings.vim
syn match pythonEscape +{{+ contained containedin=pythonfString,pythonfDocstring
syn match pythonEscape +}}+ contained containedin=pythonfString,pythonfDocstring
syn region pythonfString matchgroup=pythonQuotes
\ start=+[fF]\@1<=\z(['"]\)+ end="\z1"
\ contains=@Spell,pythonEscape,pythonInterpolation
syn region pythonfDocstring matchgroup=pythonQuotes
\ start=+[fF]\@1<=\z('''\|"""\)+ end="\z1" keepend
\ contains=@Spell,pythonEscape,pythonSpaceError,pythonInterpolation,pythonDoctest
syn region pythonInterpolation contained
\ matchgroup=SpecialChar
\ start=+{{\@!+ end=+}}\@!+ skip=+{{+ keepend
\ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue,pythonDoctest
syn match pythonStringModifier /:\(.[<^=>]\)\?[-+ ]\?#\?0\?[0-9]*[_,]\?\(\.[0-9]*\)\?[bcdeEfFgGnosxX%]\?/ contained containedin=pythonInterpolation
syn match pythonStringModifier /![sra]/ contained containedin=pythonInterpolation
hi link pythonfString String
hi link pythonfDocstring String
hi link pythonStringModifier PreProc
คำตอบ
โดยทั่วไปกฎไวยากรณ์จะตั้งชื่อตาม'filetype'ชุดสำหรับบัฟเฟอร์ซึ่งโดยทั่วไปจะตรวจพบ (ตามนามสกุลไฟล์ชื่อไฟล์หรือเนื้อหาไฟล์) และโดยปกติจะตั้งค่าโดยอัตโนมัติ
หากคุณต้องการขยายการเน้นไวยากรณ์สำหรับ Python โดยทั่วไปคุณควรตั้งชื่อสคริปต์ของคุณตามประเภท"python"
ไฟล์
เมื่อ Vim โหลดกฎไวยากรณ์สำหรับ Python จะใช้สำหรับไฟล์ที่มีชื่อsyntax/python.vim
หรือsyntax/python/*.vim
(กฎ ftplugin อนุญาตpython_*.vim
เช่นกัน แต่ปรากฎว่าไม่ใช่กรณีของไวยากรณ์)
ดังนั้นคุณควรตั้งชื่อไฟล์ของคุณ~/.config/nvim/after/syntax/python.vim
(หรือ~/.config/nvim/after/syntax/python/fstrings.vim
) เพื่อให้โหลดไฟล์ Python และหลังจากโหลดกฎรันไทม์ที่รวมสำหรับ Python แล้ว
อีกทางเลือกหนึ่งคือการตั้งค่า'syntax'ตัวเลือกให้รวมหลายประเภทโดยคั่นด้วยจุด ตัวอย่างเช่น:setlocal syntax=python.fstrings
คนแรกที่จะโหลดแล้วsyntax/python.vim
syntax/fstrings.vim
สิ่งนี้จะมีประโยชน์มากขึ้นหากคุณมีไวยากรณ์ที่ค่อนข้างทั่วไปและสามารถเข้าใจได้สำหรับภาษาที่แยกจากกันหลายภาษา (ตัวอย่างเช่นไวยากรณ์บางส่วนเน้นไปที่รูปแบบเอกสารในความคิดเห็น?) ดูเหมือนว่าจะใช้ไม่ได้มากในกรณีนี้ โดยที่ f-strings เป็นไวยากรณ์ของ Python การรักษาการ'syntax'
ตั้งค่าแยกจากที่ตั้งไว้'filetype'
อาจเป็นเรื่องยุ่งยากเช่นกันต้องตั้งค่าในตำแหน่งที่ถูกต้อง (ไม่เร็วเกินไปหรือช้าเกินไป) เพื่อหลีกเลี่ยงไม่ให้รกตามการตั้งค่าเริ่มต้น
ในขณะที่แก้ไขปัญหาสคริปต์ของคุณไม่ได้โหลดคุณสามารถใช้:scriptnamesคำสั่งเพื่อตรวจสอบว่า*.vim
Vim โหลดสคริปต์ของคุณจริงหรือไม่ในบางจุด ทำซ้ำก่อนและหลังเปิดไฟล์ประเภทไฟล์ที่คุณต้องการเพื่อยืนยันว่าถูกทริกเกอร์โดยการตรวจจับประเภทไฟล์นั้น