У меня есть файл кода 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 ( -#
).
Ответы:
Я использую скрипт NERD Commenter . Это позволяет вам легко комментировать, раскомментировать или переключать комментарии в вашем коде.
Как уже упоминалось в комментариях :
источник
=begin
и=end
комментировать несколько строк вместо хеш-тегов.Для этих задач я использую большую часть выбора временного блока .
Наведите курсор на первый
#
символ, нажмите CtrlV(или CtrlQдля gVim) и спускайтесь до последней прокомментированной строки и нажмите x, чтобы удалить все#
символы по вертикали.Для комментирования блок текста практически одинаков:
VISUAL BLOCK
режим.INSERT
режим, а затем нажмите# . Это добавит хеш к первой строке.#
символ во все остальные выделенные строки.Для урезанной версии vim, поставляемой с debian / ubuntu по умолчанию, введите
: s/^/#
третий шаг (любое оставшееся выделение первого символа каждой строки можно удалить с помощью:nohl
).Вот две маленькие записи экрана для наглядности.
Комментарий:
Раскоментируйте:
источник
n
(где n - количество строк - 1), j,n
(где n - количество длин последовательности символов комментария - 1), l, x.Чтобы закомментировать блоки в vim:
%
Чтобы раскомментировать блоки в vim:
Если вы хотите выбрать несколько символов, используйте один или объедините эти методы:
источник
Иногда я лежу в удаленной коробке, где мои плагины и .vimrc не могут мне помочь, или иногда NerdCommenter ошибается (например, JavaScript встроен в HTML).
В этих случаях низкотехнологичной альтернативой является встроенная
norm
команда, которая просто запускает любые произвольные команды vim в каждой строке в указанном вами диапазоне. Например:Комментируя с
#
:Это вставляет «#» в начале каждой строки. Обратите внимание, что при вводе: диапазон будет заполнен, поэтому он действительно будет выглядеть
:'<,'>norm i#
Раскомментировать
#
:Это удаляет первый символ каждой строки. Если бы я использовал комментарий из двух символов, например //, я бы просто
:norm xx
удалил оба символа.Если комментарии с отступом, как в вопросе OP, вы можете закрепить удаление следующим образом:
что означает «перейти к первому непробельному символу, затем удалить один символ». Обратите внимание, что в отличие от выбора блока, этот метод работает, даже если комментарии имеют неравные отступы!
Примечание : с
norm
буквально просто выполняются обычные команды vim, вы не ограничены комментариями, вы также можете сделать несколько сложных изменений для каждой строки. Если вам нужен escape-символ как часть вашей последовательности команд, введите ctrl-v, затем нажмите клавишу escape (или даже проще, просто запишите быстрый макрос и затем используйте norm для выполнения этого макроса в каждой строке).Примечание 2 : Конечно, вы также можете добавить отображение, если вы используете
norm
много. Например, поместив следующую строку в ~ / .vimrc, вы сможете печататьctrl-n
вместо:norm
того, чтобы делать визуальный выборПримечание 3 : Vim иногда не имеет
norm
команды, скомпилированной в нее, поэтому обязательно используйте расширенную версию, т.е. обычно / usr / bin / vim, а не / bin / vi(Спасибо @Manbroski и @rakslice за улучшения, включенные в этот ответ)
источник
:norm ^x
. Этот метод в целом имеет преимущество работы с областями выбора (напримерvi{
, выберет фигурные скобки). Такие селекторы текстовых объектов не работают сVisual Block
./bin/vi
есть vim 7.2, но он отличается от сборки/usr/bin/vim
, и у него такие функции отключены.vip
выбором целого абзаца.У меня есть следующее в моем
.vimrc
:Теперь вы можете набрать,
,cc
чтобы прокомментировать строку и,cu
раскомментировать строку (работает как в обычном, так и в визуальном режиме).(Я украл его с какого-то сайта много лет назад, поэтому я не могу полностью объяснить, как он работает :). Есть комментарий, где это объясняется.)
источник
Укажите, какие строки комментировать в vim:
Покажите номера строк:
тогда
или это:
источник
:%s/^/#/g
закомментируйте все строки? Мне было интересно знак процента%
va{
или сvar
рубином.Вот как я это делаю:
Перейти к первому символу в первой строке, которую вы хотите закомментировать.
Нажмите Ctrl+ qв GVIM или Ctrl+ vв VIM, затем нажмите вниз, чтобы выбрать первый символ в строках для комментариев.
Затем нажмите cи добавьте символ комментария.
Раскомментирование работает так же, просто введите пробел вместо символа комментария.
источник
c
удаляет также первый символ. Ответ CMS имеет правильное значение, то есть нажатие,I
затем ввод символов комментария и затемEsc
(это на windows vim)ESC
дважды после нажатия,c
и это должно сделать трюкЯ придумала простое дополнение к моему файлу .vimrc, которое работает довольно хорошо и может быть легко расширено. Вы просто добавляете новый тип файла в comment_map и его лидер комментариев.
Я добавил отображение в обычный и визуальный режимы, но вы можете переназначить все что угодно. Я предпочитаю использовать только функцию стиля «тумблер». Один имеет несколько отображений и т. Д.
Замечания:
Я не использую обратные вызовы или хуки для типов файлов / загрузки, потому что я считаю, что они замедляют запуск Vim больше, чем
.vimrc
статическая функция / карта, но это только мои предпочтения. Я также пытался сделать это простым и производительным. Если вы используете автокоманды, вы должны обязательно поместить их в группу автокоманд, иначе обратные вызовы будут добавлены к типу файла несколько раз для каждого загруженного файла и вызовут значительное снижение производительности.источник
<leader><Space>
декларация внизу?\zs
и\ze
регулярное выражение трюк, код стал немного меньше. Вы можете увидеть это здесьПереключить комментарии
Если все, что вам нужно, это переключать комментарии, я бы предпочел использовать commentary.vim от tpope .
Установка
Возбудитель:
ВИМ-штекер:
Vundle:
Дальнейшая настройка
Добавьте это в ваш файл .vimrc:
noremap <leader>/ :Commentary<cr>
Теперь вы можете переключать комментарии, нажимая
Leader
+/
, как Sublime и Atom.источник
Используйте Control-V для выбора прямоугольников текста: перейдите к первому
#
символу, введите Ctrl+ V, переместитесь вправо один раз, а затем вниз, до конца комментариев. Теперь введитеx
: вы удаляете все#
символы, за которыми следует один пробел.источник
Вот мой раздел
.vimrc
:В обычном и визуальном режиме это позволяет мне нажимать, ,icчтобы вставлять комментарии и ,rcудалять комментарии.
источник
.vimrc
.map
охватывает нормальный и визуальный режимы, поэтому вам не нужныvmap
линииafter/ftplugin/ruby.vim
.<leader>ic
и<leader>rc
Я использую vim 7.4, и это работает для меня.
Предполагая, что мы комментируем / раскомментируем 3 строки.
Комментировать:
если линия не имеет вкладки / пространство в начале:
ctrl + V
тоjjj
тогдаshift + I (cappital i)
то//
тогда ,esc esc
если линия имеет вкладку / пространство в начале , вы все еще можете сделать выше или замены для
c
:ctrl + V
затемjjj
затемc
затем//
затемesc esc
раскомментировать:
если строки не имеют табуляции / пробела в начале:
ctrl + V
тогдаjjj
тогдаll (lower cap L)
тогдаc
если линии имеют вкладки / пространство в начале, то пространство над одним и
esc
ctrl + V
затемjjj
затемll (lower cap L)
затемc
затемspace
затемesc
источник
Мне нравится использовать плагин tcomment: http://www.vim.org/scripts/script.php?script_id=1173
Я сопоставил gc и gcc, чтобы прокомментировать строку или выделенный блок кода. Он определяет тип файла и работает очень хорошо.
источник
С 30 ответами передо мной, я попытаюсь дать еще более простое решение: вставьте
#
в начале строки. Затем идите вниз по линии и нажмите точку (.
). Чтобы повторить, неj
,.
,j
,.
и т.д. ... раскомментировать, удалить#
(вы можете нажатьx
над#
), и сделать обратное с помощьюk
,.
и т.д. ...источник
I#<Esc>j
в буфер - скажем,c
- и затем сделать10@c
, или сколько угодно строк.Как раскомментировать следующие три строки в vi:
Поместите курсор на верхний левый
#
символ и нажмите CtrlV. Это переводит вас в режим визуального блока. Нажмите стрелку вниз или Jтри раза, чтобы выбрать все три строки. Затем нажмите D. Все комментарии исчезают. Чтобы отменить, нажмите U.Как прокомментировать следующие три строки в vi:
Наведите курсор на верхний левый символ, нажмите CtrlV. Это переводит вас в режим визуального блока. Нажмите ↓или Jтри раза, чтобы выбрать все три строки. Затем нажмите:
I//Esc
Это заглавная буква I, // и Escape.
При нажатии ESCвсе выделенные строки получат обозначенный вами комментарий.
источник
Да, на этот вопрос уже есть 33 (в основном повторяющихся) ответа.
Вот еще один подход к тому, как комментировать строки в Vim: движения . Основная идея заключается в том, чтобы закомментировать или раскомментировать строки, используя тот же метод, что и для извлечения абзаца, набрав
yip
или удалив 2 строки, набравdj
.Этот подход позволит вам делать такие вещи, как:
ccj
закомментировать следующие 2 строки иcuk
раскомментировать их;cci{
закомментировать блок иcui{
раскомментировать его;ccip
закомментировать целый абзац иcuip
раскомментировать его.ccG
закомментировать все до последней строки иcugg
раскомментировать все до первой строки.Все, что вам нужно, это 2 функции, которые работают с движениями , и 2 сопоставления для каждой функции. Во-первых, сопоставления:
(См. Руководство об
g@
операторе иoperatorfunc
переменной.)А теперь функции:
Измените приведенные выше регулярные выражения на свой вкус и укажите, где они
#
должны быть:источник
Если вы уже знаете номера строк, то
n,ms/# //
будет работать.источник
Я отмечаю первую и последнюю строки (ma и mb), а затем делаю: 'a,' bs / ^ # //
источник
Я использую EnhancedCommentify . Он комментирует все, что мне нужно (языки программирования, скрипты, файлы конфигурации). Я использую его с привязками в визуальном режиме. Просто выделите текст, который вы хотите прокомментировать, и нажмите co / cc / cd.
источник
Я объединил ответ Фила и jqno и оставил комментарий без пробелов:
источник
Существует изменения плагина, эта жизнь
tpope
называетсяvim-commentary
https://github.com/tpope/vim-commentary
Этот плагин обеспечивает :
Использование :
:<,'>
:<,'>Commentary
и нажмите Enter.источник
vim-commentary
(как и все плагины tpope) имеет преимущество быть идиоматическим vim.gc
= "комментировать",gcap
= "комментировать абзац" и т. д.Этот ответ наиболее полезен, если вы не можете установить плагины, но по-прежнему хотите, чтобы символы комментариев соответствовали существующим уровням отступов.
Этот ответ здесь: 1) показать правильный код для вставки в блок,
.vimrc
чтобы получитьvim 7.4+
возможность комментировать / раскомментировать блок, сохраняя уровень отступа с 1 ярлыком в визуальном режиме и 2), чтобы объяснить это. Вот код:Как это работает:
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, если ложь, и 1, если истина, что иif
нужно видеть, чтобы оценить правильно.vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>
:vnoremap
означает отображать следующую команду в визуальном режиме, но не отображать ее рекурсивно (то есть не изменять никакие другие команды, которые могут использоваться другими способами). По сути, если вы новичок Vim, всегда используйте,noremap
чтобы убедиться, что вы не сломать вещи.<silent>
означает «Я не хочу ваших слов, только ваши действия» и говорит, что ничего не печатать в командной строке.<C-r>
это то, что мы отображаем, в данном случае это ctrl + r (обратите внимание, что вы все равно можете использовать Cr обычно для «повторения» в обычном режиме с этим отображением).C-u
это немного сбивает с толку, но в основном это гарантирует, что вы не потеряете свою визуальную подсветку (в соответствии с этим ответом ваша команда начинает с чего мы и хотим). подразумевается нажатие кнопки).'<,'>
call
здесь просто говорит vim выполнить функцию, которую мы назвали, и<cr>
enter
call function()
в командной строке, и нам нужно нажать ее снова, чтобы наши заменители прошли весь путь (не совсем понятно, почему, но как угодно).В любом случае, надеюсь, это поможет. Это будет принимать что - либо подсвечены
v
,V
илиC-v
, проверить , если первая строка комментариев, если да, попробуйте раскомментировать все выделенные строки, а если нет, добавить дополнительный слой символы комментария к каждой строке. Это мое желаемое поведение; Я не просто хотел, чтобы он переключался независимо от того, была ли прокомментирована каждая строка в блоке или нет, поэтому он отлично работает после того, как я задал несколько вопросов на эту тему.источник
Я использую плагин Tim-Pope для комментариев .
источник
Вы можете использовать vim-comment по tpope ( https://github.com/tpope/vim-commentary ), вы можете использовать его следующим образом:
Войдите в визуальный режим, нажав
Затем нажмите
Теперь все, что вам нужно сделать с выбором, это клавиши ввода:
Это закомментирует весь выбор, чтобы раскомментировать повторные ключи:
источник
Вот основной однострочник на основе
C-v
следующихI
методом , описанным выше.Эта команда (
:Comment
) добавляет выбранную строку в начало любых выбранных строк.Добавьте эту строку к вашей,
.vimrc
чтобы создать команду, которая принимает один аргумент и помещает аргумент в начало каждой строки в текущем выделении.Например, если выбран следующий текст:
и вы запустите это:,
:Comment //
результат будет:источник
Начав с идей в ответах здесь, я запустил собственную функцию комментирования. Он включает и выключает комментарии. Он может обрабатывать такие вещи, как
//print('blue'); //this thing is blue
и просто переключает первый комментарий. Кроме того, он добавляет комментарии и один пробел именно там, где находится первый не пробел, а не в самом начале строки. Кроме того, он не копирует пробелы без необходимости, а использует масштабирование (: h \ zs для справки), чтобы избежать этой дополнительной работы, при комментировании и отступе строки. Надеюсь, это поможет некоторым минималистам. Предложения приветствуются.источник
Я использую 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 и нормальные файлы
Он комментирует и не комментирует строки в разных исходных файлах как в обычном, так и в визуальном режиме.
Применение:
источник
Самый быстрый и интуитивно понятный из всех этих методов - это переназначение
)
для комментирования строк, а затем(
для раскомментирования. Попробуйте, и вы не вернетесь.В Ruby или Bash с двумя пробелами:
В C / C ++ или PHP с отступами в 4 пробела:
Недостатками являются то, что вы теряете
(
и)
для предложения предложения (ноdas
можете заполнить его там), и вы иногда будете прибегать к выбору и замене или CtrlVдля обработки длинных разделов. Но это довольно редко.А для C-стиля длинные комментарии лучше всего обрабатывать с помощью:
... Который хорошо сочетается с использованием,
V[move]gq
чтобы переделать перенос слов.источник
Этот простой фрагмент взят из моего .vimrc:
Это для // - Комментарии, но вы можете легко адаптировать его для других персонажей. Вы можете использовать autocmd для установки лидера, как предложено jqno.
Это очень простой и эффективный способ естественной работы с диапазонами и визуальным режимом.
источник
Мне нравится
/* ... */
(комментирует), так что вот мой трюк для вас. Конечно, вы можете адаптировать его для использования в разных случаях.Комментарий с / * ... * /
Выделите текст (перейти к началу, запустить визуальный блок, перейти с помощью
}
):Введите команду, которая будет применена в выборе
Команда будет выглядеть так:
:'<,'>norm i /* ^[$a */
Смотрите (i *) для деталей.
Раскомментируйте / * ... * /
Выделите текст (как и раньше или другим способом):
Введите команду, которая будет применена в выборе
Команда будет выглядеть так:
:'<,'>norm :s-\s*/\*\s*-^M$bbld$
Смотрите (ii *) для деталей.
Результат
Эффект - комментарии построчно:
Становится (и наоборот):
Лучше сохранить это как часть
map
или@reg
в вашем.vimrc
, потому что это много, чтобы напечатать. Если вы предпочитаете один/*
и*/
весь блок, используйте:Комментарий с одним / * * / целым блоком
Сохраните его в реестре, записав, скажем
qc
, затем в начале абзаца комментарий:и не забудьте
q
снова, чтобы закончить запись.Смотрите (iii *) для деталей.
Раскомментировать один / * * / из блока
Сохранить его в реестре, скажем,
@u
. Поместите курсор в любое место внутри блока и:Сохранить регистр, закончив
q
команду.Смотрите (iv *) для деталей.
Результат
Эффект - один комментарий для нескольких строк:
Становится (и наоборот):
Пояснения
(i *) Это работает, используя,
norm
который применяет ту же команду несколько раз в каждой выбранной строке. Команда просто вставляет/*
, находит конец этой строки и завершает, вставляя*/
(ii *) Он также используется
norm
для повторения поиска / замены в каждой строке. Ищитеspaces /* spaces
и заменяйте ничем. После этого находит конец строки, вернет два слова, справа букву, удалите до конца.(iii *) Выделите абзац
v}
, удалите его, вставьте открытый и закрытый комментарий, переместитесь в его середину и вставьте удаленный блок.(iv *) В любом месте посередине находит назад a
/*
, удаляет его; находит вперед*/
, удаляет его.источник