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

4.11.2009 21:06:32
Принятый ответ должен быть заменен одним из ответов с подробными инструкциями о том, как выполнять комментирование / раскомментирование блоков без использования плагина. Текущий принятый ответ в основном только ссылка на сторонний плагин.
faintsignal 7.09.2017 22:13:05
Ответ с лучшим рейтингом не содержит плагинов, @rationalis ваш комментарий вводит в заблуждение, пожалуйста, исправьте или удалите его, спасибо.
bonobo 9.06.2019 13:57:54
30 ОТВЕТОВ
РЕШЕНИЕ

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

Как уже упоминалось в комментариях :

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

180
29.06.2018 04:01:49
Интересно! Я читаю Док и нахожу там "сексуальный комментарий" - просто используйте "\ cs". Для Ruby он будет использовать =beginи =endкомментировать несколько строк вместо хеш-тегов.
Hegwin 11.08.2017 03:59:12
Я думаю, что это не самый быстрый способ сделать это с vim, так как для этого требуется установить плагин. Также лучший ответ уже получил больше голосов, но он не был помечен как решение.
whirmill 10.07.2018 10:17:08
Не останавливайся здесь. Большинство проголосовавших ответов ниже без каких-либо плагинов. stackoverflow.com/a/15588798/2117868 и stackoverflow.com/a/1676690/2117868
kuttumiah 24.07.2018 00:13:02
@ whirmill Я думаю, что «лучший» действительно зависит от варианта использования. Режим визуального блока работает быстрее, если я хочу один раз в жизни переключать комментарии. Но если я не возражаю против установки плагина и хочу сделать как можно меньше нажатий клавиш, чтобы переключать комментарии, и не нужно различать операции между добавлением или удалением комментариев - тогда это может быть «лучшим ответом».
Carolus 7.11.2019 13:53:39
@Carolus Я бы согласился с вами, если бы вопрос начинался с «как лучше», а не «как быстро».
whirmill 11.11.2019 13:51:15

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

7
4.11.2009 21:09:31
на самом деле это должно быть: n, ms / ^ \ s. # // Потому что у вас может быть начальный пробел, и вы не можете следовать за хешем с одним
Skip Huffman 8.01.2013 14:25:59

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

17
4.11.2009 21:10:43
Это очень полезно для начинающего, как научиться писать самостоятельно .vimrc.
coolesting 6.10.2011 02:44:43
mapохватывает нормальный и визуальный режимы, поэтому вам не нужны vmapлинии
doubleDown 7.06.2013 09:35:41
Лучшее место в after/ftplugin/ruby.vim.
Santosh Kumar 29.08.2013 16:41:57
также использовать <leader>icи<leader>rc
Hans Kristian 25.08.2016 18:04:26

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

25
4.11.2009 21:41:09

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

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

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

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

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

58
29.03.2013 19:57:11
cудаляет также первый символ. Ответ CMS имеет правильное значение, т.е. нажмите, Iзатем напечатайте символ (ы) комментария и затем Esc(это на windows vim)
Samaursa 16.02.2012 17:08:32
Это работает, за исключением того, что на третьем шаге нужно нажать «r», а не «c».
David Baucum 11.11.2014 16:52:26
в качестве альтернативы вы можете нажать ESCдважды после нажатия, cи это должно сделать трюк
nihiser 2.09.2015 23:26:41
Все эти параметры разрушительны для первого символа в строке.
Josiah 20.04.2018 15:22:04

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

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

121
23.05.2017 10:31:37
Какой ярлык я должен использовать? Я не могу точно убедиться из самого кода VIM!
gideon 23.08.2013 17:34:11
в обычном или визуальном режиме используйте «, cc» (последовательность из 3 символов), чтобы прокомментировать текущую строку, и «, cu», чтобы раскомментировать текущую строку.
Dan 13.09.2013 08:26:00
мне это нравится :)! Спасибо! С другой стороны, мне трудно это объяснить. a) она переназначает команду (не рекурсивно [см. это] ( stackoverflow.com/questions/3776117/… )), поэтому теперь, когда вы нажимаете, cc the: ... вещь выполняется. b) теперь это в основном sed (s) Команда / what / towhat / where) изменяет ^ (начало строки) на правильно заданный символ комментария в зависимости от типа файла, который вы открыли в), а для тихих вещей они просто подавляют вывод команд. d): nohlsearch мешает ему выделить поиск sed
ramrunner 22.09.2013 12:05:24
Обратите внимание, что это неправильный способ загрузки автокоманд. Они должны быть внутри группы, иначе они будут добавлены в vim несколько раз и вызовут много замедлений. См .: learnvimscriptthehardway.stevelosh.com/chapters/14.html . Я добавил свой ответ на этот вопрос.
user427390 4.06.2014 20:28:23
Ницца. Это фактический ответ на мой вопрос о том, как (не) комментировать, пока у вас есть выбор блока.
Erwin Rooijakkers 29.08.2014 22:27:38

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

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

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

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

Для урезанной версии vim, поставляемой с Debian / Ubuntu по умолчанию, введите : s/^/#третий шаг (любое оставшееся выделение первого символа каждой строки можно удалить с помощью :nohl).

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

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

Раскоментируйте: Раскоментируйте

2507
7.10.2019 19:25:12
По умолчанию это CTRL + V. Версия gvim для Windows использует Ctrl + Q, потому что Ctrl + V уже используется для вставки.
R. Martinho Fernandes 4.11.2009 21:40:11
@amindfv Ctrl + V, n(где n - количество строк - 1), j, n(где n - количество длин последовательности символов комментария - 1), l, x.
michael.bartnett 15.12.2012 21:09:03
Как бы вы сделали это с «//»?
AustinT 28.01.2014 04:27:33
Вы можете нажать Esc два раза, чтобы не ждать этой секунды;)
Ahmed Hegazy 15.01.2015 12:40:14
Это не сработало для меня. Shift-я перешел в простой режим вставки.
Geremia 14.02.2016 01:55:02

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

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

9
4.11.2009 21:31:11

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

vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR> 
6
4.11.2009 21:41:23

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

7
4.11.2009 21:46:34
"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
23.05.2017 10:31:37

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

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

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

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

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

2
9.11.2012 11:39:02

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

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

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

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

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

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

  • нажмите dили, xчтобы удалить символы, при необходимости повторно
816
16.04.2020 21:41:26
@amelia: ярлык комментирования не работает для меня. Shift + я взял меня, чтобы вставить режим. Зависит ли это от версии vim?
user3527975 19.01.2016 19:20:42
Почему это занимает секунду?
Conor Patrick 22.02.2016 22:36:29
Единственная проблема, с которой я сталкиваюсь в этом ответе, заключается в том, что он говорит вам использовать клавиши со стрелками .
cozyconemotel 11.05.2016 10:38:41
Вместо этого дважды нажмите Esc. :)
Aaron Alphonsus 11.02.2017 00:43:09
Сначала включение комментариев не работало для меня, но после прочтения это снова сработало: 1. убедитесь, что вы используете Ctrl-V, а не V для выделения 2. при вставке вы увидите, что вы изменяете только одну строку 3. все вставки происходят, когда вы
timurb 26.02.2018 14:42:00

Я использую 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
30.03.2018 19:45:39

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

Покажите номера строк:

:set number

тогда

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

или это:

:%s/^/#/        will comment out all lines in file
117
5.10.2017 09:59:50
Так как вы просто меняете 1-й символ каждой строки, вам не нужна буква "g" в конце
Magnus 8.05.2014 13:38:40
Некоторые vims на встроенных коробках (например, openwrt) не имеют визуального режима .. Так что это
kim0 31.07.2015 11:15:03
Вы можете объяснить, почему :%s/^/#/gзакомментируйте все строки? Мне было интересно знак процента%
Bin 17.09.2015 15:56:00
И чтобы раскомментировать эти строки, вы можете написать: 5,17s / ^ # /
Iraklis Moutidis 25.07.2016 14:36:15
Большой! Это действительно хорошо работает с выбором блоков, например: va{или с varрубином.
Artur Małecki 29.11.2017 00:52:05

Как раскомментировать следующие три строки в 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
30.03.2018 19:43:54
если вы пропустите «верхний левый» хеш, вы можете нажать o , чтобы переместить курсор в «другую сторону» в визуальном режиме.
dylnmc 29.11.2016 20:19:57
Я думаю, что это лучше всего использовать. Не нужно никаких третьих лиц, просто используйте родной vim
Ardi Nusawan 12.08.2018 14:58:43
Лучший ответ, просто и без каких - либо третьих лиц
aze 23.08.2018 14:43:06

Нажмите ctrl+, vзатем используйте или, чтобы выбрать количество строк для комментария. Затем нажмите shift+ I, нажмите, #а затем ESC. Это закомментирует количество выбранных вами строк.

Обратное для раскомментированных строк.

-2
8.01.2014 07:03:50
Добро пожаловать в StackOverflow Ravikumar. Обратите внимание, что ваш ответ является точной копией существующего ответа ( stackoverflow.com/a/15588798/430128 ). Ваши усилия будут более цениться, если вы не копируете содержание существующего ответа без внесения каких-либо новых идей.
Raman 8.01.2014 06:44:09
Вместо того, чтобы публиковать тот же ответ, что и другие, вы можете попробовать сами.
San Krish 8.01.2014 06:46:25

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

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

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

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

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

0
8.01.2014 19:54:33

Решение @ CMS - самый «родной» способ комментировать строки ввода / вывода. На втором шаге @ CMS CtrlVвы также r#можете добавить комментарии или xудалить их. Практический Vim Дрю Нейла , стр. 46, хорошо объясняет эту технику.

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

0
25.01.2014 21:57:35

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

4
31.01.2014 19:01:07

Я объединил ответ Фила и 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>
5
7.03.2014 09:33:28

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

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

:norm ^x

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

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

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

vnoremap <C-n> :norm

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

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

329
13.11.2018 11:25:37
Я думал, что это был путь, пока я не прокрутил, чтобы прочитать этот ответ stackoverflow.com/a/1676690/850996 Выбор блока с помощью CTRL + V (в отличие от выбора строки с помощью SHIFT + V) дает намного более хороший контроль над тем, где комментарий вставка символов происходит.
Shyam Habarakada 1.08.2014 18:03:25
@Shyam Метод ctrl-v в сочетании со специальными командами только для выбора блоков - это то, что рекомендует большинство других ответов; однако лично я нахожу описанную мной технику «нормы» более простой, поскольку она не вводит никакого нового синтаксиса, кроме самой команды нормы, поэтому я могу использовать то, что я уже знаю о vim.
Magnus 2.09.2014 17:40:13
Полезно сказать, что для раскомментирования отступа блока :norm ^x. Этот метод в целом имеет преимущество работы с выбором области (например vi{, выбирает внутри фигурных скобок). Такие селекторы текстовых объектов не работают с Visual Block.
ivan-k 24.12.2014 08:20:51
Ах, я только что разобрался - на centos 6 /bin/viесть vim 7.2, но он отличается от сборки /usr/bin/vim, и у него такие функции отключены.
rakslice 7.10.2015 22:34:39
Это, безусловно, лучший ответ. Особенно в сочетании с vipвыбором целого абзаца.
meh 9.10.2018 17:05:04

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

35
24.09.2016 03:00:12
Я абсолютно новичок в vim, какую кнопку я должен нажать, чтобы переключить сопоставленную функцию? Что это за <leader><Space>декларация внизу?
Jens Kohl 16.06.2014 12:11:25
Вы можете заменить <leader> ключом вроде <,>. Затем вы нажимаете, ПРОБЕЛ, и это переключит состояние комментария строки. Лидер, каким бы ни был ваш лидер, по умолчанию <Vim> в Vim по умолчанию \, но вы можете установить свой собственный, например, «let mapleader = ','»
user427390 16.06.2014 23:36:59
Отличный ответ, хотя одно раздражение, комментируя блоки, у которых уже есть некоторые комментарии, поменяется местами закомментированные строки без комментариев. QtCreator, например, удаляет комментарии только в том случае, если все непустые строки имеют начальные комментарии, в противном случае добавьте ведущий комментарий.
ideasman42 24.09.2016 02:57:31
Я сделал немного другую версию , используя \zsи \zeрегулярное выражение трюк, код стал немного меньше. Вы можете увидеть это здесь
SergioAraujo 4.03.2018 22:34:01

Начав с идей в ответах здесь, я запустил собственную функцию комментирования. Он включает и выключает комментарии. Он может обрабатывать такие вещи, как //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
24.03.2018 11:52:19
Я сделал немного другую версию вашего решения, которая также восстанавливает положение курсора, я хотел бы узнать ваше мнение об этом. на github
SergioAraujo 23.03.2018 13:53:09
Круто. Вы можете отредактировать мой пост и добавить свое решение (из-за сходства)!
mike 23.03.2018 15:50:35
Это изменилось, чтобы избежать обратной косой черты c, cpp, java и использования другого разделителя в подстановках, чтобы избежать E488. Также меняется интервал для java, cpp, потому что комментарии имеют три символа, // плюс пробел, это делает l: space.
SergioAraujo 24.03.2018 10:27:52

пометить текстовую область командой mark сказать ma и команду типа mb:: 'a,' bg /(.*)/ s //// \ 1 /

Вы можете увидеть пример такого рода тестовых манипуляций на http://bknpk.ddns.net/my_web/VIM/vim_shell_cmd_on_block.html.

-2
27.12.2014 15:36:48

Мне лично не нравится функция «переключения» комментариев, поскольку она уничтожает комментарии, которые уже включены в код. Кроме того, я хочу, чтобы символ комментария появлялся слева, всегда, чтобы я мог легко видеть блоки комментариев. Также я хочу, чтобы это работало вложенно (если я сначала закомментирую блок, а затем включающий блок). Поэтому я немного изменил одно из решений. Я использую 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
30.01.2015 21:16:55

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

  1. Чтобы выбрать регион, перейдите к первому символу первой или последней строки региона, который нужно закомментировать, нажав 0(это ноль, а не буква «о»). Затем нажмите Vи выберите регион , используя J, Kили вверх и вниз клавиши со стрелками.
  2. Затем наведите курсор на каждую строку выделения, нажав CtrlN.
  3. Затем нажмите, Iчтобы одновременно редактировать каждую строку выбора.
2
11.08.2015 06:21:01
Это не работает здесь, когда я нажимаю Ctrl+, Nон выбирает строку ниже.
Gerep 10.08.2015 17:09:15
@Gerep У вас установлены vim-множественные курсоры ? Если да, у вас есть последняя версия vim-множественных курсоров? Вы перешли к первому символу первой или последней строки, которая должна быть закомментирована / не закомментирована нажатием 0? Затем вы выбирали строки, которые должны быть закомментированы / некомментированы, в визуальном режиме (нажатием Vили Ctrl+ Vдля входа в визуальный режим, затем Jили, Kчтобы выбрать все строки, которые вы хотите закомментировать / раскомментировать) перед тем, как нажать Ctrl+ N?
nrz 11.08.2015 06:19:46
Ой!!! Мне очень жаль, я думал, что vim-множественные курсоры - это встроенная функциональность, теперь она работает, спасибо =)
Gerep 11.08.2015 10:05:39
Просто для меня работает с: <C-v>\d<cr><C-n>i#<cr>. Спасибо за совет.
Alexander Borisov 22.08.2016 11:43:41

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

В 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чтобы переделать перенос слов.

3
30.03.2018 19:48:03

Очень хороший вопрос, но не так много хороших ответов 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>
0
9.08.2015 02:37:12
Блок вставок - хорошее решение для редактирования файлов на удаленных серверах. Если большинство ваших правок являются локальными, вы можете использовать другие подходы - фрагменты (например, ваши) или плагины.
timurb 26.02.2018 14:50:04

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

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

'v'

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

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

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

'gc'

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

'gc'
3
14.05.2015 06:03:26