Попробуйте эту функцию:
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
комментария?todo
знаки, но, тем не менее, только что заметил, что при удалении строки знак удаляется, так что все в порядкеsilent! sign undefine todo
. Он удаляет знак todo, если он уже существует, поэтому, если после удаления строки, содержащей ключевое слово TODO или FIXME, ваши знаки будут смещены, вы можете вызвать функцию, чтобы исправить их немедленно.^[TODO|FIXME]
но вместо этого должно было быть\v(TODO|FIXME)
. Новое регулярное выражение будет соответствовать строке, содержащей одно из ключевых слов, но не начало строки, так как я предполагаю, что строка может содержать некоторый код перед комментарием, например, как этотsome code # FIXME this line needs to be fixed
. Предыдущее регулярное выражение было полностью неверным, извините за неудобства, я все еще изучаю vimscript ...Вы можете использовать мой плагин DynamicSigns . Это позволяет использовать так называемое SignExpression, которое похоже на выражение сгиба.
Так что вы можете просто сделать
:SignExpression getline(v:lnum)=~'TODO'?'Warning':0
Прочитайте справку для большего количества примеров того, что возможно.
Преимущество использования моего плагина в том, что он отслеживает изменения в буфере и соответствующим образом корректирует знаки.
источник