Как вставить текст в начале многострочного выделения в vi / Vim

423

В Vim , как мне вставить символы в начале каждой строки в выделении?

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

Джордан Пармер
источник

Ответы:

748
  • Нажмите, Escчтобы войти в «командный режим»
  • Используйте Ctrl+ Vдля входа в режим визуального блока
  • Переместите Up/, Downчтобы выбрать столбцы текста в строках, которые вы хотите прокомментировать.
  • Затем нажмите Shift+ iи введите текст, который вы хотите вставить.
  • Затем нажмите Esc, подождите 1 секунду, и вставленный текст появится в каждой строке.

Для получения дополнительной информации и чтения ознакомьтесь с разделом « Вставка текста в несколько строк » в Vim Tips Wiki.

pixelbeat
источник
6
Единственный недостаток в том, что кажется, что Ctrl + V переопределяется в GVIM.
Джордан Пармер
14
Не для меня (на Linux) это не так
pixelbeat
23
Вы можете использовать Ctrl-Q в качестве замены в gVim (как объясняет: help Ctrl-V), но вам нужно использовать hjkl для навигации в этом режиме, а не клавиши со стрелками
Gareth
9
Если ваш ctrl-v переопределен в windows gvim, вы должны отредактировать глобальный vimrc, чтобы он прекратил включать mswin.vim.
Graywh
18
Любая идея, почему это не будет ничего делать после нажатия Esc? Я ждал , как 10 секунд , то произойдет менее чем на сто строк - Никогда не возражаете, я толкал Shift + vне CTRL + v. @ vkaul11 Вероятно, то же самое, что вы сделали LOL
Tek
186

Это заменяет начало каждой строки на «//»:

:%s!^!//!

Это заменяет начало каждой выбранной строки (используйте визуальный режим для выбора) на «//»:

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

Обратите внимание, что gv(в обычном режиме) восстанавливает последний визуальный выбор, это иногда удобно.

Томалак
источник
3
Спасибо! Имеет полный смысл. И удаление текста происходит следующим образом: '<,'> s! ^ // !!
Джордан Пармер
4
Что означает восклицательный знак в ответе выше? (:% s! ^! //!)
Хенрик К.
19
@HKK, обычно используется символ косой черты / в качестве разделителя для команды поиска и замены. В этом случае мы вставляем косую черту как часть поиска и замены, поэтому мы используем альтернативный разделитель, а именно восклицательный знак!
кибер-монах
+1 Это работает в VsVim, где (Ctrl + V) (Shiift + I) Esc не работает.
Сет Рено
4
+1, не имел ни малейшего представления , вы могли бы использовать что - то другое , как регулярное выражение разделителем (здесь я использовал /и с спасаясь от //в :s/^/\/\/вместо письма :s!^!//)
Hashbrown
83

Общий шаблон поиска и замены:

:s/search/replace/

Заменяет первое вхождение 'search' на 'replace' для текущей строки

:s/search/replace/g

Заменяет все вхождения «search» на «replace» для текущей строки, «g» - сокращение от «global»

Эта команда будет заменять каждое вхождение 'search' на 'replace' только для текущей строки. % Используется для поиска по всему файлу. Для подтверждения каждой замены в интерактивном режиме добавьте «c» для подтверждения:

:%s/search/replace/c

Интерактивное подтверждение замены «поиска» на «замены» для всего файла

Вместо символа% вы можете использовать диапазон номеров строк (обратите внимание, что символ «^» является специальным символом поиска для начала строки) :

:14,20s/^/#/

Вставляет символ «#» в начале строк 14-20

Если вы хотите использовать другой символ комментария (например, //), измените разделитель команд:

:14,20s!^!//!

Вставляет последовательность символов «//» в начале строк 14-20

Или вы всегда можете просто экранировать символы, например:

:14,20s/^/\/\//

Вставляет последовательность символов «//» в начале строк 14-20

Если вы не видите номера строк в вашем редакторе, просто введите следующее

:set nu
кибер-монах
источник
чтобы удалить начало #: вместо: 14,20s / # / ^ /, вы должны использовать: 14,20s / # //
cn1h
1
@ cn1h Я думаю, что это также заменит других #в этой строке. Вы должны использовать ^#вместо этого.
ankush981
Спасибо за объяснение основ. Приятно знать, почему что-то происходит.
DidierCH
38

Еще один способ, который может быть проще для новичков:

 some█
 code
 here

Поместите курсор на первую строку, например,

gg

и введите следующее, чтобы войти в режим вставки и добавить свой текст:

I / / Space

 // █some
 code
 here

Нажмите, Escчтобы вернуться в командный режим и использовать орграф:

j . j .

 // some
 // code
 //█here

jэто команда движения, которая идет вниз на одну строку и .повторяет последнюю сделанную вами команду редактирования.

ninegrid
источник
3
Это действительно просто :). Если у вас возникли проблемы, это может быть связано с тем, что вы печатаете столбец (другой символ с вашим \) |вместо заглавной I. Я думал, что это было |сначала.
cokedude
1
Если я сделаю «5». удаляет 5 символов из той же строки. Как мне сделать так, чтобы 5 символов удалялись сразу из каждой строки?
Рахул Прасад
1
@RahulPrasad Допустим, у вас есть 25 строк, затем, начиная с первой строки, просто запишите 5xj в регистр и воспроизведите этот регистр 24 раза, например: qa5xjq25 @ a Но было бы лучше, если бы вы опубликовали это как реальный вопрос если он уже не существует ...
ninegrid
26

И еще один способ:

  • Перейти к началу строки
  • войти в режим визуальной блокировки ( CTRL- v)
  • выберите нужные линии (перемещение вверх / вниз с помощью j/ kили переход на строку с помощью [line] G)
  • нажмите I(это заглавная я)
  • введите символ (ы) комментария
  • Нажмите ESC
Yewge
источник
20

Это добавляет #в начале каждой строки:

:%s/^/#/

И люди перестанут жаловаться на отсутствие у вас должным образом комментирующих сценариев.

Jar-Морпехи
источник
2
Что, если вы хотите добавить # только на выбранные (или несколько) строк
Рахул Прасад
15

Если вы хотите получить супер фантазию, поместите это в ваш .vimrc:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

Затем, когда в визуальном режиме, вы можете нажать \cна с omment блока и \uк ц ncomment его. Конечно, вы можете изменить эти сочетания клавиш на что угодно.

Лукас Оман
источник
Проголосовал, потому что он представил что-то новое - vmap!
ankush981
11

Еще один способ:

:'<,'>g/^/norm I//

/^/это просто шаблон, чтобы соответствовать каждой строке. normпозволяет вам запускать команды нормального режима, которые следуют. I//говорит, что нужно войти в режим вставки, переместив курсор в начало строки, а затем вставить следующий текст (две косые черты).

:g часто удобно делать что-то сложное в нескольких строках, когда вам может понадобиться переключаться между несколькими режимами, удалять или добавлять строки, перемещать курсор вокруг, запускать несколько макросов и т. д. И вы можете сказать, что он работает только со строками, которые соответствовать шаблону.

Брайан Карпер
источник
1
на самом деле команда: g не нужна. Это будет делать:: <, '> норма I //
Cyber ​​Oliveira
1
И: s лучше использовать и в этом случае.
Graywh
Это самый полезный ответ.
Мирное
3

Для комментирования блоков кода мне нравится плагин NERD Commenter .

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

Shift-V
...select the lines of text you want to comment....

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

,cc

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

,cu

Или просто переключите состояние комментария строки или блока:

,c<space>
Kevin
источник
2

Я могу порекомендовать плагин EnhCommentify .

например. поместите это в ваш vimrc:

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

затем вы можете комментировать / раскомментировать (выбранные) строки с помощью ', c'

Бенедикт Вальдвогель
источник
3
Вы также можете использовать Nerd Commenter на vim.org/scripts/script.php?script_id=1218
Натан Феллман,
1

Пометить область для комментирования как визуальный блок ( <C-V)

и делать c#<ESC>p

  1. cпередать его "#"
  2. положить его обратно

Если вы делаете это часто, определите короткий путь (пример \q) в вашем .vimrc

:vmap \q c#<ESC>p
JJoao
источник
1

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

  1. vip: выделите и отметьте весь абзац
  2. shift-i: вставить текст в начале строки
  3. escape: выйти из режима вставки / войти в нормальный режим [начало строки все еще выбрано]
  4. escape: отменить выбор начала строки
TheUnseen
источник
0

Чтобы вставить «ABC» в начале каждой строки:

1) Перейти в командный режим

2):% норма I азбука

макинтош
источник
Это добавляет текст слева от первого непробельного символа в строке.
Кингсли