Спробуйте цю функцію:
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
щоб пошук поважав цей випадок (незалежно від того, який є варіант "ігнорувати"). Якщо ви хочете, щоб пошук не поважав цю справу, змініть її на \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
коментаря?