Як домогтися відбору різної довжини текстів на різних рядках?


10

припустимо, у мене є такі тексти:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

Я хочу зробити вибір як нижче:

aaa-dd-e:"aaa",
bb-x:"bb",
c-9:"c"

Я спробував використовувати cv для створення візуального блоку, але після того, як я створю виділення в першому стовпчику і натискаю "f:" (я мав на увазі розширити виділення до позначки двокрапки у кожному рядку, як вище), що я отримую:

aaa-dd-e: "aaa",:
bb-x"bb",
c-9:"c"

виділення зупиняється на першій двокрапці і створює прямокутник.


6
Чого ви хочете досягти з цим вибором, може бути інший шлях
Arjen Dijkstra

Якщо він розділений символами, ви можете спробувати спочатку вирівняти блок та вибрати його потім. Див.: Вирівняйте текст лише на першому розділювачі в VIM
kenorb

Відповіді:


6

Вибір, як правило, означає середнє значення для досягнення цілі, тим більше у Vim, де вибір в першу чергу не потрібен.

Якщо припустити, що ви все ще хочете поставити лапки навколо імен властивостей у вашому файлі без JSON, щоб перетворити його на правильний JSON:

  1. виберіть рядки для модифікації, символи або рядки, це не має значення,
  2. :'<,'>norm I"^[f:i"( '<,'>автоматично вставляється для вас і ^[отримується за допомогою <C-v><Esc>).

Якщо у вас є гарний плагін для оточення, крок 2 стає:

:'<,'>norm ^vt:S"

З заміною кроком 2 може стати:

:'<,'>s/^\s*\([^:]*\):/"\1"

Ви праві, хлопці, я вважаю, що візуальний вибір, мабуть, непотрібний. за допомогою або :g/regex/normя можу просто досягти всього, що хочу зробити.
Аарон Шен

Чи є спосіб я помістити весь вибраний блок в буфер обміну та вставити в інший файл?
Аарон Шен

Звичайно. Якщо припустимо, що ваш Vim складається з підтримкою буфера обміну, яку ви можете зробити, "+yабо "*yзалежно від того, який буфер обміну ви хочете націлити. Тут є багато пов'язаних питань.
romainl

14

Vim підтримує прямокутні прямокутні виділення, за винятком зубчастої правої межі при натисканні $.

Є плагіни (наприклад, декілька курсорів vim ), які можуть імітувати кілька виборів, але ви також повинні мати можливість досягти своєї реальної мети (про яку ви, на жаль, не згадували), за допомогою чистих команд Vim, наприклад, :globalі :substitute(якщо ви можете сформулювати звичайну вираз, що відповідає виділенню у кожному рядку) або повторенням макросів (якщо в кожному рядку є певний рух, який охоплює виділення).


що робити, якщо я хочу вирізати ці рядки та вставити в інший буфер?
Аарон Шен

1

Просто, щоб кинути інший капелюх на ринг, якщо ви дійсно хочете використовувати візуальний вибір, ви можете використовувати плагін Tabular для вирівнювання колонок, а потім зробіть свій візуальний вибір.

Якщо ви берете свій оригінальний текст:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

:Tab /:\zs вирівняє все після двокрапки, як нижче

aaa-dd-e:  "aaa",
bb-x:      "bb",
c-9:       "c"

І тоді ви можете зробити свій візуальний блок вибору.

Як вже говорили інші, візуальний вибір, мабуть, не потрібен у цій ситуації. Використання normабо заміна, ймовірно, може досягти того, що ви хочете, не метушившись із візуальними виділеннями.


1

Я знайшов рішення цього питання, яке дивно просто! Почніть режим візуального блоку з нижньої частини вибору тексту, який ви хочете скопіювати, та виберіть вгору! Він буде розширювати блок, коли ви піднімаєтесь вгору, тоді як якщо ви виділяєте вниз, то, здається, вибір зменшиться.


Але таким чином це завжди буде прямокутний блок, правда? Як я читав, це не те, чого хоче ОП (вони згадують, що пробували режим візуального блоку).
Мартін Турноїй

Ні. Це завжди буде прямокутний блок, якщо всі лінії однакової довжини. Я виявив, що починаючи знизу і виділяючи вгору, а потім натискаючи $, щоб перейти до кінця рядка, це призведе до того, що всі виділені лінії будуть виділені до кінця рядка.
Артур Боуерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.