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 ~/.vimrcper 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 todoelimina 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 \Cmodo 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 :executecomando) 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 :signcomando 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 :nohlsearchdisabilita 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.
TODOrimosso il commento?