Как вставить текст в начале многострочного выделения в 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
c
передать его "#"- положил его обратно
Если вы делаете это часто, определите короткий путь (пример \q
) в вашем.vimrc
:vmap \q c#<ESC>p
Если чей-то многострочный выбор на самом деле является абзацем, нет необходимости вручную выделять строки. vim может сделать это за вас:
vip
: выделить и отметить весь абзацshift-i
: вставить текст в начало строкиescape
: выйти из режима вставки / войти в нормальный режим [начало строки все еще выбрано]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>