Прямокутні області як текстові об’єкти?


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-word-column.vim
Пітер Рінкер

@PeterRincker Це добре, але мені цікаво, чи не вдалося б його спростити, щоб скористатися текстовим користувачем Kana .
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

ВІМ-textobj користувач плагін забезпечує загальний спосіб визначення користувача текстових об'єктів в більш декларативною формі. Наприклад, ось текстовий об'єкт тегу php:

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

Для отримання додаткової допомоги з користувачем vim-textobj дивіться його довідку doc : :h textobj-user-introduction.

Для отримання додаткової допомоги

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

А також сторінка Створення нових текстових об’єктів Вікі-сторінки.

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