Попробуйте эту функцию:
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комментария?