Команда Vim, чтобы закомментировать выбор строк? - PullRequest
2 голосов
/ 24 октября 2019

Скажем, у меня есть несколько строк:

@Override
public void draw(Graphics g) {
    g.setColor(Color.MAGENTA);
    g.fillRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
    g.setColor(Color.BLACK);
    g.drawRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
}

Когда я хочу закомментировать их с помощью // (я предпочитаю строчные комментарии вместо блочных комментариев), я делаю следующее:

  • Поместить курсор перед символом @
  • Ctrl-V: перейти в режим выбора блока
  • Выбрать столбец до закрывающей скобки }используя несколько нажатий j
  • Shift-I: для ввода вставки блока
  • Введите //
  • ESC для возбуждения
  • Enter для завершения команды

-> Строки теперь закомментированы.

Есть ли более простой способ, когда мне не нужно делать выбор блока? Я обнаружил, что могу использовать подстановку, например :'<, '>s/^/\/\///g, но у нее есть две проблемы:

  1. Она очень неуклюжая и подвержена ошибкам (необходимо избегать нескольких прямых и обратных слешей)
  2. Он размещает символы комментария (//) в начале строки (позиция 0), а не в той позиции, где был первый символ этой строки (поэтому отступы теряются).

Как вставить // в выделенные строки в позиции первого символа каждой строки, используя Vi?

Ответы [ 5 ]

3 голосов
/ 24 октября 2019

Вы можете определить пользовательское сопоставление или команду для :substitute.

. Однако есть несколько плагинов для комментариев, которые делают это очень хорошо, и они являются общими (и часто расширяемыми), так что они работают длялюбой тип файла:

Я бы настоятельно рекомендовал использовать один из этих плагинов, а не пытаться изобретать плохое решение самостоятельно.

1 голос
/ 24 октября 2019

Как я могу вставить // выделенные строки в позиции первого символа каждой строки, используя Vi?

Хотя, я согласен с другими и выделенным плагиномявляется обязательным условием, но, поскольку оно сформулировано в OP, это довольно простая задача, которая может быть реализована в виде одной строки:

vnoremap <silent>gc :call setline(".", printf("%*s" . &cms, indent("."), "", trim(getline("."))))<CR>

Теперь выберите текст, нажмите «gc» ивуаля, это работает. Чтобы принудительно использовать // вместо значения по умолчанию /**/, установите следующий параметр для вашего буфера: setlocal cms=//\ %s. Смотри :h 'cms'.

1 голос
/ 24 октября 2019

Я использую Комментарий, как и в другом ответе, но несколько мыслей:

  • <C-v>jjjjj может быть <C-v>} или <C-v>/}<CR>
  • :substitute ненеобходимо использовать / в качестве разделителя: :'<,'>s-^-//
  • с визуальным выделением, вы также можете сделать :'<,'>normal! I//
0 голосов
/ 25 октября 2019

Создайте макрос с q, давайте поместим его в буфер a, поэтому нажмите qa в данной строке. Затем нажмите I//, чтобы перейти к началу строки, и закомментируйте ее. нажмите Esc и q, и теперь ваш макрос готов. Этот макрос закомментирует текущую строку.
Полная команда: qaI// Esc q

Теперь визуально выберите группу строк с помощью V и введите :norm!@a для запуска макроса a по этим строкам. Это закомментирует кучу строк.

Запишите другой макрос, чтобы сделать наоборот с qb^xx. Это может быть вызвано путем визуального выбора строк, которые вы хотите раскомментировать, и ввода norm!@b

Вы можете сохранить эти макросы в вашем .vimrc и сопоставить конкретный макрос с комбинацией клавиш, если вы хотите «сохранить» этикоманды.

0 голосов
/ 24 октября 2019

«У меня есть« функция переключения комментариев », которая выглядит как« Ссылка: https://stackoverflow.com/a/24652257/2571881

" these lines are needed for ToggleComment()
" Reference: https://stackoverflow.com/a/24652257/2571881
autocmd FileType c,cpp,java      let b:comment_leader = '//'
autocmd FileType arduino         let b:comment_leader = '//'
autocmd FileType sh,ruby,python  let b:comment_leader = '#'
autocmd FileType zsh             let b:comment_leader = '#'
autocmd FileType conf,fstab      let b:comment_leader = '#'
autocmd FileType matlab,tex      let b:comment_leader = '%'
autocmd FileType vim             let b:comment_leader = '"'

function! ToggleComment()
    if exists('b:comment_leader')
        let l:pos = col('.')
        let l:space = ( &ft =~ '\v(c|cpp|java|arduino)' ? '3' : '2' )
        if getline('.') =~ '\v(\s*|\t*)' .b:comment_leader
            let l:space -= ( getline('.') =~ '\v.*\zs' . b:comment_leader . '(\s+|\t+)@!' ?  1 : 0 )
            execute 'silent s,\v^(\s*|\t*)\zs' .b:comment_leader.'[ ]?,,g'
            let l:pos -= l:space
        else
            exec 'normal! 0i' .b:comment_leader .' '
            let l:pos += l:space
        endif
        call cursor(line("."), l:pos)
    else
        echo 'no comment leader found for filetype'
    end
endfunction
nnoremap <Leader>t :call ToggleComment()<CR>
inoremap <Leader>t <C-o>:call ToggleComment()<CR>
xnoremap <Leader>t :'<,'>call ToggleComment()<CR>
" vnoremap <Leader>t :call ToggleComment()<CR>

Итак, если у вас есть эта функция на вашем ~/.vimrc, вы можете сделать:

vip ...................... visual inner paragraph
<leader>t ................ in order to call the function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...