Thêm Tô sáng cú pháp bổ sung vào nvim; không thể lấy cú pháp .config / nvim / after / để tải tệp .vim

Jan 12 2021

Tôi đang cố gắng thêm đánh dấu cú pháp bổ sung vào một plugin mà tôi đang sử dụng để làm nổi bật cú pháp. Tôi đã thử thêm tệp cú pháp bổ sung fstrings.vimvào ~/.config/nvim/after/syntaxthư mục nhưng nvim của tôi không chọn nó.

Những điều tôi đã thử:

  1. Kiểm tra xem ~/.config/nvim/aftervà / hoặc ~/.config/nvim/after/syntaxcó được thêm vào đường dẫn thời gian chạy của tôi hay không.
  • Chỉ ~/.config/nvim/afterđược thêm vào đường dẫn của tôi - được chọn bằng :set rtp>> runtimepath=~...,...,~/.config/nvim/after- tuy nhiên tôi không thấy tệp được tải vào :scriptnames. Làm cách nào để tải tệp?
  1. Thay đổi vị trí của tệp ~/.config/nvim/afterthay vì~/.config/nvim/after/syntax
  • Điều này cũng không hoạt động.
  1. Tải tệp theo cách thủ công.
  • Điều này thực sự làm công việc đáng ngạc nhiên. :set syntax=fstringsTuy nhiên, tôi có thể thay đổi cú pháp của tệp theo cách thủ công bằng cách sử dụng , tất cả phần đánh dấu cú pháp ban đầu được cung cấp bởi plugin sẽ biến mất và chỉ phần đánh dấu được cung cấp (xem câu lệnh in trong hình ảnh bên dưới) fstrings.vimđược sử dụng. Điều này khiến tôi tin rằng đường dẫn được thiết lập chính xác tuy nhiên nvim không muốn tải nó trong khi khởi động và / hoặc bỏ qua nó vì plugin đang được sử dụng.

Tôi biết /after/thư mục được sử dụng để áp dụng cài đặt sau cài đặt trước đó, thay vì ghi đè. Tôi đã thử giải pháp ở đây và ở đây nhưng tôi không thể làm cho nó hoạt động. Bất kỳ trợ giúp nào về cách gỡ lỗi này sẽ được đánh giá cao.

" ~/.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

Trả lời

1 filbranden Jan 13 2021 at 07:17

Các quy tắc cú pháp thường được đặt tên theo 'filetype'tập hợp cho bộ đệm, do đó thường được phát hiện (dựa trên phần mở rộng tệp, tên tệp hoặc nội dung tệp) và thường được đặt tự động.

Nếu bạn muốn mở rộng đánh dấu cú pháp cho Python, thì bạn thường nên đặt tên tập lệnh của mình sau "python"loại tệp.

Khi Vim tải các quy tắc cú pháp cho Python, nó sẽ áp dụng cho các tệp có tên syntax/python.vimhoặc syntax/python/*.vim(các quy tắc ftplugin cũng cho phép python_*.vim, nhưng hóa ra không phải vậy đối với cú pháp.)

Vì vậy, bạn nên đặt tên tệp của mình ~/.config/nvim/after/syntax/python.vim(hoặc ~/.config/nvim/after/syntax/python/fstrings.vim) để nó được tải cho các tệp Python và sau khi các quy tắc thời gian chạy đi kèm cho Python được tải.


Một tùy chọn khác là đặt 'syntax'tùy chọn bao gồm nhiều loại, được phân tách bằng dấu chấm. Ví dụ, :setlocal syntax=python.fstringsđầu tiên sẽ tải syntax/python.vimvà sau đó syntax/fstrings.vim. Điều này sẽ hữu ích hơn nếu bạn có một đoạn cú pháp hơi chung chung và có thể có ý nghĩa đối với nhiều ngôn ngữ riêng biệt (ví dụ: một số cú pháp tô sáng định dạng tài liệu bên trong nhận xét?) Nó có vẻ không phù hợp lắm trong trường hợp này , trong đó f-string về cơ bản là một cú pháp Python. Duy trì một 'syntax'cài đặt tách biệt với cài đặt 'filetype'này cũng có thể khó khăn, nó cần được đặt ở đúng vị trí (không quá sớm hoặc quá muộn) để tránh bị che khuất bởi cài đặt mặc định.


Trong khi khắc phục sự cố tập lệnh của bạn không được tải như vậy, bạn có thể sử dụng :scriptnameslệnh để kiểm tra xem *.vimtập lệnh của bạn có thực sự được Vim tải vào một thời điểm nào đó hay không. Lặp lại điều đó trước và sau khi mở một tệp thuộc loại tệp cụ thể mà bạn đang theo dõi để xác nhận rằng nó đã được kích hoạt bởi tính năng phát hiện loại tệp đó.