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?todo
znaki, ale zauważyłem, że po usunięciu linii znak jest usuwany, więc w porządkusilent! sign undefine todo
. Usuwa znak do zrobienia, jeśli już istnieje, więc jeśli znaki zostaną zgubione po usunięciu wiersza zawierającego słowo kluczowe TODO lub FIXME, możesz przywołać funkcję, aby je natychmiast naprawić.^[TODO|FIXME]
ale zamiast tego powinno być\v(TODO|FIXME)
. Nowe wyrażenie regularne będzie pasować do wiersza zawierającego jedno ze słów kluczowych, ale nie do początku wiersza, ponieważ przypuszczam, że wiersz mógłby zawierać kod przed komentarzem, na przykład takim jak tensome code # FIXME this line needs to be fixed
. Poprzedni regex był całkowicie błędny, przepraszam za niedogodności, wciąż uczę się vimscript ...Możesz użyć mojej wtyczki DynamicSigns . Pozwala to na tak zwane „wyrażenie ekspresji”, które jest podobne do wyrażenia składania.
Więc możesz po prostu zrobić
:SignExpression getline(v:lnum)=~'TODO'?'Warning':0
Przeczytaj pomoc, aby uzyskać więcej przykładów tego, co jest możliwe.
Zaletą korzystania z mojej wtyczki jest to, że śledzi ona zmiany bufora i odpowiednio dostosowuje znaki.
źródło