Как добиться выделения разной длины текстов по разным строкам?

10

Предположим, у меня есть следующие тексты:

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

Я хочу сделать выбор, как показано ниже:

aaa-dd-e:"ааа",
bb-x:"бб",
c-9:"с"

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

aaa-дд-е: "ааа",:
bb-x"бб",
c-9:"с"

выбор останавливается на первом двоеточии и создает прямоугольник.

Аарон Шен
источник
6
Чего вы хотите добиться с этим выбором, может быть другой путь
Арьен Дейкстра
Если он разделен символом, вы можете сначала попытаться заново выровнять блок, а затем выбрать его. См .: Выровнять текст только по первому разделителю в VIM
kenorb

Ответы:

6

Выбор - это, как правило, средство для достижения цели, особенно в Vim, где выбор часто не требуется.

Предполагая, что вы все еще хотите поместить кавычки вокруг имен свойств в файле, не являющемся JSON, чтобы превратить его в правильный JSON:

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

Если у вас есть красивый плагин объемного звучания, шаг 2 становится:

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

С заменой, шаг 2 может стать:

:'<,'>s/^\s*\([^:]*\):/"\1"
romainl
источник
Вы, ребята, правы, теперь я считаю, что визуальный отбор, вероятно, не нужен. с помощью или :g/regex/normя могу просто достичь того, что хочу.
Аарон Шен
Есть ли способ, которым я могу поместить весь выделенный блок в системный буфер обмена и вставить в другой файл?
Аарон Шен
Конечно. Предполагая, что ваш Vim скомпилирован с поддержкой буфера обмена, которую вы можете сделать "+yили "*y, в зависимости от того, на какой буфер обмена вы хотите нацелиться. Здесь много связанных вопросов.
Ромен
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

Я нашел решение этой проблемы, которое удивительно просто! Запустите режим визуального блока снизу выделения текста, который вы хотите скопировать, и выберите вверх! Он будет расширять блок по мере того, как вы поднимаетесь, тогда как если вы выделите его вниз, то, кажется, выделение будет меньше.

Артур Бауэрс
источник
Но так всегда будет прямоугольный блок, верно? Насколько я понимаю, это не то, чего хочет ОП (они упоминают, что пробовали режим визуального блока).
Мартин Турной
Нет. Это всегда будет прямоугольный блок, если все строки имеют одинаковую длину. Я обнаружил, что, начиная с нижней части и выделяя вверх, а затем нажимая $ для перехода в конец строки, все выделенные строки будут выделены до конца строки.
Артур Бауэрс