Как закомментировать блок кода Python в Vim

186

Мне было интересно, было ли в Vim какое-либо отображение клавиш, позволяющее мне делать отступы для определенных строк кода (были ли эти строки выделены в визуальном режиме или n строк выше / ниже текущей позиции курсора).

Так что в основном то, что преобразует следующее

def my_fun(x, y):
    return x + y

в

#def my_fun(x, y):
#    return x + y

Я в порядке с использованием #или """для комментирования соответствующих строк. В идеале мне бы хотелось, чтобы такое же сопоставление клавиш раскомментировало строки, если данные строки были закомментированы.

Ришабх Маноча
источник
Не нужно изобретать велосипед, есть плагин: tComment для вас, который поддерживает (не) код комментария для нескольких языков.
Мяу

Ответы:

411

Шаг 1: Перейдите к первому столбцу первой строки, которую вы хотите прокомментировать.

Начальное состояние

Шаг 2: Нажмите: Ctrl+ vи выберите строки, которые вы хотите прокомментировать:

Выберите строки

Шаг 3: Shift - I#space(Войдите в режим вставки слева, введите символы для вставки. Выбор исчезнет, ​​но все строки в нем будут изменены после шага 4.)

Комментарий

Шаг 4: Esc

<Esc>

theosp
источник
4
Комментирование строк таким способом прекрасно работает. Есть ли способ раскомментировать эти строки? Shift-I # <ESC>не работал (возможно, я делаю это неправильно).
Ришабх Маноча
41
@ rishabh-manocha: используйте визуальный блок (Ctrl-V), чтобы выбрать все добавленные # и введите x, чтобы удалить их.
theosp
3
Вы должны помнить, что Shift-I означает «вставить в первую непустую строку», поэтому его нельзя использовать для удаления. Выполнение визуального выделения с помощью Ctrl-V помечает символы для изменения, затем «x» удаляет один символ в выбранной области, в результате чего удаляются символы «#». Смотрите ": h I" и ": h CTRL-V" в vim для получения дополнительной информации.
Жестянщик
5
@Samaursa Ctrl-V, вероятно, не работает в Windows. Попробуйте Ctrl-Q вместо этого.
А-Я.
1
Чтобы удалить 2 символа (если вы вставили «#»), найдите курсор в верхней строке, которую вы хотите изменить, нажмите ctrl-v, чтобы войти в режим визуального блока, нажмите j (или стрелку вниз), чтобы выделить все строки, которые нужно изменить, нажмите l (или стрелка вправо), чтобы выделить ширину в 2 символа (нажмите один раз на столбец, чтобы выделить), а затем нажмите d, чтобы удалить выделенный текст.
Thinkmassive
72

в одну сторону вручную

:set number
:10,12s/^/#
ghostdog74
источник
4
как вы их удаляете?
Чарли Паркер
15
@CharlieParker::10,12s/^#//
bstpierre
1
Недурно за экс-ответ (старая школа :)
млв
Это не работает для кода с отступом
Андрес Перес-Альбела Х.
49

Вы можете добавить следующее отображение в ваш .vimrc

vnoremap <silent> # :s/^/#/<cr>:noh<cr>
vnoremap <silent> -# :s/^#//<cr>:noh<cr>

Выделите свой блок с помощью:

Shift+v

# комментировать ваши строки из первого столбца.

-# раскомментировать так же.

cdated
источник
5
Просто гениально! Спасибо вам!
I159
1
@architectonic это не имеет эффекта, если вы не находитесь в визуальном режиме, а '#' не связан
cdated
1
Я немного изменил: Ctrl + k для комментария "vnoremap <silent> <Ck>: s # ^ # \ ## <cr>: noh <cr>"> Ctrl + u для комментария: "vnoremap <silent> <Cu >: s # ^ \ ### <cr>: noh <cr> "
Прадип Дас
1
@JonathanHartley вам не нужно использовать «/», в этом случае «#» - это разделитель. Итак: s / ^ / # / и: s / ^ # // являются эквивалентными заменами. Поэтому замените начало строки на «#» и замените «#» в первом столбце на «». <cr>: noh <cr> просто очищает строку поиска, поэтому ничего не останется выделенным, когда вы закончите.
от
1
@JonathanHartley, честно говоря, я думаю, что просто следовал шаблону, не думая об этом. Теперь я удивлен # против / не подошел раньше. Изменен ответ на основе здравого смысла. Спасибо!
от
26

Выделите свой блок с помощью: ShiftV

Прокомментируйте выделенный блок с помощью: :norm i# (нижний регистр i)

Чтобы раскомментировать, снова выделите ваш блок и раскомментируйте с помощью: :norm ^x

Команда :normвыполняет действие для каждой выбранной строки. Комментирование будет вставлять #в начале каждой строки, а комментирование удалит это #.

user2437225
источник
При использовании современного Vim и простой конфигурации, выбор линий в визуальном режиме (с помощью Shift+v) и последующее использование :norm i#изменяет только первую выбранную строку. Это работает для меня, чтобы прокомментировать строки с 389 по 391::389,391norm i #
mmell
22

Я обычно убираю визуальный блок ( <C-V>), затем ищу и заменяю первый символ:

:'<,'>s/^/#

(При входе в командный режим с выбранным визуальным блоком автоматически помещается «<,»> в командной строке). Затем я могу раскомментировать блок, сместив тот же визуальный блок и:

:'<,'>s/^#//

источник
19

Есть несколько хороших плагинов, которые помогают комментировать / раскомментировать строки. Например, NERD Commenter .

Джефф Риди
источник
9

У меня есть следующие строки в моем .vimrc:

" comment line, selection with Ctrl-N,Ctrl-N
au BufEnter *.py nnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N><C-N>    <C-O>mn<C-O>:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>gv`n

" uncomment line, selection with Ctrl-N,N
au BufEnter *.py nnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>:s/^#$//ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N>n     <C-O>mn<C-O>:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR><C-O>:s/^#$//ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>gv:s/#\n/\r/ge<CR>:noh<CR>gv`n

Ярлыки сохраняют вашу позицию курсора и ваши комментарии до тех пор, пока они начинаются #(с пробелом после #). Например:

# variable x
x = 0

После комментирования:

# variable x
#x = 0

После uncomennding:

# variable x
x = 0
Лукас Ценовский
источник
Хорошо, но я думаю, что вам лучше использовать более простое s/^/#/регулярное выражение. Я предпочитаю, чтобы символ комментария появлялся в начале строки ... но гораздо важнее то, что «комментирование комментариев» действительно очень важно. Я бы также отбросил au BufEnter *.py, поскольку #комментарии достаточно общие, чтобы по умолчанию команды использовались во всех буферах.
travc
5

Честно говоря, я использую плагин tcomment для этой ссылки . Он может обрабатывать практически любой синтаксис. Он определяет хорошие движения, используя его с некоторыми сопоставителями текстовых блоков, специфичными для python, делает его мощным инструментом.

Дарек
источник
5

NERDcommenter - отличный плагин для комментирования, который автоматически определяет количество типов файлов и связанных с ними символов комментариев. Смешно легко установить с помощью патогенов .

Комментарий с <leader>cc. Раскомментировать с <leader>cu. И переключать комментарии с<leader>c<space> .

( <leader>Ключ по умолчанию в vim - это \)

Абид Х. Муджаба
источник
3

Для vim существует множество плагинов для комментариев, многие из которых являются мультиязычными, а не только python. Если вы используете менеджер плагинов, например Vundle, вы можете искать их (после того, как вы установили Vundle), используя, например:

:PluginSearch comment

И вы получите окно результатов. В качестве альтернативы вы можете просто искать vim-скрипты для плагинов комментариев .

Пирз
источник
3

Никаких плагинов или сопоставлений не требуется. Попробуйте встроенную команду «норма», которая буквально выполняет все, что вы хотите в каждой выбранной строке.

Добавить # Комментарии

1. shift V to visually select lines
2. :norm i#

Удалить # Комментарии

1. visually select region as before
2. :norm x

Или, если ваши комментарии с отступом, вы можете сделать :norm ^x

Обратите внимание, что это просто обычные команды vim, перед которыми стоит «: norm» для выполнения их в каждой строке.

Более подробный ответ по использованию команды «норма» в одном из ответов здесь

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

Магнус
источник
1

Очень минимальный легкий плагин : vim-commentary.

gccкомментировать строки,
gcgcчтобы раскомментировать. проверьте страницу плагина для получения дополнительной информации.

v+k/jзатем выделите блок, gccчтобы прокомментировать этот блок.

yantaq
источник
0

CtrlK для комментария (Визуальный режим):

vnoremap <silent> <C-k> :s#^#\##<cr>:noh<cr>

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

vnoremap <silent> <C-u> :s#^\###<cr>:noh<cr>
Прадип Дас
источник