Bagaimana saya bisa menambahkan aturan penyorotan sintaks tambahan di vimrc lokal saya?

11

Saya menginstal gvim pada Fedora dan Win7. Saya menemukan bahwa baik vim dan gvim pada Fedora tidak menyorot nama fungsi dalam kode c sementara gvim pada win7 memang menyorotnya.

Saya menemukan bahwa pada win7, vim73/syntax/c.vimmemiliki baris tambahan di akhir:

syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
hi cFunction gui=NONE guifg=#B5A1FF

Jika saya menambahkan baris-baris ini ke dalam c.vimpada Fedora, gvim juga dapat menyorot nama fungsi.

Untuk menjaga portabilitas, saya hanya ingin memodifikasi .vimrcuntuk menyorot nama fungsi. Namun setelah menambahkan garis-garis ini ke dalam .vimrc, itu tidak berhasil.

Jadi, adakah yang bisa membantu saya? Saya melakukan pencarian dan ada banyak solusi untuk menyorot nama fungsi di vim. Tapi saya hanya ingin tahu bagaimana membuat garis-garis ini bekerja .vimrc. Terima kasih banyak!

tamlok
sumber
5
Coba tambahkan itu ~/.vim/after/syntax/c.vimsebagai gantinya.
muru
@uru Ya, itu berhasil. Tapi bagaimana dengan menambahkannya .vimrc?
tamlok
Anda mungkin harus menggunakan sesuatu seperti autocmd BufEnter *.c hl ..., tetapi Anda harus menyimpannya after/syntax/c.vim. Setiap versi modern Vim akan memahami .vim/after/direktori. Pada Windows, jalurnya akan jadi vimfiles/after/..., portabilitas seharusnya tidak menjadi masalah (terutama jika Anda menggunakan plugin apa pun).
muru

Jawaban:

14

Namun setelah menambahkan baris-baris ini ke .vimrc, tidak berfungsi.

Alasan untuk ini adalah bahwa Vim menghapus item sintaks yang ada saat mengatur 'syntax'opsi. Ini dilakukan karena menyimpan item sintaksis lama akan menyebabkan beberapa situasi aneh; jika Anda memiliki buffer yang memiliki syntax=foodan menggunakan set syntax=barmaka Anda akan berakhir dengan buffer yang memiliki penyorotan sintaks untuk keduanya foo dan bar.

Ketika Vim mulai memuat Anda vimrcsekali (saat startup), tetapi memuat filetype dan file sintaks setiap kali opsi filetypeatau syntaxdiatur, yang akan mengatur ulang nilai yang telah Anda atur di vimrc Anda.

Bahkan jika itu tidak mengatur ulang, itu bukan ide yang baik untuk hanya menambahkannya ke vimrc Anda, karena itu akan berlaku untuk semua buffer, dan bukan hanya buffer dengan syntax=c.


Teks di bawah ini mengasumsikan Vim pada sistem Unix-y, tetapi juga akan berfungsi untuk pengguna Neovim dan Windows:

  • Pengguna Neovim harus mengganti ~/.vim/dengan ~/.config/nvim/.
  • Pengguna Windows harus mengganti ~/.vim/dengan %USERPROFILE%\vimfiles\.

Mengganti seluruh file

Cara termudah untuk mengubah sesuatu adalah menimpanya . Untuk melakukannya, buat file di ~/.vim/<file>.vim.

<file.vim>adalah jalur relatif ke $VIMRUNTIME(termasuk subdirektori). Dalam contoh Anda, seharusnya syntax/c.vim. Ini akan dimuat bukan file di $VIMRUNTIME.

Hasilnya adalah lebih mudah untuk membuat perubahan - mengubah file sintaks yang keluar kadang-kadang sedikit rumit. Kelemahannya adalah Anda tidak akan mendapatkan pembaruan di masa depan untuk file sistem-lebar.

Saya sering menggunakan ini sebagai titik awal untuk bereksperimen dengan file sintaks, dan kemudian mengekstrak perubahan lokal saya ke penambahan lokal menggunakan salah satu metode yang dijelaskan di bawah ini.

Penambahan lokal

Ada dua cara untuk menambahkan tambahan lokal ke file sintaksis, mereka secara fungsional identik, dan Anda dapat menggunakan metode yang Anda inginkan.

Syntax autocmd

Gunakan Syntaxautocmd:

augroup ft_c
    autocmd!
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end

Perhatikan bahwa chaining beberapa perintah dengan |bermasalah di sini, karena mereka cenderung ditafsirkan sebagai bagian dari :synperintah, itulah sebabnya saya mengulangi autocmd Syntax cbeberapa kali. Alternatifnya adalah menggunakan fungsi:

fun s:c()
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    hi cFunction gui=NONE guifg=#B5A1FF
endfun

augroup ft_c
  autocmd!
  autocmd Syntax c call s:c()
augroup end

Keuntungannya adalah bahwa semua perubahan dapat dimasukkan ke satu file. Kerugiannya adalah itu agak jelek, terutama jika Anda memiliki banyak perubahan.

setelah direktori

Menggunakan direktori setelah-: ~/.vim/after/<file>.vim.

Ini akan dimuat setelah <file>.vimhas, di mana <file.vim>path relatif ke $VIMRUNTIME(termasuk subdirektori). Dalam contoh Anda, seharusnya syntax/c.vim.

Lihat juga :help after-directory.

Keuntungannya adalah itu sedikit lebih mudah dibaca daripada autocmd, terutama jika Anda memiliki banyak perubahan. Kerugiannya adalah Anda harus menyalin file tambahan jika Anda ingin mirror setup Vim Anda ke mesin yang berbeda (ini adalah alasan penting banyak orang menyimpan file Vim mereka dalam repo GitHub, sehingga dapat dengan mudah dicerminkan di mesin lain ).

Martin Tournoij
sumber