Tente esta função:
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
Agora chame a função na linha de comando:
:call SignKeyword()
Ou adicione um mapeamento ~/.vimrc
para chamá-lo:
nnoremap <your mapping> :call SignKeyword()<cr>
Ou adicione um autocmd. Por exemplo, se você deseja que a função seja chamada automaticamente ao abrir um arquivo cujo tipo de arquivo é remarcado:
autocmd FileType markdown call SignKeyword()
A primeira linha da função silent! sign undefine todo
exclui o conjunto de sinais, se ele já existir, para que, se seus sinais forem extraviados após a exclusão ou adição de uma linha, você possa recuperar a função para corrigi-los imediatamente.
A segunda linha define um sinal cujo nome é todo, cujo texto é >>
(você pode alterá-lo para se adequar às suas preferências) e que usa o grupo de destaque Pesquisa (a mesma coisa).
A terceira linha usa o comando global:
:g/pattern/command
O comando global executa um comando em todas as linhas que correspondem a um padrão.
Aqui está o padrão \v\C(<TODO>|<FIXME>)
, o que significa qualquer linha que contenha a palavra TODO ou FIXME .
O regex inclui o átomo \C
para que a pesquisa respeite o caso (não importa qual seja a sua opção 'caso ignorado'). Se você deseja que a pesquisa não respeite o caso, altere-a para \c
.
Sempre que uma linha é encontrada, a seguinte linha é executada pela função:
execute "sign place 9999 line=" . line('.')
\ . " name=todo buffer=" . bufnr('')
Ele executa (com o :execute
comando) o conteúdo da seguinte string:
"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')
A sequência inclui duas funções internas do vim: line()
e bufnr()
.
line('.')
retorna o número da linha atual quando uma correspondência é encontrada pelo comando global e bufnr('.')
retorna o número do buffer atual.
Por exemplo, se o comando global encontrar uma correspondência na linha 10 no buffer 5, ele fornecerá:
"sign place 9999 line=" . 10 . " name=todo buffer=" . 5
Os pontos concatenam as strings e, por fim, avaliarão:
"sign place 9999 line=10 name=todo buffer=5"
Qual é o :sign
comando que coloca um sinal na linha 10 no buffer 5.
9999 é um ID aleatório escolhido para o sinal (você pode escolher outro).
A quarta linha da função :nohlsearch
desativa o realce dos padrões correspondentes.
Edit: Corrigi a regex, o original estava errado. Eu escrevi, ^[TODO|FIXME]
mas acho que deveria ser \v\C(<TODO>|<FIXME>)
. Desculpe pelo transtorno, ainda estou aprendendo vimscript.
TODO
comentário foi removido?