it-swarm.com.ru

Какой быстрый способ комментировать / раскомментировать строки в 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

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

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

1003
Ethan

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

Как упомянуто в комментарии :

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

163
Manuel Ceron

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

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

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

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

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

Вот две маленькие записи экрана для наглядности.

Комментарий: Comment

Раскомментировать: Uncomment

2136
CMS

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

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

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

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

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

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

Иногда я лежу в удаленной коробке, где мои плагины и .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

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

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

:norm ^x

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

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

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

vnoremap <C-n> :norm

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

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

282
Magnus

В моем .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, чтобы раскомментировать строку (работает как в обычном, так и в визуальном режиме).

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

113
jqno

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

Выявить номера строк:

:set number

затем

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

или это:

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

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

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

  2. Удар Ctrl+q в GVIM или Ctrl+v в VIM, затем перейдите вниз, чтобы выбрать первый символ в строках для комментирования.

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

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

53
Marcin

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

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

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, но это только мои предпочтения. Я также пытался сделать это простым и производительным. Если вы используете автокоманды, вы должны обязательно поместить их в группу автокоманд, иначе обратные вызовы будут добавлены к типу файла несколько раз для каждого загруженного файла и вызовут значительное снижение производительности.

28
user427390

Переключить комментарии

Если все, что вам нужно, это переключать комментарии , я бы предпочел пойти с commentary.vim путем tpope ,.

enter image description here

Installation

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

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 + /, подобно Sublime и Atom.

26
Flavio Wuensche

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

22
Arthur Reutenauer

Вот раздел моего .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 удалить комментарии.

14
innaM

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

Комментировать:

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

Раскомментировать:

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

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

10
Andy

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

9
imagineerThat

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

#code code
#code
#code code code

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

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

code code
code
code code code

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

I//Esc

Это заглавная буква I, // и Escape.

Когда вы нажимаете ESCвсе выделенные строки получат указанный вами символ комментария.

9
Ivor Scott

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

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

9
Rick

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

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

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

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

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

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

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

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

nnoremap <silent> cc  :set opfunc=CommentOut<cr>[email protected]
vnoremap <silent> cc  :<c-u>call  CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu  :set opfunc=Uncomment<cr>[email protected]
vnoremap <silent> cu  :<c-u>call  Uncomment(visualmode(), 1)<cr>

(См. Руководство об операторе [email protected] и переменной 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

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

7
n.r.

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

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

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

6
SDGator

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

5
uckelman

Я использую плагин Тима Поупа vim-commentary .

4
Jim Stewart

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

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 . ' \1/'
    execute ':silent! s/^\( *\)' . b:comment_leader . ' \?' . b:comment_leader . ' \?/\1/'
endfunction
map <F7> :call CommentToggle()<CR>
4
mathewguest

Этот ответ здесь: 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*/\1/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. b здесь относится к области, которая в данном случае содержится в буфере, то есть к текущему открытому файлу. Ваши символы комментариев являются строками и должны быть заключены в кавычки, кавычки не являются частью того, что будет подставлено при переключении комментариев.

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

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

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

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

  • let l:line=getpos("'<")[1]: устанавливает переменную так же, как мы делали с нашим комментарием, но l относится к локальной области (локальной для этой функции). 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 немного сбивает с толку, но в основном он гарантирует, что вы не потеряете свою визуальную подсветку (согласно этот ответ она заставляет вашу команду начинаться с '<,'>, что нам и нужно). call здесь просто говорит vim выполнить функцию, которую мы назвали, а <cr> указывает на нажатие кнопки enter. Мы должны нажать ее один раз, чтобы фактически вызвать функцию (в противном случае мы просто набрали call function() в командной строке, и нам нужно нажать ее снова, чтобы наши заменители прошли весь путь (не совсем понятно, почему, но как угодно) ,.

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

4
jeremysprofile

Существует этот плагин, изменяющий жизнь с помощью tpope, который называется vim-commentary

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

Этот плагин обеспечивает :

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

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

  • Установить через Vundle (или, я думаю, Pathogen).
  • Выделите текст и нажмите : который будет отображаться как :<,'>
  • Введите Комментарий здесь :<,'>Commentary и нажмите Enter,.
  • Boom. Твой готовый бутон.
4
Weston Ganger

Я использую comments.vim от Jasmeet Singh Anand (найден на 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  комментировать одну строку
  • CtrlX  откомментировать одну строку
  • ShiftV и выберите несколько строк, затем CtrlC комментировать выделенные несколько строк
  • ShiftV и выберите несколько строк, затем CtrlX откомментировать выделенные несколько строк
3
Ronan

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

В Ruby или Bash, с двумя пробелами:

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

В C/C++ или PHP с 4 пробелами:

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

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

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

set cindent
set formatoptions=tcqr

... Что хорошо сочетается с использованием V[move]gq для повторного переноса Word.

3
eukras

Вот основная однострочная строка, основанная на C-v, за которым следует метод I, описанный выше.

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

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

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

Например. если выбран следующий текст:

1
2

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

//1
//2
3
bgran

Начав с идей в ответах здесь, я запустил собственную функцию комментирования. Он включает и выключает комментарии. Он может обрабатывать такие вещи, как //print('blue'); //this thing is blue и просто переключать первый комментарий. Кроме того, он добавляет комментарии и один пробел именно там, где находится первый не пробел, а не в самом начале строки. Кроме того, он не копирует пробелы без необходимости, а использует масштабирование (: 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>
3
mike

Этот простой фрагмент взят из моего .vimrc:

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

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

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

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

2
Phil

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

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

'v'

Затем нажмите

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

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

'gc'

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

'gc'
2
Kingsley Ijomah

Я использую vim-множественные курсоры для этого.

  1. Чтобы выбрать регион, перейдите к первому символу первой или последней строки региона, который нужно закомментировать, нажав  (это ноль, а не буква "о"). Затем нажмите V и выберите регион, используя JK или клавиши со стрелками вверх и вниз.
  2. Затем поместите виртуальный курсор в каждую строку выбора, нажав CtrlN,.
  3. Затем нажмите I одновременно редактировать каждую строку выбора.
2
nrz

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

Commentify использует настройку commentstring, чтобы решить, как закомментировать блок кода, поэтому вам не нужно сохранять отображение разных типов комментариев в вашей конфигурации, и поддерживает как строчные комментарии (например, //), так и комментарии блока (например, , /* */).

Он также отображает тот же ярлык (по умолчанию ctrl+c) для комментирования и раскомментирования блока, так что вам не нужно запоминать два отображения или сложный набор команд.

1
Jaymon

Мне нравится /* ... */ (коментарии), так что вот мой трюк для вас. Конечно, вы можете адаптировать его для использования в разных случаях.


Комментарий с/* ... * /

Выделите текст (перейти к началу, запустить визуальный блок, перейти с помощью }):

<c-V>}

Введите команду, которая будет применена в выборе

:norm i/* <c-v><esc>$a */

Команда будет выглядеть так: :'<,'>norm i /* ^[$a */

Смотрите (я *) для деталей.


Раскомментируйте/* ... * /

Выделите текст (как и прежде, или как вам нравится):

<c-V>}

Введите команду, которая будет применена в выборе

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

Команда будет выглядеть так: :'<,'>norm :s-\s*/\*\s*-^M$bbld$

Смотрите (ii *) для деталей.


Result

Эффект - комментарии построчно:

Comment block
Comment block
Comment block

Становится (и наоборот):

/* Comment block */
/* Comment block */
/* Comment block */

Лучше сохранить его как map или @reg в вашем .vimrc, потому что его много печатать. Если вы предпочитаете один /* и */ всему блоку, используйте:

Комментарий с одним/* */целым блоком

Сохраните его в реестре, записав, скажем, qc, а затем в начале абзаца прокомментируйте:

v}di/*  */<esc>hhhp

и не забудьте снова q, чтобы закончить запись.

Смотрите (iii *) для деталей.


Раскомментировать один/* */из блока

Сохраните его в реестре, скажем, @u. Поместите курсор в любое место внутри блока и:

?/\*<enter>xx/\*/<enter>xx

Сохраните регистр, выполнив команду q.

Смотрите (iv *) для деталей.


Result

Эффект - один комментарий для нескольких строк:

Comment block
Comment block
Comment block

Становится (и наоборот):

/* Comment block
Comment block
Comment block */

Пояснения

(i *) Он работает с использованием norm, который неоднократно применяет одну и ту же команду в каждой выбранной строке. Команда просто вставляет /*, находит конец этой строки и завершает, вставляя */

:norm i/* <c-v><esc>$a */

(ii *) Он также использует norm, чтобы повторять поиск/замену в каждой строке. Ищите spaces /* spaces и ничего не заменяйте. После этого находит конец строки, вернет два слова, справа букву, удалите до конца.

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

(iii *) Выбирает абзац с помощью v}, удаляет его, вставляет и открывает комментарий, переходит к его середине и вставляет удаленный блок.

v}di/*  */<esc>hhhp

(iv *) Где-нибудь посередине, находит назад /*, удаляет его; находит вперед */, удаляет его.

?/\*<enter>xx/\*/<enter>xx
1
Dr Beco

Очень хороший вопрос, но не так много хороших ответов imho. Во-первых, я бы сказал, что использование режима вставки блока - это не простое решение, просто слишком много нажатий клавиш, поэтому очевидно, что он должен работать на выбранных строках, чтобы улучшить производительность редактирования кода. Еще один момент, о котором никто не упоминает: где следует размещать знак комментария - в самом начале строки или перед реальным текстом? Возможно, это дело вкуса, но, на мой взгляд, его следует поместить перед текстом, чтобы код был читабельным: когда знак комментария помещается в самом начале строки, он нарушает визуальную согласованность кода с отступом, поэтому он выглядит как маркированный список. Имея это в виду, я получил следующее решение (я делаю пример для # comment). В моем vimrc:

vnoremap 1 :s:^\(\s*\)\([^#\t ]\):\1#\2:e<CR>
vnoremap 2 :s:^\(\s*\)#\(\s*\):\1\2:e<CR>

Ключ 1 вставляет # перед текстом (после пробела) в каждую выделенную строку. Он проверяет, есть ли уже #, чтобы не вставлять # дважды. А также игнорирует пустые строки.
Ключ 2 удаляет один #. Это также сохраняет комментарии на правой стороне строки в безопасности.


Обновление : вот пример того, как сделать зависимую от типа файла команду переключения комментария. Чтобы узнать больше об этом, прочитайте: http://learnvimscriptthehardway.stevelosh.com/chapters/14.html

Просто, чтобы это сработало, поместите следующие строки в ваш файл .vimrc.

" build the whole regex search/replace command
function! Build()
    let b:Comment_ON='''<,''>s:^\(\s*\)\([^\t ]\):\1' . b:cs . '\2:e'
    let b:Comment_OFF='''<,''>s:^\(\s*\)' . b:cs . '\(\s*\):\1\2:e'
endfunction

" run this group on Filetype event
augroup SetCS
    autocmd!
    "default comment sign
    autocmd FileType * let b:cs='--'
    "detect file type and assign comment sign
    autocmd FileType python,Ruby let b:cs='#'
    autocmd FileType c,cpp,Java,javascript,php let b:cs = '\/\/'
    autocmd FileType vim let b:cs='"'
    autocmd FileType * call Build()
augroup END

vnoremap 1 :<C-u>execute b:Comment_ON<CR>
vnoremap 2 :<C-u>execute b:Comment_OFF<CR>
1
Mikhail V

Лично мне не нравится функция "переключения" комментариев, поскольку она уничтожает комментарии, которые уже включены в код. Кроме того, я хочу, чтобы символ комментария появлялся слева, всегда, чтобы я мог легко видеть блоки комментариев. Также я хочу, чтобы это работало вложенно (если я сначала закомментирую блок, а затем включающий блок). Поэтому я немного изменил одно из решений. Я использую F5, чтобы комментировать, и Shift -F5, чтобы раскомментировать. Также я добавил/g в конце команды s /:

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 = '"'
autocmd FileType nasm             let b:comment_leader = ';'

function! CommentLine()
    execute ':silent! s/^\(.*\)/' . b:comment_leader . ' \1/g'
endfunction

function! UncommentLine()
    execute ':silent! s/^' . b:comment_leader . ' //g'
endfunction

map <F5> :call CommentLine()<CR>
map <S-F5> :call UncommentLine()<CR>
0
Flo

Комментировать строку (для всех языков):

  • noremap <silent> ,// :call CommentLine() <CR>

Мы можем вызвать его с количеством строк и в визуальном режиме тоже работает. Как: для комментирования четырех строк используйте 4, // и для раскомментирования используйте 4, /.

Раскомментировать строку (для всех языков):

  • noremap <silent> ,/ :call UnCommentLine() <CR>

Если Вы хотите добавить новый символ [комментарий], то добавить список и добавить несколько строк в функцию. Если вы хотите добавить язык с символом комментария , который уже определен в одном из списков, просто добавьте название своего языка в соответствующем списке (Чтобы получить правильное имя: Откройте файл в vim и используйте : установите ft , чтобы получить правильное имя для вашего языка).

Определение CommentLine ()

function! CommentLine() let slash_ft_list = ['c' , 'cpp', 'Java', 'scala' , 'systemverilog' , 'verilog' , 'verilog_systemverilog'] let hash_ft_list = ['sh' , 'Ruby' , 'python' , 'csh' , 'conf' , 'fstab' , 'Perl'] let perct_ft_list = ['tex'] let mail_ft_list = ['mail'] let quote_ft_list = ['vim'] if (index(slash_ft_list, &ft) != -1) :norm I// elseif (index(hash_ft_list, &ft) != -1) :norm I# elseif (index(perct_ft_list, &ft) != -1) :norm I% elseif (index(mail_ft_list, &ft) != -1) :norm I> elseif (index(quote_ft_list, &ft) != -1) :norm I" endif endfunction

Определение UnCommentLine ()

function! UnCommentLine() let slash_ft_list = ['c' , 'cpp', 'Java', 'scala' , 'systemverilog' , 'verilog' , 'verilog_systemverilog'] let hash_ft_list = ['sh' , 'Ruby' , 'python' , 'csh' , 'conf' , 'fstab' , 'Perl'] let perct_ft_list = ['tex'] let mail_ft_list = ['mail'] let quote_ft_list = ['vim'] if (index(slash_ft_list, &ft) != -1) :norm ^2x elseif (index(hash_ft_list, &ft) != -1) :norm ^x elseif (index(perct_ft_list, &ft) != -1) :norm ^x elseif (index(mail_ft_list, &ft) != -1) :norm ^x elseif (index(quote_ft_list, &ft) != -1) :norm ^x endif endfunction

0
AnuragChauhan

:% s/^/\/\// g

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

0
chandramohan harkude

Решение @ CMS является наиболее "родным" способом комментирования строк ввода/вывода. На втором шаге @ CMS, после CtrlVВы также можете использовать r# добавить комментарии или x удалить их. Drew Neil's Practical Vim , страница 46, хорошо объясняет эту технику.

Другим хорошим вариантом является использование команды ex mode. :[спектр]normali##, Очевидно, чтобы сохранить нажатия клавиш с этим, вам нужно закомментировать 15+ строк.

0
jfmercer
"comment (cc) and uncomment (cu) code 
noremap   <silent> cc      :s,^\(\s*\)[^# \t]\@=,\1# ,e<CR>:nohls<CR>zvj
noremap   <silent> cu      :s,^\(\s*\)# \s\@!,\1,e<CR>:nohls<CR>zvj

Вы можете комментировать/раскомментировать одну или несколько строк с #. Чтобы сделать несколько строк, выберите строки, затем нажмите ярлык cc/cu или введите число, затем cc/cu, например, 7cc прокомментирует 7 строк от курсора.

Я получил исходный код этого человека от Какой самый элегантный способ комментировать/раскомментировать блоки кода Ruby в Vim? и сделал несколько небольших изменений (изменил сочетания клавиш и добавил пробел после #).

0
konyak

Я лично хотел комментировать а-ля Visual Studio. Я так привык к этому на работе, что он забрал мою мышечную память (используя всвим). использование shift+v выберите нужные строки и нажмите ctrl+kctrl+c комментировать или Ctrl+kCtrl+u раскомментировать.

:vnoremap <C-k><C-c> :norm i//<Cr>
:vnoremap <C-k><C-u> :s/\/\///g<Cr>:noh<Cr>
0
scx

Чтобы раскомментировать весь файл:

  1. Esc выходит из режима вставки
  2. gg идет к первому символу в первой строке
  3. ctrl+V или ctrl+shift+v выбирает текущий символ
  4. G или shift+g идет к последней строке
  5. x удаляет выделение
0
JSON C11
:g/.spare[1-9].*/,+2s/^/\/\//

Приведенный выше код закомментирует все строки, которые содержат "запасные" и число после этого, плюс он закомментирует еще две строки из строки, в которой это было найдено. Чтобы узнать больше о таких целях, посетите: http://vim.wikia.com/wiki/Search_and_replace#Details

0
Mohit Kumar

Доступно несколько плагинов vim, таких как Tcomment и nerdcommenter.

Я использую tcomment для комментирования.

gcc: будет переключать комментарий к текущей строке. v {motion} gc: переключает комментирование диапазона визуально выбранных строк

Пример: v3jgc переключит область из 3 строк.

Эти команды могут работать с комментариями на любом языке.

0
dvk317960

Это решение отображает/комментирует и? чтобы раскомментировать (переключение комментариев с использованием одного отображения слишком сложно для правильной реализации). Он принимает строки комментариев из встроенной опции VIM commentstring, которая заполняется из таких файлов, как /usr/share/vim/vim*/ftplugin/*.vim, если объявлен filetype plugin on.

filetype plugin on
autocmd FileType * let b:comment = split(&commentstring, '%s', 1)
autocmd FileType * execute "map <silent> <Leader>/ :normal 0i" . b:comment[0] . "<C-O>$" . b:comment[1] . "<C-O>0<CR>"
autocmd FileType * execute "map <silent> <Leader>? :normal $" . repeat('x', strlen(b:comment[1])) . "0" . strlen(b:comment[0]) . "x<CR>"
0
sgtpep