Каков быстрый способ комментировать / раскомментировать строки в Vim?

у меня есть файл кода Ruby, открытый в vi, есть строки, прокомментированные с #:

class Search < ActiveRecord::Migration
  def self.up
    # create_table :searches do |t|
    #   t.integer :user_id
    #   t.string :name
    #   t.string :all_of
    #   t.string :any_of
    #   t.string :none_of
    #   t.string :exact_phrase
    # 
    #   t.timestamps
    # end
  end

  def self.down
    # drop_table :searches
  end
end

скажем, я хочу раскомментировать все строки в первом . Какой эффективный способ сделать это в Vim?

В общем, я ищу простой и гибкий способ комментировать и раскомментировать строки. Здесь я имею дело с кодом Ruby, но это может быть JavaScript (//) или Haml (-#).

30 ответов


Я использую NERD Commenter script. Он позволяет легко комментировать, раскомментировать или переключать комментарии в коде.

Как говорится в комментарии:

для тех, кто смущен использованием, лидером по умолчанию является"\", поэтому 10\cc прокомментирует десять строк, а 10\cu раскомментирует эти десять строк


для этих задач я использую большую часть времени выбор блока.

наведите курсор на первую # символ, нажмите CtrlV (или CtrlQ для gVim), и спуститесь до последней прокомментированной строки и нажмите x, это удалит все # символов по вертикали.

для комментирования блока текста почти то же самое:

  1. сначала перейдите к первая строка, которую вы хотите прокомментировать, нажмите CtrlV. Это поставит редактора в VISUAL BLOCK режим.
  2. затем с помощью клавиши со стрелкой и выберите до последней строки
  3. Теперь нажмите клавишу ShiftЯ, который поставит редактор в INSERT режим и нажмите клавишу #. Это добавит хэш в первую строку.
  4. нажмите клавишу Esc (дайте ему секунду), и он вставит # символ на всех остальных выбранных строках.

для урезанной версии vim, поставляемой с debian / ubuntu по умолчанию, введите : s/^/# на третьем шаге вместо.


комментировать блоки в vim:

  • пресс Esc (оставить редактирование или другой режим)
  • нажмите ctrl+v (режим визуального блока)
  • используйте клавиши со стрелками вверх / вниз, чтобы выбрать нужные строки (это не будет выделять все-это нормально!)
  • Shift+Я (заглавная I)
  • вставить текст, который вы хотите, т. е. %
  • пресс EscEsc

раскомментировать блоки в vim:

  • пресс Esc (оставить редактирование или другой режим)
  • нажмите ctrl+v (режим визуального блока)
  • использовать /↓ стрелка для выбора строк раскомментировать.

    если вы хотите выбрать несколько символов, используйте один или объединить эти методы:

    • используйте клавиши со стрелками влево/вправо, чтобы выбрать больше текста
    • для выбора фрагментов текста используйте shift + / стрелка
    • вы можете повторно нажать клавиши удаления ниже, как обычная кнопка удаления

  • пресс d или x для удаления символов, если надо

иногда меня обстреливают в удаленную коробку, где мои плагины и .vimrc не может мне помочь, или иногда NerdCommenter ошибается (например, JavaScript, встроенный в HTML).

в этих случаях низкотехнологичной альтернативой является встроенный norm команда, которая просто запускает любые произвольные команды vim в каждой строке в указанном вами диапазоне. Например:

комментируя с #:

1. visually select the text rows (using V as usual)
2. :norm i#

это вставляет " # " в начале каждой строки. Обратите внимание, что при вводе : диапазон будет заполнен, поэтому он действительно будет выглядеть как :'<,'>norm i#

комментарий #:

1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x

этого удалить первый символ каждой строки. Если бы я использовал комментарий 2-char, такой как//, я бы просто сделал :norm xx, чтобы удалить символы.

если комментарии отступы, как в вопросе OP, то вы можете закрепить свое удаление следующим образом:

:norm ^x

что означает " перейти к сначала символ без пробела, затем удалить один символ". Обратите внимание, что в отличие от выбора блока, Этот метод работает, даже если комментарии имеют неравномерный отступ!

Примечание: С norm буквально просто выполняет обычные команды vim, вы не ограничены только комментариями, вы можете выполнить сложное редактирование каждой строки. Если вам нужен escape-символ как часть последовательности команд, введите ctrl-v и нажмите клавишу escape.

примечание 2.: Вы можете, конечно, также добавить отображение, если вы обнаружите, что используете norm много. Например, помещая следующую строку в~/.vimrc позволяет типа ctrl-n вместо :norm после выполнения визуального выбора

vnoremap <C-n> :norm

Примечание 3: голые кости vim иногда не имеет norm команда скомпилирована в него, поэтому обязательно используйте усиленную версию, т. е. обычно /usr/bin /vim, а не/bin / vi

(спасибо @Manbroski и @rakslice за улучшения включено в этот ответ)


у меня есть следующая в моем .vimrc:

" Commenting blocks of code.
autocmd FileType c,cpp,java,scala let b:comment_leader = '// '
autocmd FileType sh,ruby,python   let b:comment_leader = '# '
autocmd FileType conf,fstab       let b:comment_leader = '# '
autocmd FileType tex              let b:comment_leader = '% '
autocmd FileType mail             let b:comment_leader = '> '
autocmd FileType vim              let b:comment_leader = '" '
noremap <silent> ,cc :<C-B>silent <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:nohlsearch<CR>
noremap <silent> ,cu :<C-B>silent <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:nohlsearch<CR>
вы можете ,cc прокомментировать строку и ,cu раскомментировать строку (работает как в обычном, так и в визуальном режиме).

(Я украл его с какого-то сайта много лет назад, поэтому я не могу полностью объяснить, как он работает :). Есть комментарий где это объясняется.)


укажите, какие строки комментировать в vim:

показать номера строк:

:set number

затем

:5,17s/^/#/     this will comment out line 5-17

или такой:

:%s/^/#/        will comment out all lines in file

вот как я делаю это:

  1. перейдите к первому символу в первой строке, которую вы хотите прокомментировать.

  2. нажмите Ctrl+q в ГВИМ или Ctrl+v в VIM, затем спуститесь, чтобы выбрать первый символ в строках для комментариев.

  3. нажмите клавишу c, и добавьте символ комментария.

Раскомментировав работает одинаково, просто введите пробел вместо символа комментария.


Я придумал простое дополнение к моему .файл vimrc, который работает довольно хорошо и может быть легко расширена. Вы просто добавляете новый тип файла в comment_map и его лидер комментариев.

я добавил отображение в нормальный и визуальный режимы, но вы можете переназначить все, что вам нравится. Я предпочитаю иметь только функцию стиля "toggle". Один медведь имеет несколько отображений и т. д.

let s:comment_map = { 
    \   "c": '\/\/',
    \   "cpp": '\/\/',
    \   "go": '\/\/',
    \   "java": '\/\/',
    \   "javascript": '\/\/',
    \   "lua": '--',
    \   "scala": '\/\/',
    \   "php": '\/\/',
    \   "python": '#',
    \   "ruby": '#',
    \   "rust": '\/\/',
    \   "sh": '#',
    \   "desktop": '#',
    \   "fstab": '#',
    \   "conf": '#',
    \   "profile": '#',
    \   "bashrc": '#',
    \   "bash_profile": '#',
    \   "mail": '>',
    \   "eml": '>',
    \   "bat": 'REM',
    \   "ahk": ';',
    \   "vim": '"',
    \   "tex": '%',
    \ }

function! ToggleComment()
    if has_key(s:comment_map, &filetype)
        let comment_leader = s:comment_map[&filetype]
        if getline('.') =~ "^\s*" . comment_leader . " " 
            " Uncomment the line
            execute "silent s/^\(\s*\)" . comment_leader . " /\1/"
        else 
            if getline('.') =~ "^\s*" . comment_leader
                " Uncomment the line
                execute "silent s/^\(\s*\)" . comment_leader . "/\1/"
            else
                " Comment the line
                execute "silent s/^\(\s*\)/\1" . comment_leader . " /"
            end
        end
    else
        echo "No comment leader found for filetype"
    end
endfunction


nnoremap <leader><Space> :call ToggleComment()<cr>
vnoremap <leader><Space> :call ToggleComment()<cr>

Примечание:

Я не использую обратные вызовы или крючки в типах файлов / загрузке, потому что я считаю, что они замедляют запуск Vim больше, чем .vimrc статическая функция/карте, но это только мое предпочтение. Я также старался, чтобы все было просто и эффективно. Если вы используете автокоманды, вам нужно обязательно поместить их в группу автокоманд, иначе обратные вызовы будут добавлены в тип файла несколько раз для каждого загруженного файла и вызовут значительное снижение производительности.


используйте Control-V для выбора прямоугольников текста: перейдите к первому # персонаж, типа Ctrl+V, вправо один раз, а затем вниз, до конца комментарии. Теперь введите x: вы удаляете все # символы, за которыми следует одно пробел.


комментарии тумблер

если все, что вам нужно-это комментарии тумблер я лучше пойду с комментарии.ВИМ by tpope.

enter image description here

установка

возбудитель:

cd ~/.vim/bundle
git clone git://github.com/tpope/vim-commentary.git

ВИМ-штекера:

Plug 'tpope/vim-commentary'

Vundle:

Plugin 'tpope/vim-commentary'

дополнительные настройки

добавить это к вашему .файл vimrc: noremap <leader>/ :Commentary<cr>

теперь вы можете комментарии, нажав Leader+/, как возвышенное и Атом.


вот раздел моего .vimrc:

"insert and remove comments in visual and normal mode
vmap ,ic :s/^/#/g<CR>:let @/ = ""<CR>
map  ,ic :s/^/#/g<CR>:let @/ = ""<CR>
vmap ,rc :s/^#//g<CR>:let @/ = ""<CR>
map  ,rc :s/^#//g<CR>:let @/ = ""<CR>

в обычном и визуальном режиме это позволяет мне нажать , ic для вставки комментариев и, rc удалить комментарии.


Мне нравится использовать плагин tcomment : http://www.vim.org/scripts/script.php?script_id=1173

я сопоставил gc и gcc, чтобы прокомментировать строку или выделенный блок кода. Он определяет тип файла и работает очень хорошо.


С 30 ответами впереди меня, я постараюсь дать еще более простое решение: вставьте # в начале строки. Затем спуститесь по линии и нажмите dot (.). Повторяю, сделай j,.,j,. и т. д...раскомментировать, удалить # (вы можете нажмите x на #), и сделать обратное, используя k,., etc...


как раскомментировать следующие три строки в vi:

#code code
#code
#code code code

наведите курсор на верхний левый # символ и нажмите клавишу CtrlV. Это переводит вас в режим визуального блока. Нажмите стрелку вниз или J три раза, чтобы выбрать все три линии. Затем нажмите D. Все комментарии исчезают. Чтобы отменить, нажмите U.

как прокомментировать следующие три строки в В.:

code code
code
code code code

наведите курсор на верхний левый символ, нажмите клавишу CtrlV. Это переводит вас в режим визуального блока. Нажмите или J три раза, чтобы выбрать все три линии. Затем нажмите:

Я//Esc

это заглавная I,//, и побег.

при нажатии клавиши ESC, все выбранные строки получим указанный вами символ комментария.


я использую vim 7.4, и это работает для меня.
Предполагая, что мы комментируем / раскомментируем 3 строки.

комментарий:

если в начале строки нет табуляции / пробела:
ctrl + V затем jjj затем shift + I (cappital i) затем //затем esc esc
если строка имеет вкладку / пробел в начале, вы все равно можете сделать выше или поменять местами на c:
ctrl + V затем jjj затем c затем //затем esc esc

К uncomment:

если строки не имеют вкладки/пробела в начале:
ctrl + V затем jjj затем ll (lower cap L) затем c

если строки имеют вкладку / пробел в начале, то вы пробел один над и esc
ctrl + V затем jjj затем ll (lower cap L) затем c затем space затем esc


Я использую EnhancedCommentify. Он комментирует все, что мне нужно (языки программирования, скрипты, файлы конфигурации). Я использую его с привязками визуального режима. Просто выберите текст, который вы хотите прокомментировать, и нажмите co/cc / cd.

vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR> 

Да, есть 33 (в основном повторяющихся) ответов уже на этот вопрос.

вот еще один подход к тому, как комментировать строки в Vim:движения. Основная идея состоит в том, чтобы комментировать или раскомментировать строки, используя тот же метод, что и выдергивание абзаца, набрав yip или удаление 2 строк, введя dj.

такой подход позволит вам делать такие вещи, как:

  • ccj прокомментировать следующие 2 строки, и cuk раскомментировать их;

  • cci{ прокомментировать блок, и cui{ раскомментировать его;

  • ccip прокомментировать целый абзац, и cuip раскомментировать его.

  • ccG прокомментировать все до последней строки, и cugg раскомментировать все до первой линии.

все, что вам нужно, это 2 функции, которые работать над ходатайств, и 2 отображения для каждой функции. Во-первых, отображения:

nnoremap <silent> cc  :set opfunc=CommentOut<cr>g@
vnoremap <silent> cc  :<c-u>call  CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu  :set opfunc=Uncomment<cr>g@
vnoremap <silent> cu  :<c-u>call  Uncomment(visualmode(), 1)<cr>

(см. руководство о g@ оператора и operatorfunc переменной.)

и теперь функции:

function! CommentOut(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^/#/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^/#/\<cr>'["
  endif
endfunction

function! Uncomment(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^\(\s*\)#/\1/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^\(\s*\)#/\1/\<cr>`["
  endif
endfunction

измените регулярные выражения выше, чтобы удовлетворить ваш вкус относительно того, где # должно быть:


Если вы уже знаете номера строк, то n,ms/# // будет работать.


Я отмечаю первую и последнюю строки (ma и mb), а затем делаю :'a,'bs/^# //


Я использую Тима Поупа vim-комментарий плагин.


Я объединил ответ Фила и jqno и сделал untoggle комментарии с пробелами:

autocmd FileType c,cpp,java,scala let b:comment_leader = '//'
autocmd FileType sh,ruby,python   let b:comment_leader = '#'
autocmd FileType conf,fstab       let b:comment_leader = '#'
autocmd FileType tex              let b:comment_leader = '%'
autocmd FileType mail             let b:comment_leader = '>'
autocmd FileType vim              let b:comment_leader = '"'
function! CommentToggle()
    execute ':silent! s/\([^ ]\)/' . b:comment_leader . ' /'
    execute ':silent! s/^\( *\)' . b:comment_leader . ' \?' . b:comment_leader . ' \?//'
endfunction
map <F7> :call CommentToggle()<CR>

есть этот плагин изменения жизни по tpope под названием vim-commentary

https://github.com/tpope/vim-commentary

этот плагин предоставляет:

  • вменяемость
  • правильно отступы комментарии
  • не комментирует пустые / ненужные строки

использование:

  • установить через Vundle (или патоген, я думаю).
  • выделить ваш текст и нажмите : который покажет как :<,'>
  • комментарии типа :<,'>Commentary и нажать Enter.
  • бум. Готово зародыше.

вот основной однострочный на основе C-v следовал по I способ, описанный выше.

эта команда (:Comment) добавляет выбранную строку в начало любой выбранной строки.

command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"

добавьте эту строку в свой .vimrc создать команду, которая принимает один аргумент, а аргумент в начале каждой строки в текущей выборке.

Е. Г. если после выделенного текста:

1
2

и вы запустите это::Comment // результат будет:

//1
//2

начиная с идей в ответах здесь, я начал свою собственную функцию комментариев. Он включает и выключает комментарии. Он может обрабатывать такие вещи, как //print('blue'); //this thing is blue и просто переключает первый комментарий. Кроме того, он добавляет комментарии и один пробел только там, где первый не пробел, а не в самом начале строки. Aditionally он не копирует излишне пробелы, но использует масштабирование (: h \zs для справки), чтобы избежать этой дополнительной работы при комментировании и отступе строки. Надеюсь, это поможет некоторым минималистам там. Предложения приветствуются.

" these lines are needed for ToggleComment()
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 = '"'

" l:pos   --> cursor position
" l:space --> how many spaces we will use 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>

Я использую комментарии.Vim из Jasmeet Сингх Ананд (найдено на vim.org),

Он работает с C, C++, Java, PHP[2345], proc, CSS, HTML, htm, XML, XHTML, vim, vimrc, SQL, sh, ksh, csh, Perl, tex, fortran, ml, caml, ocaml, vhdl, haskel и обычные файлы

он комментирует и не комментирует строки в разных исходных файлах как в обычном, так и в визуальном режиме

использование:

  • CtrlC to комментарий одной строкой
  • CtrlX to ООН-комментарий одной строкой
  • ShiftV и выберите несколько строк, то CtrlC чтобы прокомментировать выбранные несколько строк
  • ShiftV и выберите несколько строк, то CtrlX отменить комментарий к выбранному множеству линии

самый быстрый и интуитивно понятный метод из всех-переназначить ) для walk-down-комментирование строк, а затем ( для walk-up-uncommenting. Попробуй, и ты не вернешься.

на Рубин или Баш, с отступами 2-space:

map ) I# <Esc>j
map ( k^2x

на C / C++ или PHP, С 4-пространства отступа:

map ) I//  <Esc>j
map ( k^4x

минусы в том, что вы теряете ( и ) для движения предложения (но das можно заполнить там), и вы иногда будете возвращаться к select-and-replace или CtrlV для обработки длинных участков. Но это большая редкость.

и для C-style длинные комментарии лучше всего обрабатывать с помощью:

set cindent
set formatoptions=tcqr

... Который хорошо сочетается с использованием V[move]gq переделать обертывание слов.


этот простой фрагмент от my .vimrc:

function! CommentToggle()
    execute ':silent! s/\([^ ]\)/\/\/ /'
    execute ':silent! s/^\( *\)\/\/ \/\/ //'
endfunction

map <F7> :call CommentToggle()<CR>

Это для / / - комментариев, но вы можете легко адаптировать его для других символов. Вы можете использовать autocmd для установки лидера, как предложил jqno.

Это очень простой и эффективный способ работы с массивами и визуальный режим естественно.


вы можете использовать Vim-комментарий tpope (https://github.com/tpope/vim-commentary) Вы можете использовать его следующим образом:

войти в визуальный режим, нажав

'v'

нажмите клавишу

'j' repeatedly or e.g 4j to select 4 row

теперь все, что вам нужно сделать при выборе, это ввести ключи:

'gc'

это будет комментировать весь выбор, чтобы раскомментировать ключи repead:

'gc'

Я использую vim-multiple-cursors для этого.

  1. чтобы выбрать регион, перейдите к первому символу первой или последней строки региона, чтобы прокомментировать, нажав 0 (это ноль, а не буква "O"). Затем нажмите V и выберите регион с помощью J, K или клавиши со стрелками вверх и вниз.
  2. затем поместите виртуальный курсор на каждую строку выделения, нажав CtrlN.
  3. нажмите клавишу Я для одновременного редактирования каждой строки выделения.

этот ответ здесь, чтобы 1) показать правильный код, чтобы вставить в .vimrc и vim 7.4+ сделать блок комментирования / раскомментирования при сохранении уровня отступа с 1 ярлыком в визуальном режиме и 2), чтобы объяснить это.

вот код:

let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.[ch]    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.cpp    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.py    let b:commentChar='#'
autocmd BufNewFile,BufReadPost *.*sh    let b:commentChar='#'
function! Docomment ()
  "make comments on all the lines we've grabbed
  execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
endfunction
function! Uncomment ()
  "uncomment on all our lines
  execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*//e'
endfunction
function! Comment ()
  "does the first line begin with a comment?
  let l:line=getpos("'<")[1]
  "if there's a match
  if match(getline(l:line), '^\s*'.b:commentChar)>-1
    call Uncomment()
  else
    call Docomment()
  endif
endfunction
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>

как работает:

  • let b:commentChar='//': это создает переменную в vim. the b здесь относится к области, которая в этом случае содержится в буфере, что означает текущий открытый файл. Ваши символы комментариев являются строками и должны быть завернуты в кавычки, кавычки не являются частью того, что будет заменено при переключении комментариев.

  • autocmd BufNewFile,BufReadPost *... : Автокоманды запускают разные вещи, в этом случае они запускаются, когда новый файл или файл чтения заканчивается определенным расширением. После запуска, выполните следующую команду, которая позволяет нам изменить commentChar в зависимости от типа файла. Есть и другие способы сделать это, но они более запутанными для новичков (таких как я).

  • function! Docomment() : функции объявляются, начиная с function и заканчивая endfunction. Функции должны начинаться с большой буквы. the ! гарантирует, что эта функция перезаписывает все предыдущие функции, определенные как Docomment() С этой версией Docomment(). Без !, у меня были ошибки, но это может быть потому, что я определял новые функции через командную строку vim.

  • execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e' : Выполнение вызывает команду. В этом случае мы выполняем substitute, который может принимать диапазон (по умолчанию это текущая строка), например,% для всего буфера или '<,'> для выделенного раздела. ^\s* регулярное выражение соответствует началу строки, за которой следует любое количество пробелов, которое затем добавляется (из-за &). The . здесь используется для конкатенации строк, начиная с escape() не может быть помещено в кавычки. escape() позволяет избежать характер в commentChar что соответствует аргументам (в этом случае \ и /), добавив к ним \. После этого мы снова сцепляемся с концом нашего substitute строка, которая имеет e флаг. Этот флаг позволяет нам молча потерпеть неудачу, что означает, что если мы не найдем совпадение на данной линии, мы не будем кричать об этом. В целом, эта строка позволяет нам поместить символ комментария, за которым следует пробел перед первым текстом, что означает, что мы сохраняем отступ уровень.

  • execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*//e': это похоже на нашу последнюю огромную длинную команду. Уникальный для этого, у нас есть \v, что гарантирует, что нам не придется спасаться от наших () и 1, который относится к группе с нашими (). В принципе, мы сопоставляем строку, которая начинается с любого количества пробелов, а затем наш символ комментария, за которым следует любое количество пробелов, и мы сохраняем только первый набор пробелов. Опять,e позволяет нам не молча, если у нас нет символа комментария на этой строке.

  • let l:line=getpos("'<")[1] - устанавливает переменную так же, как мы сделали с нашим символа комментария, но l относится к локальной области (local к этой функции). getpos() получает положение, в этом случае, начало нашего выделения, и [1] означает, что мы заботимся только о номере строки, а не о других вещах, таких как номер столбца.

  • if match(getline(l:line), '^\s*'.b:commentChar)>-1 : ты знаешь, как if строительство. match() проверяет, содержит ли первая вещь вторую вещь, поэтому мы хватаем строку, на которой мы начали выделение, и проверяем, начинается ли она с пробелов, за которыми следует наш символ комментария. match() возвращает индекс, где это верно, и -1 если совпадений не найдено. С if оценивает все ненулевые числа как истинные, мы должны сравнить наши выходные данные, чтобы увидеть, больше ли он -1. Сравнение в vim возвращает 0, если false и 1, если true, что и есть if хочет видеть правильно оценить.

  • vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr> : vnoremap означает отображение следующей команды в визуальном режиме, но не отображайте ее рекурсивно (то есть не изменяйте другие команды, которые могут использоваться другими способами). В принципе, если вы новичок vim, всегда используйте noremap чтобы убедиться, что вы не ломают вещи. <silent> означает "мне не нужны ваши слова, только ваши действия" и говорит ему ничего не печатать в командной строке. <C-r> это то, что мы сопоставляем, это ctrl+r в этот случай (обратите внимание, что вы все еще можете использовать C-r обычно для "повтора" в обычном режиме с этим сопоставлением). C-u немного запутанно, но в основном это гарантирует, что вы не потеряете визуальную подсветку (согласно ответ это делает вашу команду start '<,'> чего мы и хотим). call здесь просто говорит vim выполнить функцию, которую мы назвали, и <cr> относится к удару . Мы должны ударить его один раз, чтобы фактически вызвать функцию (в противном случае мы только что набрали call function() в командной строке, и мы должны ударить его снова, чтобы наши заменители прошли весь путь (не совсем уверен, почему, но что угодно).

в любом случае, надеюсь, это поможет. Это займет все, что выделено с помощью v, V или C-v, проверьте, прокомментирована ли первая строка, если да, попробуйте раскомментировать все выделенные строки, а если нет, добавьте дополнительный слой символов комментариев к каждой строке. Это мое желаемое поведение; я сделал не просто хочу, чтобы он переключал, была ли каждая строка в блоке прокомментирована или нет, поэтому она отлично работает для меня после прошу несколько вопросы по теме.