Попробуйте эту функцию:
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
Теперь вызовите функцию в командной строке:
:call SignKeyword()
Или добавьте отображение в вашем, ~/.vimrc
чтобы назвать это:
nnoremap <your mapping> :call SignKeyword()<cr>
Или добавьте autocmd. Например, если вы хотите, чтобы функция вызывалась автоматически при открытии файла, тип файла которого имеет разметку:
autocmd FileType markdown call SignKeyword()
Первая строка функции silent! sign undefine todo
удаляет знак todo, если он уже существует, так что, если ваши знаки смещены после удаления или добавления строки, вы можете вызвать функцию, чтобы исправить их немедленно.
Вторая строка определяет знак, имя которого todo, текст которого >>
(вы можете изменить его в соответствии со своими предпочтениями) и который использует группу подсветки поиска (тоже самое).
Третья строка использует глобальную команду:
:g/pattern/command
Глобальная команда выполняет команду в каждой строке, которая соответствует шаблону.
Здесь шаблон \v\C(<TODO>|<FIXME>)
, который означает любую строку, содержащую либо слово TODO, либо FIXME .
Регулярное выражение включает атом, \C
так что поиск учитывает регистр (независимо от того, какая у вас опция «ignorecase»). Если вы хотите, чтобы поиск не соответствовал случаю, измените его на \c
.
Всякий раз, когда такая строка найдена, функция выполняет следующую строку:
execute "sign place 9999 line=" . line('.')
\ . " name=todo buffer=" . bufnr('')
Он выполняет (с помощью :execute
команды) содержимое следующей строки:
"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')
Строка включает две встроенные функции vim: line()
и bufnr()
.
line('.')
возвращает номер текущей строки, когда глобальная команда находит совпадение, и bufnr('.')
возвращает номер текущего буфера.
Так, например, если глобальная команда находит совпадение в строке 10 в буфере 5, она выдаст:
"sign place 9999 line=" . 10 . " name=todo buffer=" . 5
Точки объединяют строки, и, в конечном итоге, они будут оцениваться следующим образом:
"sign place 9999 line=10 name=todo buffer=5"
Это :sign
команда размещения знака в строке 10 в буфере 5.
9999 - это случайный идентификатор, выбранный для знака (вы можете выбрать другой).
Четвертая строка функции :nohlsearch
отключает подсветку совпавших шаблонов.
Изменить: я исправил регулярное выражение, оригинал был неправ. Я написал, ^[TODO|FIXME]
но вместо этого я думаю, что это должно быть \v\C(<TODO>|<FIXME>)
. Извините за неудобства, я все еще изучаю vimscript.
TODO
комментария?