Apakah mungkin untuk menetapkan tanda ke grup "Todo"?

9

Apakah mungkin untuk menambahkan tanda untuk ditampilkan di kolom tanda setiap kali baris memiliki grup ToDo (ToDo, FIXME ...).

Tweaking colorscheme saya, saya mengubah sorot kelompok Todo, tetapi ingin memiliki indikator di kolom tanda-tanda, seperti kesalahan dan peringatan Syntastic.


sumber

Jawaban:

9

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 ~/.vimrcuntuk 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 todomenghapus 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 \Csehingga 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 :executeperintah) 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 :signperintah menempatkan tanda pada baris 10 di buffer 5.
9999 adalah id acak yang dipilih untuk tanda (Anda dapat memilih yang lain).


Baris keempat fungsi :nohlsearchmenonaktifkan 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.

saginaw
sumber
1
bagaimana cara menghapus tanda setelah TODOkomentar telah dihapus?
1
bukan itu yang saya harapkan, karena itu menghapus semua todotanda, tetapi namun hanya memperhatikan bahwa menghapus garis tanda dihapus, jadi tidak apa-apa
1
Ok, saya telah menambahkan baris ini di awal fungsi: silent! 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.
Saginaw
2
Regex itu salah, saya mengetik ^[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 ini some code # FIXME this line needs to be fixed. Regex sebelumnya benar-benar salah, maaf atas ketidaknyamanan ini, saya masih belajar vimscript ...
saginaw
1
Masalah dengan pendekatan ini adalah, itu akan menjadi tidak sinkron dengan cepat, jika Anda memodifikasi buffer, misalnya menambahkan baris lain di atas garis TODO.
Christian Brabandt
6

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.

Christian Brabandt
sumber