Prova questa funzione:
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
Ora chiama la funzione dalla riga di comando:
:call SignKeyword()
Oppure aggiungi un mapping nel tuo ~/.vimrc
per chiamarlo:
nnoremap <your mapping> :call SignKeyword()<cr>
Oppure aggiungi un autocmd. Ad esempio, se si desidera che la funzione venga chiamata automaticamente all'apertura di un file il cui tipo di file è contrassegnato come markdown:
autocmd FileType markdown call SignKeyword()
La prima riga della funzione silent! sign undefine todo
elimina il segno da fare se esiste già, in modo che se i segni sono fuori posto dopo aver eliminato o aggiunto una linea, è possibile richiamare la funzione per risolverli immediatamente.
La seconda riga definisce un segno il cui nome è todo, il cui testo è >>
(è possibile modificarlo in base alle proprie preferenze) e che utilizza il gruppo di evidenziazione Cerca (stessa cosa).
La terza riga utilizza il comando globale:
:g/pattern/command
Il comando globale esegue un comando su ogni riga che corrisponde a un modello.
Qui è il modello \v\C(<TODO>|<FIXME>)
, che significa qualsiasi riga contenente la parola TODO o FIXME .
La regex include l'atomo in \C
modo che la ricerca rispetti il caso (indipendentemente dall'opzione "ignorecase"). Se si desidera che la ricerca non rispetti il caso, modificarlo in \c
.
Ogni volta che viene trovata una tale linea, la seguente riga viene eseguita dalla funzione:
execute "sign place 9999 line=" . line('.')
\ . " name=todo buffer=" . bufnr('')
Esegue (con il :execute
comando) il contenuto della seguente stringa:
"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')
La stringa include due funzioni incorporate vim: line()
e bufnr()
.
line('.')
restituisce il numero della riga corrente quando viene trovata una corrispondenza dal comando globale e bufnr('.')
restituisce il numero del buffer corrente.
Ad esempio, se il comando globale trova una corrispondenza sulla riga 10 nel buffer 5, fornirà:
"sign place 9999 line=" . 10 . " name=todo buffer=" . 5
I punti concatenano le stringhe e quindi valuteranno infine:
"sign place 9999 line=10 name=todo buffer=5"
Qual è il :sign
comando che posiziona un segno sulla riga 10 nel buffer 5.
9999 è un ID casuale scelto per il segno (puoi sceglierne un altro).
La quarta riga della funzione :nohlsearch
disabilita l'evidenziazione dei motivi abbinati.
Modifica: ho corretto il regex, l'originale era sbagliato. Ho scritto ^[TODO|FIXME]
ma invece penso che dovrebbe essere \v\C(<TODO>|<FIXME>)
. Ci scusiamo per l'inconveniente, sto ancora imparando vimscript.
TODO
rimosso il commento?