Apakah ada cara agar vim tidak menandai URL HTTP dan alamat email sebagai kesalahan pengejaan? Atau, secara lebih umum, cara daftar regex ejaan yang valid?
Apakah ada cara agar vim tidak menandai URL HTTP dan alamat email sebagai kesalahan pengejaan? Atau, secara lebih umum, cara daftar regex ejaan yang valid?
Anda dapat menambahkan aturan sintaks khusus, dan memberi mereka
@nospell
kata kunci, ini akan memberitahu Vim untuk tidak menerapkan pemeriksaan ejaan pada pencocokan sintaksis ini. Sebagai contoh:
:syn match UrlNoSpell "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell
Di atas akan berfungsi untuk file teks, dan beberapa tipe file (seperti penurunan harga), tetapi tidak untuk semua tipe file.
Perhatikan bahwa saya menggunakan regex yang cukup sederhana di sini; lihat Bagaimana cara mem-parsing URL dari teks untuk beberapa alternatif.
Untuk tipe file lain, Anda perlu melakukan lebih banyak pekerjaan. Misalnya, untuk python
file, komentar terdapat dalam pythonComment
grup, dari /usr/share/vim/vim74/syntax/python.vim
:
syn match pythonComment "#.*$" contains=pythonTodo,@Spell
Untuk mengesampingkan ini, kita perlu melakukan:
:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment
Caranya adalah dengan menambahkan daftar pertandingan sintaks sebelumnya cocok di mana pertandingan sintaks kebiasaan kami mungkin terkandung dengan containedin=
ini memberitahu Vim untuk tampilan untuk
UrlNoSpell
regex dalam satu pythonComment
pertandingan.
Kita juga perlu menggunakan highlight
untuk mengatur warna yang benar, karena ini tidak diwariskan.
Anda perlu melakukan ini di sejumlah tempat, misalnya untuk string Python:
:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String
Kami membutuhkan 2 grup pencocokan sintaks yang berbeda sehingga kami dapat menerapkan penyorotan sintaks yang benar.
Tentu saja, untuk jenis berkas lain Anda perlu menggunakan containedin=
pencocokan sintaksis lainnya ... Ada, AFAIK, tidak ada solusi "universal", tetapi mencari yang benar /usr/share/vim/vim74/syntax/*.vim
tidak boleh terlalu sulit.
Perhatikan bahwa semua perintah di atas harus dijalankan setelah file sintaks; ada 2 cara untuk melakukan ini:
Dari perintah atau pemetaan kunci, ini harus dipanggil secara manual setiap kali. misalnya
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()
Masukkan perintah ke dalam ~/.vim/after/syntax/[filetype].vim
. Vim akan mengambil file-file ini dan menjalankannya setelah file sintaks default (lihat
:help after-directory
:).
Martin Tournoij Ini dinyatakan jawaban yang sangat baik gagal untuk berperilaku seperti yang diharapkan untuk saya - mungkin karena saya leveraging diraol 's fenomenal python-mode
Plugin daripada default sintaks file Vim untuk Python.
Untuk menghindari menyoroti URI dalam komentar, string, atau python-mode
dokumen Python di bawah , tambahkan kalimat singkat berikut ini ke ~/.vim/after/syntax/python.vim
file khusus pengguna Anda :
syntax match NoSpellUriPython '\w\+:\/\/[^[:space:]]\+' transparent contained containedin=pythonComment,python.*String contains=@NoSpell
Itu dia. Yang terpenting, perhatikan bahwa ini mengompres apa yang seharusnya dua belas baris terpisah dalam jawaban Martin menjadi satu baris. Bagaimana? Dasar, Watson saya yang berbasis Vim. Kami menambah:
transparent
kunci, menginstruksikan Vim untuk mewarisi sifat highlight untuk sintaks anak ini dari sintaks induknya (misalnya, komentar, string). Ini memungkinkan kami untuk menghindari ulangan secara eksplisit highlight def link
untuk setiap kelompok sintaks anak.contained
kunci, mencegah sintaks anak ini dari melampaui batas-batas sintaks induknya (misalnya, EOL untuk komentar, pembatas string untuk string).containedin
kata kunci. The .*
Operator regex memungkinkan kita untuk cerdik mencocokkan semua kelompok sintaks Python tali (yaitu, pythonString
, pythonUniString
, pythonRawString
, pythonUniRawString
, pythonDocstring
) dengan rasa sakit yang minimal dan kompatibilitas ke depan maksimal.Meskipun secara teknis valid, vimscript yang tertanam dalam jawaban Martin melanggar prinsip KERING (Jangan Ulangi Diri Sendiri). Lihat juga jawaban serupa ini untuk perincian lebih lanjut .
Tapi tunggu ... masih ada lagi.
Saya cukup jengkel dengan pemeriksaan ejaan default yang terlalu naif baik Vim dan plugin pihak ketiga (misalnya, Spelunker , yang tanpa syarat mengecek seluruh buffer daripada hanya kode komentar dan string) yang telah saya putuskan ... untuk benar-benar melakukan sesuatu tentang itu. </gasp>
The Vim teruji potongan bawah cerdas Menghindari pemeriksaan ejaan semua berikut Python komentar dan string:
CamelCase
pengidentifikasi.snake_case
pengidentifikasi.UPPERCASE
pengidentifikasi.@
pengidentifikasi -refixed (misalnya, @muhdecorator
)."
nama file filetyped -dishedited (misalnya, "muh_module.py"
).:
substring -dimited (misalnya, :func:
di: func: `re.sub`).re.sub
di: func:` re.sub`).Tambahkan beberapa atau semua hal berikut ke ~/.vim/after/syntax/python.vim
file khusus pengguna Anda dan terkesiap senang saat Vim mengeja memeriksa RightStuff ™ untuk sekali:
" Avoid spell checking URIs.
syntax match NoSpellPythonUri /\v\w+:\/\/[^[:space:]]+/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking both CamelCase-formatted identifiers and uppercase
" identifiers. Since most languages (excluding Raku) prohibit Unicode in
" identifiers, these matches are intentionally confined to ASCII codepoints
" (e.g., "[A-Z]" rather than "[[:upper:]]").
syntax match NoSpellPythonCaps /\v<[A-Z]([A-Z0-9]{-1,}|[a-z0-9]+[A-Z0-9].{-})>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking snake_case-formatted identifiers.
syntax match NoSpellPythonSnake /\v<\w+_.{-1,}>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking "@"-prefixed identifiers.
syntax match NoSpellPythonDecorator /\v\@[a-zA-Z].{-}>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking ":"-delimited substrings.
syntax match NoSpellPythonColons /\v:[^:]+:/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking "`"-delimited substrings.
syntax match NoSpellPythonTicks /\v`[^`]+`/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking '"'-delimited filetyped filenames matched as a
" double-quoted substring containing a filename prefix, a period, and one to
" four characters comprising a filetype.
syntax match NoSpellPythonPath /\v"[^"]+.[^"]{1,4}"/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
Tentu saja, semua hal di atas dapat (dan mungkin harus) direduksi menjadi satu kalimat yang sesuai dengan ekspresi reguler seperti Godzilla yang tidak seorang pun termasuk saya akan dapat mempertahankan atau bahkan membaca. Untuk kewarasan semua orang, saya tidak melakukan itu.
Jika seseorang yang bukan saya ingin membuat plugin Vim yang dihosting GitHub yang memperluas di atas ke bahasa populer lainnya, itu akan menjadi luar biasa. Implementasi pemeriksaan ejaan default Vim hampir tiba, kawan; itu hanya membutuhkan uluran tangan dari komunitas open-source.
Sampai saat itu, semoga StackOverflow selalu bersama Anda!