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


423

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

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

Ответы:


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

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


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это команда движения, которая идет вниз на одну строку и .повторяет последнюю сделанную вами команду редактирования.


3
Это действительно просто :). Если у вас возникли проблемы, это может быть связано с тем, что вы печатаете столбец (другой символ с вашим \) |вместо заглавной I. Я думал, что это было |сначала.
cokedude

1
Если я сделаю «5». удаляет 5 символов из той же строки. Как мне сделать так, чтобы 5 символов удалялись сразу из каждой строки?
Рахул Прасад

1
@RahulPrasad Допустим, у вас есть 25 строк, затем, начиная с первой строки, просто запишите 5xj в регистр и воспроизведите этот регистр 24 раза, например: qa5xjq25 @ a Но было бы лучше, если бы вы опубликовали это как реальный вопрос если он уже не существует ...
ninegrid

26

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

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

20

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

:%s/^/#/

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


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>

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

1

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

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

0

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

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

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


Это добавляет текст слева от первого непробельного символа в строке.
Кингсли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.