Каков быстрый способ комментировать / раскомментировать строки в 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, это удалит все #
символов по вертикали.
для комментирования блока текста почти то же самое:
- сначала перейдите к первая строка, которую вы хотите прокомментировать, нажмите CtrlV. Это поставит редактора в
VISUAL BLOCK
режим. - затем с помощью клавиши со стрелкой и выберите до последней строки
- Теперь нажмите клавишу ShiftЯ, который поставит редактор в
INSERT
режим и нажмите клавишу #. Это добавит хэш в первую строку. - нажмите клавишу 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
вот как я делаю это:
перейдите к первому символу в первой строке, которую вы хотите прокомментировать.
нажмите Ctrl+q в ГВИМ или Ctrl+v в VIM, затем спуститесь, чтобы выбрать первый символ в строках для комментариев.
нажмите клавишу 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.
установка
возбудитель:
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
измените регулярные выражения выше, чтобы удовлетворить ваш вкус относительно того, где #
должно быть:
Я объединил ответ Фила и 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 для этого.
- чтобы выбрать регион, перейдите к первому символу первой или последней строки региона, чтобы прокомментировать, нажав 0 (это ноль, а не буква "O"). Затем нажмите V и выберите регион с помощью J, K или клавиши со стрелками вверх и вниз.
- затем поместите виртуальный курсор на каждую строку выделения, нажав CtrlN.
- нажмите клавишу Я для одновременного редактирования каждой строки выделения.
этот ответ здесь, чтобы 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. theb
здесь относится к области, которая в этом случае содержится в буфере, что означает текущий открытый файл. Ваши символы комментариев являются строками и должны быть завернуты в кавычки, кавычки не являются частью того, что будет заменено при переключении комментариев.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
, проверьте, прокомментирована ли первая строка, если да, попробуйте раскомментировать все выделенные строки, а если нет, добавьте дополнительный слой символов комментариев к каждой строке. Это мое желаемое поведение; я сделал не просто хочу, чтобы он переключал, была ли каждая строка в блоке прокомментирована или нет, поэтому она отлично работает для меня после прошу несколько вопросы по теме.