Чи можна призначити знак групі «Тодо»?


9

Чи можна додати знак, який відображатиметься у стовпці знаків, коли рядок має групу ToDo (ToDo, FIXME ...).

Налаштувавши свою кольорову схему, я змінив яскравість групи Todo, але хотів би мати індикатор у стовпці знаків, як Синтастичні помилки та попередження.

Відповіді:


9

Спробуйте цю функцію:

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.


1
як прибрати знак після видалення TODOкоментаря?

1
це не те, що я очікував, тому що це видалить усі todoзнаки, але, проте, тільки що помітив, що при видаленні рядка знак видаляється, тож це нормально

1
Добре, я додав цей рядок на початку функції: silent! sign undefine todo. Він видаляє знак todo, якщо він вже існує, так що якщо ваші знаки будуть заміщені після видалення рядка, що містить ключове слово TODO або FIXME, ви можете згадати функцію, щоб виправити їх негайно.
saginaw

2
Регекс був невірним, я набрав, ^[TODO|FIXME]але замість цього мав бути \v(TODO|FIXME). Новий регулярний вираз буде відповідати рядку, що містить одне з ключових слів, але не початок рядка, оскільки я думаю, що рядок може містити код перед коментарем, наприклад, як цей some code # FIXME this line needs to be fixed. Попередній регулярний вираз був абсолютно неправильним, вибачте за незручності, я все ще вчуся vimscript ...
saginaw

1
Проблема з таким підходом полягає в тому, що він зміниться синхронно, якщо ви модифікуєте буфер, наприклад, додайте інший рядок над рядком TODO.
Крістіан Брабандт

6

Ви можете використовувати мій плагін DynamicSigns . Це дозволяє створювати так звані "SignExpression", схожі на вираз складки.

Тож можна просто зробити :SignExpression getline(v:lnum)=~'TODO'?'Warning':0

Прочитайте довідку для більше прикладів можливого.

Перевага використання мого плагіна полягає в тому, що він відстежує зміни буфера і відповідно коригує знаки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.