การเพิ่มเน้นไวยากรณ์เพิ่มเติมใน nvim; ไม่สามารถรับ. config / nvim / after / syntax เพื่อโหลดไฟล์. vim

Jan 12 2021

ฉันกำลังพยายามเพิ่มการเน้นไวยากรณ์เพิ่มเติมให้กับปลั๊กอินที่ฉันใช้สำหรับการเน้นไวยากรณ์ ฉันได้ลองเพิ่มไฟล์ไวยากรณ์เพิ่มเติมfstrings.vimใน~/.config/nvim/after/syntaxโฟลเดอร์แล้ว แต่ nvim ของฉันไม่ได้หยิบมันขึ้นมา

สิ่งที่ฉันได้ลอง:

  1. ตรวจสอบว่ามีการเพิ่ม~/.config/nvim/afterและ / หรือ~/.config/nvim/after/syntaxในพา ธ รันไทม์ของฉันหรือไม่
  • เพียง แต่~/.config/nvim/afterจะมีการเพิ่มเส้นทางของฉัน - ตรวจสอบกับ:set rtp>> runtimepath=~...,...,~/.config/nvim/after- :scriptnamesแต่ฉันไม่เห็นไฟล์ในการโหลด ฉันจะโหลดไฟล์ได้อย่างไร?
  1. เปลี่ยนตำแหน่งของไฟล์~/.config/nvim/afterแทน~/.config/nvim/after/syntax
  • สิ่งนี้ใช้ไม่ได้เช่นกัน
  1. โหลดไฟล์ด้วยตนเอง
  • นี้ที่จริงไม่ทำงานที่น่าแปลกใจ ฉันสามารถเปลี่ยนไวยากรณ์ของไฟล์ด้วยตนเองโดยใช้: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

คำตอบ

1 filbranden Jan 13 2021 at 07:17

โดยทั่วไปกฎไวยากรณ์จะตั้งชื่อตาม'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คำสั่งเพื่อตรวจสอบว่า*.vimVim โหลดสคริปต์ของคุณจริงหรือไม่ในบางจุด ทำซ้ำก่อนและหลังเปิดไฟล์ประเภทไฟล์ที่คุณต้องการเพื่อยืนยันว่าถูกทริกเกอร์โดยการตรวจจับประเภทไฟล์นั้น