Prueba esta función:
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
Ahora llame a la función en la línea de comando:
:call SignKeyword()
O agregue un mapeo en su ~/.vimrc
para llamarlo:
nnoremap <your mapping> :call SignKeyword()<cr>
O agregue un autocmd. Por ejemplo, si desea que se llame automáticamente a la función al abrir un archivo cuyo tipo de archivo es markdown:
autocmd FileType markdown call SignKeyword()
La primera línea de la función silent! sign undefine todo
elimina el signo todo si ya existe, de modo que si sus signos están fuera de lugar después de eliminar o agregar una línea, puede recuperar la función para corregirlos de inmediato.
La segunda línea define un signo cuyo nombre es todo, cuyo texto es >>
(puede cambiarlo según sus preferencias) y que utiliza el grupo de resaltado Buscar (lo mismo).
La tercera línea usa el comando global:
:g/pattern/command
El comando global ejecuta un comando en cada línea que coincide con un patrón.
Aquí el patrón es \v\C(<TODO>|<FIXME>)
, lo que significa cualquier línea que contenga la palabra TODO o FIXME .
La expresión regular incluye el átomo \C
para que la búsqueda respete el caso (no importa cuál sea su opción 'ignorecase'). Si desea que la búsqueda no respete el caso, cámbielo a \c
.
Cada vez que se encuentra dicha línea, la función ejecuta la siguiente línea:
execute "sign place 9999 line=" . line('.')
\ . " name=todo buffer=" . bufnr('')
Ejecuta (con el :execute
comando) el contenido de la siguiente cadena:
"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')
La cadena incluye dos funciones integradas de vim: line()
y bufnr()
.
line('.')
devuelve el número de la línea actual cuando el comando global encuentra una coincidencia y bufnr('.')
devuelve el número del búfer actual.
Entonces, por ejemplo, si el comando global encuentra una coincidencia en la línea 10 en el búfer 5, dará:
"sign place 9999 line=" . 10 . " name=todo buffer=" . 5
Los puntos concatenan las cadenas, por lo que finalmente se evaluará para:
"sign place 9999 line=10 name=todo buffer=5"
Cuál es el :sign
comando que coloca un signo en la línea 10 en el búfer 5.
9999 es una identificación aleatoria elegida para el signo (puede elegir otro).
La cuarta línea de la función :nohlsearch
desactiva el resaltado de los patrones coincidentes.
Editar: arreglé la expresión regular, el original estaba equivocado. Escribí ^[TODO|FIXME]
pero en cambio creo que debería ser \v\C(<TODO>|<FIXME>)
. Disculpe las molestias, todavía estoy aprendiendo vimscript.
TODO
se ha eliminado el comentario?