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

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

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

14 ответов

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

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

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

:%s!^!//!

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

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

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

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

: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

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

 some█
 code
 here

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

: 1 введите

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

Я / / Космос

 // █some
 code
 here

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

Дж . Дж .

 // some
 // code
 //█here

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

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

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

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

:%s/^/#/

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

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

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

Затем, когда в визуальном режиме, вы можете нажать \c компенсировать блок и \u чтобы прокомментировать это. Of course, you can change those shortcut keystrokes to whatever.

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

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

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

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

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

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

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

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

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

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

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

,cc

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

,cu

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

,c<space>

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

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

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

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

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

:vmap \q c#<ESC>p

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

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

Отображение ответа, получившего наибольшее количество голосов:

1-й визуал выберите нужные строки, затем выполните <leader>zzz, который значения:

      vnoremap <leader>zzz <C-V>^I-<Space><Esc>
  • <C-V> войти в визуальный режим
  • ^ переходит в начало строки (или используйте ' 0'до 1-го непустого)
  • I вставить в блочном режиме
  • -<Space> вставить '-' (например, редактировать как нужно)
  • <Esc> применить ту же вставку ко всем линиям визуального блока

Или последний визуальный выбор из нормального режима:

      nnoremap <leader>zzz gv<C-V>^I-<Space><Esc>
Другие вопросы по тегам