Coba fungsi ini:
function! SignKeyword()
silent! sign undefine todo
sign define todo text=>> texthl=Search
g/\v\C(<TODO>|<FIXME>)/execute "sign place 9999 line=" . line('.')
\ . " name=todo buffer=" . bufnr('')
nohlsearch
endfunction
Sekarang panggil fungsi pada baris perintah:
:call SignKeyword()
Atau tambahkan pemetaan ~/.vimrc
untuk menyebutnya:
nnoremap <your mapping> :call SignKeyword()<cr>
Atau tambahkan autocmd. Sebagai contoh jika Anda ingin fungsi dipanggil secara otomatis ketika membuka file yang jenis filenya adalah penurunan harga:
autocmd FileType markdown call SignKeyword()
Baris pertama dari fungsi silent! sign undefine todo
menghapus tanda todo jika sudah ada, sehingga jika tanda Anda salah tempat setelah menghapus atau menambahkan garis, Anda dapat memanggil fungsi untuk segera memperbaikinya.
Baris kedua mendefinisikan tanda yang namanya todo, yang teksnya >>
(Anda dapat mengubahnya agar sesuai dengan preferensi Anda) dan yang menggunakan grup yang menyoroti Pencarian (hal yang sama).
Baris ketiga menggunakan perintah global:
:g/pattern/command
Perintah global menjalankan perintah pada setiap baris yang cocok dengan suatu pola.
Di sini polanya adalah \v\C(<TODO>|<FIXME>)
, yang berarti setiap baris yang mengandung kata TODO atau FIXME .
Regex menyertakan atom \C
sehingga pencarian menghormati case (tidak peduli apa pilihan 'ignorecase' Anda). Jika Anda ingin pencarian tidak menghargai kasing, ubah ke \c
.
Kapanpun baris tersebut ditemukan, baris berikut dijalankan oleh fungsi:
execute "sign place 9999 line=" . line('.')
\ . " name=todo buffer=" . bufnr('')
Ini mengeksekusi (dengan :execute
perintah) konten dari string berikut:
"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')
String mencakup dua fungsi built-in vim: line()
dan bufnr()
.
line('.')
mengembalikan jumlah baris saat ini ketika kecocokan ditemukan oleh perintah global, dan bufnr('.')
mengembalikan jumlah buffer saat ini.
Jadi misalnya, jika perintah global menemukan kecocokan pada baris 10 di buffer 5, itu akan memberikan:
"sign place 9999 line=" . 10 . " name=todo buffer=" . 5
Titik-titik menggabungkan string, dan akhirnya akan dievaluasi untuk:
"sign place 9999 line=10 name=todo buffer=5"
Yang merupakan :sign
perintah menempatkan tanda pada baris 10 di buffer 5.
9999 adalah id acak yang dipilih untuk tanda (Anda dapat memilih yang lain).
Baris keempat fungsi :nohlsearch
menonaktifkan sorotan dari pola yang cocok.
Sunting: Saya memperbaiki regex, yang asli salah. Saya menulis ^[TODO|FIXME]
tetapi saya pikir itu seharusnya \v\C(<TODO>|<FIXME>)
. Maaf atas ketidaknyamanan ini, saya masih belajar vimscript.
TODO
komentar telah dihapus?todo
tanda, tetapi namun hanya memperhatikan bahwa menghapus garis tanda dihapus, jadi tidak apa-apasilent! sign undefine todo
. Ini menghapus tanda todo jika sudah ada, sehingga jika tanda Anda salah tempat setelah menghapus baris yang mengandung kata kunci TODO atau FIXME, Anda dapat memanggil kembali fungsi untuk memperbaikinya segera.^[TODO|FIXME]
tetapi sebaliknya seharusnya\v(TODO|FIXME)
. Regex baru akan cocok dengan baris yang berisi salah satu kata kunci tetapi bukan awal baris, karena saya kira baris dapat berisi beberapa kode sebelum komentar misalnya seperti inisome code # FIXME this line needs to be fixed
. Regex sebelumnya benar-benar salah, maaf atas ketidaknyamanan ini, saya masih belajar vimscript ...Anda dapat menggunakan plugin DynamicSigns saya . Ini memungkinkan untuk apa yang disebut "SignExpression" yang mirip dengan ekspresi lipatan.
Jadi Anda bisa melakukannya
:SignExpression getline(v:lnum)=~'TODO'?'Warning':0
Baca bantuan untuk mengetahui lebih banyak tentang apa yang mungkin terjadi.
Keuntungan menggunakan plugin saya adalah, ia melacak perubahan buffer dan menyesuaikan tanda-tanda yang sesuai.
sumber