Wypróbuj tę funkcję:
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
Teraz wywołaj funkcję w wierszu poleceń:
:call SignKeyword()
Lub dodaj mapowanie, ~/.vimrc
aby to nazwać:
nnoremap <your mapping> :call SignKeyword()<cr>
Lub dodaj autocmd. Na przykład jeśli chcesz, aby funkcja była wywoływana automatycznie podczas otwierania pliku, którego typem pliku jest markdown:
autocmd FileType markdown call SignKeyword()
Pierwszy wiersz funkcji silent! sign undefine todo
usuwa znak do zrobienia, jeśli już istnieje, więc jeśli znaki zostaną zgubione po usunięciu lub dodaniu wiersza, możesz przywołać funkcję, aby je natychmiast naprawić.
Drugi wiersz definiuje znak, którego nazwa to todo, którego tekst to >>
(możesz go zmienić zgodnie z własnymi preferencjami) i który korzysta z grupy wyróżniania Wyszukaj (to samo).
Trzeci wiersz używa globalnego polecenia:
:g/pattern/command
Polecenie globalne wykonuje polecenie w każdym wierszu pasującym do wzorca.
Tutaj jest wzór \v\C(<TODO>|<FIXME>)
, co oznacza dowolny wiersz zawierający słowo TODO lub FIXME .
Wyrażenie regularne zawiera atom, \C
dzięki czemu wyszukiwanie uwzględnia wielkość liter (bez względu na to, jaka jest opcja „ignoruj”). Jeśli chcesz, aby wyszukiwanie nie uwzględniało wielkości liter, zmień je na \c
.
Ilekroć taki wiersz zostanie znaleziony, funkcja wykonuje następujący wiersz:
execute "sign place 9999 line=" . line('.')
\ . " name=todo buffer=" . bufnr('')
Wykonuje (za pomocą :execute
polecenia) treść następującego ciągu:
"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')
Ciąg zawiera dwie wbudowane funkcje vima: line()
i bufnr()
.
line('.')
zwraca numer bieżącego wiersza po znalezieniu dopasowania przez polecenie globalne i bufnr('.')
zwraca numer bieżącego bufora.
Na przykład, jeśli globalne polecenie znajdzie dopasowanie w linii 10 w buforze 5, da:
"sign place 9999 line=" . 10 . " name=todo buffer=" . 5
Kropki łączą łańcuchy, więc w końcu oceni, że:
"sign place 9999 line=10 name=todo buffer=5"
Które jest :sign
poleceniem umieszczającym znak w wierszu 10 w buforze 5.
9999 to losowy identyfikator wybrany dla znaku (możesz wybrać inny).
Czwarty wiersz funkcji :nohlsearch
wyłącza podświetlanie pasujących wzorów.
Edycja: Naprawiłem wyrażenie regularne, oryginał był nieprawidłowy. Napisałem, ^[TODO|FIXME]
ale myślę, że tak powinno być \v\C(<TODO>|<FIXME>)
. Przepraszam za niedogodności, wciąż uczę się vimscript.
TODO
komentarza?