Прямоугольные области как текстовые объекты?

11

Можно ли определить текстовый объект в vim, который будет действовать в прямоугольной области?

Например, предположим, что у меня есть вертикально выровненные столбцы текста, например:

column 1 co    column 2 col
lumn 1 colu    umn 2 column
mn 1 column    2 column 2 c
1 column 1     olumn 2 colu

Можно ли было бы определить текстовый объект cдля столбцов, такой, который dacбы удалял столбец, yacвыдергал его, cacизменил бы его и т. Д.?

(Я знаю о Control-V для выбора прямоугольной области, и я знаю, что вы можете затем использовать dи yт. Д. Для удаления, восстановления и т. Д. Выбранной области. Но мне особенно любопытно, что возможно при использовании текстовых объектов.)

Лия Веллеман
источник
6
Является ли это возможным? Абсолютно! Корпус и точка: textobj слово-column.vim
Питер Rincker
@PeterRincker Это хорошо, но мне интересно, нельзя ли это упростить, чтобы воспользоваться преимуществами пользователя Kana textobj .
lcd047
Спасибо, Питер, это именно тот пример, который я искал.
Лия Веллеман
2
@PeterRincker сделай это ответом :)
Vitor

Ответы:

5

Да, это возможно @PeterRincker предлагает плагин textobj-слово-столбец , который определяет четыре текстовых объектов ( ic, ac, iCи aC) для столбцов на основе слов.

Идея этой функции состоит в том, чтобы создать функцию, которая определяет движение на основе столбцов, а затем сопоставить эту функцию соответствующим образом с отображениями режима визуального выбора / выбора и отображениями, ожидающими оператора. Чтобы использовать вышеупомянутый плагин в качестве примера, он создает следующие сопоставления:

xnoremap <silent> ac :<C-u>call TextObjWordBasedColumn("aw")<cr>
xnoremap <silent> aC :<C-u>call TextObjWordBasedColumn("aW")<cr>
xnoremap <silent> ic :<C-u>call TextObjWordBasedColumn("iw")<cr>
xnoremap <silent> iC :<C-u>call TextObjWordBasedColumn("iW")<cr>
onoremap <silent> ac :call TextObjWordBasedColumn("aw")<cr>
onoremap <silent> aC :call TextObjWordBasedColumn("aW")<cr>
onoremap <silent> ic :call TextObjWordBasedColumn("iw")<cr>
onoremap <silent> iC :call TextObjWordBasedColumn("iW")<cr>

Здесь TextObjWordBasedColumn(...)определяет движение столбца и отображается как в режим просмотра / выбора с помощью, так xnoremapи в режим ожидания оператора с помощью onoremap. Обратите внимание, что функция немного сложна для обработки неопределенности и для поиска соответствующих границ движения.

Карл Ингве Лерваг
источник
4

Является ли это возможным? Абсолютно! Случай и точка: textobj-word-column.vim .

Как сделать свои собственные текстовые объекты

Обычно визуальный режим используется для создания нового текстового объекта. Визуальный режим может быть линейным, символьным (обычно) или визуальным блоком. Вот основы того, что вам нужно:

  • Неиспользованная комбинация клавиш обычно a{char}или i{char}где {char}является и описательной и неиспользованной. например, i/в качестве примера текстового объекта между /'s.
  • Нужен способ найти начало вашего текстового объекта. напримерT/
  • Нужен способ найти конец вашего текстового объекта. напримерt/
  • Выберите визуальный режим. напримерv
  • Создать визуальный режим (только) сопоставления через xnoremap.
  • Создайте отображение режима ожидания оператора, которое использует визуальное отображение режима через onoremapи :normal.

Теперь для примера нашего простого, i/который создает текстовый объект между /'s:

xnoremap i/ :<c-u>normal! T/vt/<cr>
onoremap i/ :normal vi/<cr>

Пока вы следуете основным компонентам, вы можете создавать текстовые объекты для всех видов вещей.

Расширенное создание текстовых объектов с помощью vim-textobj-user

ВИМ-textobj пользователь плагин обеспечивает общий способ определения пользовательских текстовых объектов в более декларативной форме. Например, вот текстовый объект тега php:

call textobj#user#plugin('php', {
\   'code': {
\     'pattern': ['<?php\>', '?>'],
\     'select-a': 'aP',
\     'select-i': 'iP',
\   },
\ })

Для получения дополнительной помощи с ВИМ-textobj пользователю увидеть его помощь документ: :h textobj-user-introduction.

Для получения дополнительной помощи

:h map-overview
:h visual-start
:h :norm

А также вики-страница Создание новых текстовых объектов Vim.

Питер Ринкер
источник