Abaikan URL dan alamat email dalam file mantra

12

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?

noffle
sumber

Jawaban:

16

Anda dapat menambahkan aturan sintaks khusus, dan memberi mereka @nospellkata 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 pythonfile, 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 UrlNoSpellregex dalam satu pythonCommentpertandingan.

Kita juga perlu menggunakan highlightuntuk 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/*.vimtidak 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
sumber
3

Martin Tournoij Ini dinyatakan jawaban yang sangat baik gagal untuk berperilaku seperti yang diharapkan untuk saya - mungkin karena saya leveraging diraol 's fenomenal python-modePlugin daripada default sintaks file Vim untuk Python.

Untuk menghindari menyoroti URI dalam komentar, string, atau python-modedokumen Python di bawah , tambahkan kalimat singkat berikut ini ke ~/.vim/after/syntax/python.vimfile 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:

  • Kata transparentkunci, 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 linkuntuk setiap kelompok sintaks anak.
  • Kata containedkunci, mencegah sintaks anak ini dari melampaui batas-batas sintaks induknya (misalnya, EOL untuk komentar, pembatas string untuk string).
  • Semua grup sintaks induk dibatasi oleh koma ke containedinkata 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.

Tanpa diminta - untuk Peningkatan demi Kemuliaan Hebat

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:

  • URI (seperti di atas).
  • 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`).
  • `- substring yang telah diubah (misalnya, re.subdi: func:` re.sub`).

Tambahkan beberapa atau semua hal berikut ke ~/.vim/after/syntax/python.vimfile 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!

Cecil Curry
sumber
2
Saya agak menemukan seluruh hal yang menyoroti sintaks Vim sambil menulis jawaban di sini. Saya tidak selalu tahu apa yang saya lakukan untuk jujur, jadi terutama beberapa jawaban yang lebih tua mungkin kurang optimal 😅
Martin Tournoij
Kamu terlalu rendah hati, Martin. Tanpa jawaban "memecahkan es" Anda, saya dan banyak orang lain tidak akan tahu harus mulai dari mana. Terima kasih telah memulai pesta editor ini! Roma mungkin tidak dibangun dalam sehari, tapi setidaknya kita bisa mengeja memeriksanya dalam satu hari.
Cecil Curry