Vim багаторядковий редагування, як у підвісному тексті?


133

Я почав використовувати 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;

Що трапилось? Я очікував поведінки, подібної до субліметексту:

введіть тут опис зображення

Якщо ви не знаєте, як це працює, він просто повторює дії для кожного рядка. Як цього досягти? І що тут робить vim?


Просто записати макрос клавіатури, щоб змінити перший рядок, а потім відтворити макрос для всіх інших рядків.
високий5

Відповіді:


215

Зроби собі послугу, скинувши шар сумісності Windows.

Звичайний ярлик для входу в режим Visual-Block є <C-v>.

Інші займалися записом макросів, ось кілька інших ідей:

Використовуючи лише режим візуального блоку .

  1. Поставте курсор на друге слово:

    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;
    
  2. Натисніть, <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;
    
  3. Натисніть, 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;
    
  4. Поставте курсор на останньому знаку третього слова:

    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;
    
  5. Натисніть, <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;
    
  6. Натисніть, 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 .

  1. Поставте курсор на друге слово:

    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;
    
  2. Натисніть, <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;
    
  3. Натисніть, 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.

  1. Натисніть, 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;]
    
  2. Виконайте цю команду: :'<,'>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 і означає "діяти на вибрану область")

    • ^ ставить курсор на першу діаграму рядка

    • w переходить до наступного слова

    • i"вставляє a "перед курсором

    • <C-v><Esc>це спосіб Vim ввести контрольний символ у цьому контексті, тут він <Esc>використовується для виходу з режиму вставки

    • ee переходить до кінця наступного слова

    • a"додає "курсор після курсору

    • <CR> виконує команду

    Використовуючи Surround.vim, команда вище стає

    :'<,'>norm ^wvees"<CR>
    

7
Для кроків 4 і 5 я рекомендую натиснути, gvщоб повернути попередній візуальний вибір, а потім рухатися по горизонталі, можливо, з допомогою 2e. (Чим більше рядків, тим цінніше gv!)
joeytwiddle

4
surround.vim використовує малий sу звичайному режимі, але великий Sу візуальному, тому на кроці 3 методу surround.vim слід S"
натискати

1
Точка 3 візуального блоку + Surround.vim має бути S", неs"
zool

1
Замість режиму візуального блоку кроки 5 та 6 ви можете просто поставити курсор після третього слова та натиснути ..
Йонас

2
Це круто, але це працює лише в тих випадках, коли символи, які ви хочете відредагувати на різних рядках, знаходяться в точно однаковому горизонтальному положенні на кожному рядку, а відредаговані рядки розташовуються прямо один за одним. Не можемо вибрати, куди ввійти в режим редагування, у який рядок у Vim? Ми можемо в Sublim ... EDIT: Насправді друга відповідь - це те, що я шукав
Олександр Бурлер

30

Це кілька хороших нестандартних рішень, наведених вище, але ми також можемо спробувати кілька плагінів, які надають декілька курсорів, таких як Sublime.

Я думаю, що це виглядає перспективно:

Це здавалося покинутим на деякий час, але вже було внесено певні внески у 2014 році.

Це досить потужно, хоча мені знадобилося трохи часу, щоб звикнути до потоку (який досить піднесений, але все ще модальний, як Vim).

На мій досвід, якщо у вас встановлено багато інших плагінів, ви можете зіткнутися з деякими конфліктами!

Є ще деякі спроби цієї функції:

Будь ласка, не соромтесь редагувати, якщо ви помітили будь-яке з цих змін, що проходять.


Схоже, github.com/osyo-manga/vim-over є найактивнішим на сьогоднішній день.
Wernight

Відмінно, це те, що я шукав
Олександр Бур'є

1
Після тестування більшості з них hlissner / vim-multiedit здається кращим AFAIAC
Олександр Бур'є

1
Перевірте mg979 / vim-visual-multi як гарну заміну для vim-multiple-
cursors

29

Існує кілька способів досягти цього у Vim. Я не знаю, які найбільш схожі на Sublime Text.


Перший - через режим вставки з рядком . Поставте курсор на друге "а" в першому рядку, натисніть Ctrl-V, виберіть усі рядки, потім натисніть Iі введіть подвійне котирування. Натискання <esc>повторить операцію на кожному рядку.


Другий - через макроси. Покладіть курсор на перший символ і починайте записувати макрос за допомогою qa. Перейдіть праворуч llll, перейдіть до режиму вставки a, укладіть подвійну цитату, вийдіть з режиму вставки та поверніться до початку рядка <home>(або еквівалент). Натисніть, jщоб перейти на один рядок вниз. Зупиніть записувати за допомогою q. А потім відтворити макрос за допомогою @a. Кілька разів.


Чи працює для вас будь-який із перерахованих вище підходів?


15

якщо ви використовуєте команду "глобальний", ви можете повторити, що ви можете зробити в одному онлайн будь-якій кількості рядків.

:g/<search>/.<your ex command>

приклад:

:g/foo/.s/bar/baz/g

Вищенаведена команда знаходить усі рядки, які мають foo, і замінює всі входи в рядку на цьому рядку baz.

:g/.*/

буде робити на кожному рядку


1
Це так корисно, що я не знав цього. Здається, настільки потужна і розумна комбінація команд.
0xc0de

Для зручності я написав невелику функцію, яка бере слово під курсор (або візуально вибране слово), вимагає заміни, а потім виконує :gописану тут команду. Мені подобається використовувати /gcпрохання про "підтвердження", щоб я міг натиснути yабо nна кожну заміну, або aзмінити їх.
joeytwiddle

11
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)

На кроці 3 Iне можна перейти в режим вставки, чи знаєте ви, чому це відбувається?
Ніндзя

Спробуйте завантажити vim без плагінів: vim -u NONEі спробуйте виконати потрібну дію ще раз, це може бути якась карта чи плагін, що змінить поведінку вашого vim.
SergioAraujo

6

Я не впевнений, що vimробить, але це цікавий ефект. Те, як ви описуєте те, що ви хочете, більше нагадує, як працюють макроси ( :help macro). Щось подібне робитиме все, що ви хочете, з макросами (починаючи в звичайному режимі):

  1. qa: Запишіть макрос для aреєстрації.
  2. 0w: 0перейти на рядок, wперейти одне слово.
  3. i"<Esc>: Увійти в режим вставки, вставити a "і повернутися в звичайний режим.
  4. 2e: Перейти до кінця другого слова.
  5. a"<Esc>: Додайте a ".
  6. jq Перехід до наступного рядка і закінчення запису макросу.

У сукупності: qa0wi"<Esc>2ea"<Esc>

Тепер ви можете виконати макрос за допомогою @a, повторити останній макрос за допомогою @@. Щоб застосувати до решти файлу, зробіть щось на кшталт 99@aякого передбачає, що у вас немає більше 99 рядків, виконання макросів закінчиться, коли він досягне кінця файлу.

Ось як досягти того, що ви хочете visual-block-mode(починаючи в звичайному режимі):

  1. Перейдіть до місця, де ви хочете першу цитату.
  2. Увійдіть visual-block-mode, виберіть рядки, на які потрібно вплинути, Gщоб перейти до нижньої частини файлу.
  3. Удар I"<Esc>.
  4. Перейдіть до наступного місця, яке ви хочете вставити ".
  5. Ви хочете повторити те, що ви тільки що зробили, так .буде достатньо простого .

4
Не потрібно 99 @ a. Якщо ви хочете виконати макрос у кожному рядку файлу, спробуйте:% norm! @a.
Грак

Без крапок (вони просто кінці речень, а не частина команд)
Грач

9999@aможе бути некрасивим, але це набагато простіше набрати, ніж :%norm! @aце не повторно запускається у рядку, який ви тільки що редагували. Ще добре це все одно знати. :)
joeytwiddle

0

Моє рішення - використовувати ці 2 відображення:

map <leader>n <Esc><Esc>0qq
map <leader>m q:'<,'>-1normal!@q<CR><Down>

Як ними користуватися:

  1. Виберіть свої лінії. Якщо я хочу вибрати наступні 12 рядків, я просто натискаюV12j
  2. Натисніть <leader>n
  3. Внесіть зміни в лінію
  4. Переконайтесь, що ви перебуваєте у звичайному режимі, а потім натисніть <leader>m

Щоб зробити ще одну редагування, вам не потрібно робити вибір ще раз. Просто натисніть <leader>n, внесіть зміни та натисніть, <leader>mщоб застосувати.


Як це працює:

  • <Esc><Esc>0qq Вийдіть із візуального вибору, перейдіть до початку рядка і починайте записувати макрос.

  • q Зупиніть запис макросу.

  • :'<,'>-1normal!@q<CR> Від початку візуального вибору до рядка до кінця відтворюйте макрос у кожному рядку.

  • <Down> Поверніться до останнього рядка.


Ви також можете просто зіставити один і той же ключ, але для різних режимів:

vmap <leader>m <Esc><Esc>0qq
nmap <leader>m q:'<,'>-1normal!@q<CR><Down>

Хоча це псує вашу здатність зробити ще одну редакцію. Вам доведеться повторно вибрати лінії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.