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)