Câu trả lời:
Bạn có thể thêm quy tắc cú pháp tùy chỉnh và cung cấp cho họ
@nospell
từ khóa, điều này sẽ cho Vim không áp dụng kiểm tra chính tả cho cú pháp khớp này. Ví dụ:
:syn match UrlNoSpell "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell
Ở trên sẽ làm việc cho các tệp văn bản và một số kiểu tệp (chẳng hạn như đánh dấu), nhưng không phải cho tất cả các kiểu tệp.
Lưu ý rằng tôi đã sử dụng một regex khá đơn giản ở đây; xem Làm cách nào để phân tích URL từ văn bản cho một số lựa chọn thay thế.
Đối với các kiểu tệp khác, bạn cần thực hiện thêm một chút công việc. Ví dụ: đối với python
các tệp, các nhận xét được chứa trong một pythonComment
nhóm, từ /usr/share/vim/vim74/syntax/python.vim
:
syn match pythonComment "#.*$" contains=pythonTodo,@Spell
Để ghi đè lên điều này, chúng ta cần làm:
:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment
Bí quyết là để thêm một danh sách kết quả cú pháp xuất hiện trước đây, trong đó tùy chỉnh phù hợp với cú pháp của chúng tôi có thể được kiềm chế bằng containedin=
này cho Vim để nhìn cho
UrlNoSpell
regex trong các pythonComment
trận đấu.
Chúng ta cũng cần sử dụng highlight
để đặt màu chính xác, vì những màu này không được kế thừa.
Bạn cần thực hiện việc này ở một số nơi, ví dụ như chuỗi Python:
:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String
Chúng tôi cần 2 nhóm kết hợp cú pháp khác nhau để có thể áp dụng tô sáng cú pháp chính xác.
Tất nhiên, đối với các filestypes khác, bạn cần sử dụng các containedin=
kết hợp cú pháp khác ... Có, AFAIK, không có giải pháp "phổ quát", nhưng tìm kiếm những cái chính xác trong /usr/share/vim/vim74/syntax/*.vim
không nên quá khó.
Lưu ý rằng tất cả các lệnh trên phải được thực hiện sau các tệp cú pháp; Có 2 cách để làm điều này:
Từ một lệnh hoặc ánh xạ khóa, điều này phải được gọi thủ công mỗi lần. ví dụ
fun! NoUrlSpell()
if &filetype == 'python'
:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment
:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String
elseif &filetype == 'ruby'
" ...
else
syn match pythonComment "#.*$" contains=pythonTodo,@Spell
endif
endfun
command NoUrlSpell :call NoUrlSpell()
Đặt các lệnh trong ~/.vim/after/syntax/[filetype].vim
. Vim sẽ chọn các tệp này và thực hiện chúng sau các tệp cú pháp mặc định (xem
:help after-directory
:).