Можно ли визуально пометить строки файла в Vim, не изменяя сам файл? - PullRequest
3 голосов
/ 03 марта 2020

Я часто пересматриваю код C / C ++ / ... (особенно мой). То, что я нашел эффективным для понимания и проверки такого кода, - это закомментировать каждую строку исходного кода (например, в случае C ++, добавляя предположительно уникальный маркер комментария (например, «//!») К каждой строке). Затем я раскомментирую строки по частям, поняв, что автор имел в виду под определенным фрагментом кода, и если я думаю, что все в порядке. При этом я работаю через набор заданных файлов. Код (например, заголовочные файлы, функции, константы), который все еще закомментирован впоследствии, может быть затем удален.

Однако я часто хочу «поиграть» с некоторым кодом (например, переделать функцию и скомпилировать и запустить все). Для этого мне, очевидно, нужно удалить маркер комментария из строк, которые все еще закомментированы. После небольшого теста мне нужно «отменить» раскомментирование.

Теперь на мой вопрос:

Можно ли в Vim просто пометить строки файла, видимые каким-либо образом, но не изменить файл сам (так что компилятор, Make, ... не вижу никакой разницы, если файл не был действительно отредактирован). Такая метка должна оставаться прикрепленной к ее строке, если эта строка редактируется или перемещается в файле (например, если новый код был вставлен перед этой строкой или если код перед этой строкой был удален). Только если я решу так или если линия будет удалена, отметка исчезнет. Вновь добавленные строки должны быть помечены по умолчанию.

1 Ответ

0 голосов
/ 18 марта 2020

Я видел, что кто-то сделал это с возможностью иметь несколько цветов подсветки. В любом случае ссылка в одном из комментариев дала мне представление ...

if !exists('g:hl_default_group')
    let g:hl_default_group = 'hlYellow'
endif

if !exists('g:hl_group_config')
    let g:hl_group_config = {}
    let g:hl_group_config['hlGreen'] = 'ctermbg=121 guibg=#60ff60'
    let g:hl_group_config['hlYellow'] = 'ctermfg=0 ctermbg=11'
    let g:hl_group_config['hlGrey'] = 'ctermbg=242 guibg=DarkGrey'
    let g:hl_group_config['hlDarkBlue'] = 'ctermbg=4 guibg=DarkBlue'
    let g:hl_group_config['hlDarkMage'] = 'ctermbg=5 guibg=DarkMage'
endif

if !exists("g:hl_marked_lines")
    let g:hl_marked_lines = {}
endif

for group in keys(g:hl_group_config)
    execute 'highlight ' . group . ' ' . get(g:hl_group_config, group)
endfor

command! -nargs=? -range HighlightLines <line1>,<line2>call HighlightLines(<f-args>)
command! -nargs=0 -range RemoveHighlighting <line1>,<line2>call RemoveHighlighting()

function! HighlightLines(...) range
    if a:0 == 1
        let l:group = a:1
    else
        let l:group = g:hl_default_group
    endif

    let l:lines = getline(a:firstline, a:lastline)
    for line in l:lines
        call AddLineToMatchGroup(l:group, line)
    endfor
endfunction

function! RemoveHighlighting() range
    let l:lines = getline(a:firstline, a:lastline)
    for line in l:lines
        call DeleteLineToMatchGroup(line)
    endfor
endfunction

function! AddLineToMatchGroup(group, line) abort
    if !has_key(g:hl_group_config, a:group)
        echo 'error: group ' . a:group . ' not found'
        return
    endif
    if has_key(g:hl_marked_lines, a:line)
        echo 'error: line is already highlighted'
    endif
    let l:id = matchadd(a:group, a:line)
    let g:hl_marked_lines[a:line] = l:id
    return
endfunction

function! DeleteLineToMatchGroup(line) abort
    let l:id = get(g:hl_marked_lines, a:line)
    if l:id > 0
        call matchdelete(l:id)
        unlet g:hl_marked_lines[a:line]
    else
        echo 'info: not highlighted'
    endif
    return
endfunction

А потом как плагин ... vim-highlight

Только реальная выгода от Плагин поверх копирования и вставки выше, плагин является автономным и имеет завершение команды

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...