LINUX.ORG.RU

Визуальные метки на полях

 ,


1

1

Привет. Пользуюсь консольным nvim, на полях показывается номер строк. Есть такая хотелка: неким сочетанием подкрашивать background цифры на полях в цвет, который отличается от нормального, например в красный. Тем самым создавать визуальную метку подчеркивая некоторое важное место во время штудирования исходников. Я знаю про метки, на которые можно прыгать, но мне нужна именно визуальная метка, а не такая.

Можно ли вкрутить какой-то плагин?

Перемещено hobbit из general


Не уверен насчет вима, но в IDEA, например, можно в нужных местах написать комментарий с TODO, и оно потом будет доступно в виде списка тудушек.

Возможно, можно покопать в эту сторону и для вима.

Zhbert ★★★★★
()
Ответ на: комментарий от Vovka-Korovka

Да, подходит вполне. Сейчас попробую всё это как-то повесить удобно на сочетание какое-нибудь. Хорошо и то, что метка сохраняется при удалении строк, которые ей предшествуют. Спасибо, ссылка годная

kvpfs_2
() автор топика
Ответ на: комментарий от kvpfs_2

Получилось вот что:
init.lua

vim.api.nvim_set_hl(0, 'MyFieldMark', {fg='black', bg='orange'})
vim.api.nvim_call_function('sign_define', {'my_field_mark',
      {numhl='MyFieldMark'}})
visual_mark_counter = 1
function visual_mark()
   local row, col = unpack(vim.api.nvim_win_get_cursor(0))
   local cur_buf = vim.api.nvim_get_current_buf()
   local buf_name = vim.api.nvim_buf_get_name(0)
   local ln_signs = vim.api.nvim_call_function('sign_getplaced',
         {cur_buf, {lnum=row, group='my_mark_group'}})
   if next(ln_signs[1].signs) == nil then
      vim.api.nvim_call_function('sign_place', {visual_mark_counter,
            'my_mark_group', 'my_field_mark', '', {lnum=row}})
      visual_mark_counter = visual_mark_counter + 1
   else
      vim.api.nvim_call_function('sign_unplace', {'my_mark_group',
            {id=ln_signs[1].signs[1].id, buffer=buf_name}})
   end
end
function visual_mark_delall()
   local buf_name = vim.api.nvim_buf_get_name(0)
   vim.api.nvim_call_function('sign_unplace',
         {'my_mark_group', {buffer=buf_name}})
end

vim.keymap.set('n', '<leader>m', visual_mark)
vim.keymap.set('n', '<leader>mm', visual_mark_delall)

Пришлось повозиться, но результат достойный, доволен на 100%. Одно нажатие - установить/удалить метку, двойное - снести все. Сохраняется положение меток при удалении строк. Давно страдал без этого

Спасибо за наводку

kvpfs_2
() автор топика
Последнее исправление: kvpfs_2 (всего исправлений: 2)
Ответ на: комментарий от andreyu

В данный момент - вспоминаю логику старого кода, хочу сделать некоторые правки, портянка забористая, с наскока не взять, в общем логику понимаю, но детали могу упустить. Поэтому сначала нахожу все релевантные места, которые нужно понять в связке как одно целое, помечаю. Ну а далее уже прицельно изучаю данные участки, визуальные метки помогают быстро находить нужное место, не упустить что-то

Другой юзкейс: есть декларация класса, в нём какие-то данные, пишу какой-то метод, написал. Возникает вопрос - а поменял ли данный метод состояние всех данных или я что-то забыл? Финально читаешь новый метод, измененные данные в объявлении помечаешь меткой. Что-то осталось непомеченным, отвечаешь сам себе на вопрос - состояние действительно не изменяется или я что-то забыл?

kvpfs_2
() автор топика

Раз уж vim в тэгах…

vim9script

sign define NumberHl numhl=Error

def ToggleSign()
    var places = sign_getplaced(bufnr(), {
        group: 'MySigns',
        lnum: line(".")
    })
    if empty(places[0].signs)
        sign_place(0, 'MySigns', "NumberHl", bufnr(), {lnum: line(".")})
    else
        places[0].signs->foreach((_, v) => {
            sign_unplace('MySigns', {id: v.id})
        })
    endif
enddef


nnoremap <space>mm <scriptcmd>ToggleSign()<cr>
nnoremap <space>mc <scriptcmd>sign_unplace('MySigns')<cr>

https://asciinema.org/a/672896

habamax ★★★
()
Последнее исправление: habamax (всего исправлений: 1)
Ответ на: комментарий от kvpfs_2

А почему не подходят метки в виде // NOTE:, // INFO:, etc?

По ним легко реализуется навигация (тот же плагин Trouble или ему подобные). Комментарии удобно в них писать. Они живут вместе с кодом.

andreyu ★★★★★
()
Ответ на: комментарий от habamax

Не утверждаю точно, но, по-моему, у тебя здесь ошибка:

sign_place(0, 'MySigns', "NumberHl", bufnr(), {lnum: line(".")})

id всегда равно 0, значит каждая новая метка будет уничтожать старую, в итоге не будет существовать более одной метки в один момент времени

kvpfs_2
() автор топика
Ответ на: комментарий от kvpfs_2

id всегда равно 0, значит каждая новая метка будет уничтожать старую, в итоге не будет существовать более одной метки в один момент времени

:h sign_place()


If the sign identifier {id} is zero, then a new identifier is
		allocated. 

habamax ★★★
()