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

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

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

Ответ 1

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

Для получения дополнительной информации и чтения, ознакомьтесь с этой статьей на вики-сайте vim.

Ответ 2

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

:%s!^!//!

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

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

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

Ответ 3

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

:s/search/replace/

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

:s/search/replace/g

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

Эта команда заменит каждое вхождение "поиска" на "заменить" только для текущей строки. % Используется для поиска по всему файлу. Чтобы подтвердить каждую замену в интерактивном режиме, добавьте "c" для подтверждения:

:%s/search/replace/c

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

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

:14,20s/^/#/

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

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

:14,20s!^!//!

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

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

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

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

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

:set nu

Ответ 4

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

 some█
 code
 here

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

: 1 Enter

и введите следующее для перехода в режим вставки и добавьте текст:

I / / Space

 // █some
 code
 here

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

j . j .

 // some
 // code
 //█here

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

Ответ 5

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

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

Ответ 6

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

:%s/^/#/

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

Ответ 7

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

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

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

Ответ 8

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

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

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

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

Ответ 9

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

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

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

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

,cc

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

,cu

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

,c<space>

Ответ 10

Я могу порекомендовать плагин 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"

Ответ 11

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

и do c#<ESC>p

  • c помещаем его в "#"
  • верните его

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

:vmap \q c#<ESC>p

Ответ 12

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

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

2):% нормы я азбуки

Ответ 13

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

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