Vim многострочное редактирование, как в sublimetext?
Я начал использовать gvim, и я не могу понять, как многострочное редактирование работает в gvim.
Например:
Исходный текст:
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
ctrl + q, jjjjjj, $
все выбрано, затем я нажимаю I, чтобы сделать многострочную вставку.
Мое намерение состоит в том, чтобы вставлять кавычки, как в первой строке, а затем нажать Esc:
asd "asd asd" asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
Что случилось? Я ожидал поведения, похожего на sublimetext один:
![enter image description here]()
Если вы не знаете, как это работает, он просто повторяет действия для каждой строки. Как это можно достичь? И что здесь делает vim?
Ответы
Ответ 1
Сделайте себе одолжение, сбросив уровень совместимости Windows. Обычным ярлыком для входа в режим Visual-Block является <C-v>
.
Другие имеют дело с записью макросов, вот несколько других идей:
Использование только режима визуального блока.
-
Поместите курсор на второе слово:
asd |a|sd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
-
Нажмите <C-v>
, чтобы войти в режим визуальных блоков и разверните свой выбор в нижней части:
asd [a]sd asd asd asd;
asd [a]sd asd asd asd;
asd [a]sd asd asd asd;
asd [a]sd asd asd asd;
asd [a]sd asd asd asd;
asd [a]sd asd asd asd;
asd [a]sd asd asd asd;
-
Нажмите I"<Esc>
, чтобы получить:
asd "asd asd asd asd;
asd "asd asd asd asd;
asd "asd asd asd asd;
asd "asd asd asd asd;
asd "asd asd asd asd;
asd "asd asd asd asd;
asd "asd asd asd asd;
-
Поместите курсор на последний char третьего слова:
asd "asd as|d| asd asd;
asd "asd asd asd asd;
asd "asd asd asd asd;
asd "asd asd asd asd;
asd "asd asd asd asd;
asd "asd asd asd asd;
asd "asd asd asd asd;
-
Нажмите <C-v>
, чтобы войти в режим визуальных блоков и разверните свой выбор в нижней части:
asd "asd as[d] asd asd;
asd "asd as[d] asd asd;
asd "asd as[d] asd asd;
asd "asd as[d] asd asd;
asd "asd as[d] asd asd;
asd "asd as[d] asd asd;
asd "asd as[d] asd asd;
-
Нажмите A"<Esc>
, чтобы получить:
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
С визуальным блочным режимом и Surround.vim.
-
Поместите курсор на второе слово:
asd |a|sd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
-
Нажмите <C-v>
, чтобы войти в режим визуальных блоков и разверните свой выбор в нижней и правой частях:
asd [asd asd] asd asd;
asd [asd asd] asd asd;
asd [asd asd] asd asd;
asd [asd asd] asd asd;
asd [asd asd] asd asd;
asd [asd asd] asd asd;
asd [asd asd] asd asd;
-
Нажмите s"
, чтобы получить:
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
С визуальным режимом и :normal
.
-
Нажмите V
, чтобы выбрать всю строку и развернуть ее внизу:
[asd asd asd asd asd;]
[asd asd asd asd asd;]
[asd asd asd asd asd;]
[asd asd asd asd asd;]
[asd asd asd asd asd;]
[asd asd asd asd asd;]
[asd asd asd asd asd;]
-
Выполните следующую команду: :'<,'>norm ^wi"<C-v><Esc>eea"<CR>
, чтобы получить:
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
asd "asd asd" asd asd;
-
:norm[al]
позволяет выполнять команды нормального режима в диапазоне строк (часть '<,'>
автоматически добавляется Vim и означает "действовать в выбранной области" )
-
^
помещает курсор в первую char строки
-
w
переходит к следующему слову
-
i"
вставляет "
перед курсором
-
<C-v><Esc>
- это способ Vim для ввода управляющего символа в этом контексте, здесь он <Esc>
используется для выхода из режима вставки
-
ee
перемещается в конец следующего слова
-
a"
добавляет "
после курсора
-
<CR>
выполняет команду
Используя Surround.vim, команда выше становится
:'<,'>norm ^wvees"<CR>
Ответ 2
Вот некоторые из хороших решений, приведенных выше, но мы также можем попробовать некоторые плагины, которые предоставляют несколько курсоров, таких как Sublime.
Я думаю, что это выглядит многообещающе:
Он казался заброшенным на некоторое время, но внес некоторые взносы в 2014 году.
Это довольно мощно, хотя мне потребовалось немного времени, чтобы привыкнуть к потоку (что довольно похоже на Sublime, но все еще модально, как Vim).
По моему опыту, если у вас установлено много других плагинов, вы можете столкнуться с некоторыми конфликтами!
Есть и другие попытки этой функции:
Пожалуйста, не стесняйтесь редактировать, если заметите, что какое-либо из них претерпевает улучшения.
Ответ 3
Есть несколько способов сделать это в Vim. Я не знаю, какие из них
похоже на Sublime Text, хотя.
Первый из них будет осуществляться через многострочный режим вставки. Наведите курсор на
второй "a" в первой строке, нажмите Ctrl-V
, выберите все строки, затем нажмите I
и
положить в двойную кавычку. Нажатие <esc>
повторит операцию в каждой строке.
Второй - это макросы. Поместите курсор на первый символ и начните
запись макроса с помощью qa
.
Идите направо с помощью llll
, введите режим вставки с
a
, отложите двойной кавычек, вставьте режим вставки и вернитесь к началу
ваша строка с <home>
(или эквивалентной). Нажмите j
для перемещения вниз по одной строке.
Остановите запись с помощью q
.
А затем воспроизведите макрос с помощью @a
. Несколько раз.
Работает ли какой-либо из вышеуказанных подходов?
Ответ 4
если вы используете команду "global", вы можете повторить то, что вы можете сделать в одном онлайн, любым количеством строк.
:g/<search>/.<your ex command>
Пример:
:g/foo/.s/bar/baz/g
Вышеуказанная команда находит все строки, которые имеют foo, и заменяет все вхождения строки в этой строке на baz.
:g/.*/
будет делать в каждой строке
Ответ 5
Я не уверен, что делает vim
, но это интересный эффект. То, как вы описываете то, что хотите, больше похоже на работу макросов (:help macro
). Что-то вроде этого будет делать с макросами (начиная с обычного режима):
-
qa
: записать макрос в регистр a
.
-
0w
: 0
перейти к началу строки, w
перейти на одно слово.
-
i"<Esc>
: Войдите в режим вставки, вставьте "
и вернитесь в нормальный режим.
-
2e
: переход к концу второго слова.
-
a"<Esc>
: Добавить "
.
-
jq
Переместить в следующую строку и завершить макросъемку.
Взято вместе: qa0wi"<Esc>2ea"<Esc>
Теперь вы можете выполнить макрос с помощью @a
, повторить последний макрос с помощью @@
. Чтобы применить к остальной части файла, сделайте что-то вроде [email protected]
, которое предполагает, что у вас не более 99 строк, выполнение макроса закончится, когда оно достигнет конца файла.
Вот как добиться того, чего вы хотите с помощью visual-block-mode
(начиная с обычного режима):
- Перейдите туда, где вы хотите, чтобы первая цитата была.
- Введите
visual-block-mode
, выберите строки, которые хотите повлиять, G
, чтобы перейти к нижней части файла.
- Нажмите
i"<Esc>
.
- Перейдите к следующему месту, которое вы хотите вставить
"
.
- Вы хотите повторить то, что вы только что сделали, достаточно простого
.
.
Ответ 6
Ctrl-v ................ start visual block selection
6j .................... go down 6 lines
I" .................... inserts " at the beginning
<Esc><Esc> ............ finishes start
2fdl. ................. second 'd' l (goes right) . (repeats insertion)