Czy można przypisać znak do grupy „Todo”?

9

Czy można dodać znak, który będzie wyświetlany w kolumnie znaków, ilekroć linia ma grupę czynności do wykonania (Do zrobienia, FIXME ...).

Ulepszając swój schemat kolorów Zmieniłem wyróżnienie grupy Todo, ale chciałbym mieć wskaźnik w kolumnie znaków, na przykład Błędy i ostrzeżenia syntastyczne.


źródło

Odpowiedzi:

9

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, ~/.vimrcaby 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 todousuwa 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, \Cdzię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ą :executepolecenia) 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 :signpoleceniem umieszczającym znak w wierszu 10 w buforze 5.
9999 to losowy identyfikator wybrany dla znaku (możesz wybrać inny).


Czwarty wiersz funkcji :nohlsearchwyłą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.

saginaw
źródło
1
jak usunąć znak po usunięciu TODOkomentarza?
1
nie tego się spodziewałem, ponieważ to usuwa wszystkie todoznaki, ale zauważyłem, że po usunięciu linii znak jest usuwany, więc w porządku
1
Ok, Dodałem tę linię na początku funkcji: silent! 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ć.
saginaw
2
Wyrażenie regularne było niepoprawne, wpisałem, ^[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 ten some code # FIXME this line needs to be fixed. Poprzedni regex był całkowicie błędny, przepraszam za niedogodności, wciąż uczę się vimscript ...
saginaw
1
Problem z tym podejściem polega na tym, że szybko zsynchronizuje się, jeśli zmodyfikujesz bufor, np. Dodasz kolejną linię powyżej linii TODO.
Christian Brabandt
6

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.

Christian Brabandt
źródło