Regiony prostokątne jako obiekty tekstowe?

11

Czy można zdefiniować w vimie obiekt tekstowy, który będzie działał na prostokątnym obszarze?

Załóżmy na przykład, że mam wyrównane pionowo kolumny tekstu, takie jak to:

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

Byłoby możliwe do zdefiniowania textobject cdla kolumn, tak, że dacbędzie usunąć kolumnę, yacby go szarpać, cacby go zmienić, i tak dalej?

(Wiem o Control-V do wybierania regionu prostokątnego i wiem, że możesz użyć d, yitp., Aby usunąć, szarpać itp. Wybrany region. Ale jestem szczególnie ciekawy, co jest możliwe przy użyciu obiektów tekstowych.)

Leah Velleman
źródło
6
Czy to możliwe? Absolutnie! Przypadek i punkt: textobj-word-column.vim
Peter Rincker
@PeterRincker To miłe, ale zastanawiam się, czy nie można uprościć korzystania z textobj-użytkownika Kany .
lcd047
Dzięki, Peter, właśnie tego szukałem.
Leah Velleman,
2
@PeterRincker zrób z tego odpowiedź :)
Vitor

Odpowiedzi:

5

Tak, jest to możliwe. @PeterRincker sugeruje wtyczki textobj-word-kolumnę , która definiuje cztery obiekty tekstowe ( ic, ac, iC, i aC) dla kolumn opartych na słowo.

Ideą tej funkcji jest stworzenie funkcji, która definiuje ruch oparty na kolumnie, a następnie odpowiednie mapowanie tej funkcji do mapowań trybu wizualnego / wyboru i mapowań oczekujących operatora. Aby użyć wyżej wymienionej wtyczki jako przykładu, tworzy ona następujące mapowania:

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>

Tutaj TextObjWordBasedColumn(...)definiuje ruch kolumny i jest mapowany zarówno do trybu wizualnego / wyboru za pomocą, jak xnoremapi trybu oczekiwania operatora za pomocą onoremap. Zauważ, że funkcja jest nieco złożona, aby obsłużyć indendację i znaleźć odpowiednie granice ruchu.

Karl Yngve Lervåg
źródło
4

Czy to możliwe? Absolutnie! Przypadek i punkt: textobj-word-column.vim .

Jak tworzyć własne obiekty tekstowe

Zwykle tryb wizualny służy do tworzenia nowego obiektu tekstowego. Tryb wizualny może być liniowy, znakowy (zazwyczaj) lub blok wizualny. Oto podstawy tego, czego będziesz potrzebować:

  • Nieużywana kombinacja klawiszy zazwyczaj a{char}lub i{char}gdzie {char}jest zarówno opisowa, jak i nieużywana. np. i/jako przykładowy obiekt tekstowy między /'s.
  • Potrzebujesz sposobu na znalezienie początku swojego obiektu tekstowego. na przykładT/
  • Potrzebujesz sposobu na znalezienie końca swojego obiektu tekstowego. na przykładt/
  • Wybierz tryb wizualny. na przykładv
  • Utwórz mapowanie w trybie wizualnym (tylko) za pośrednictwem xnoremap.
  • Utwórz odwzorowanie trybu oczekiwania operatora, które używa odwzorowania trybu wizualnego za pomocą onoremapi :normal.

Teraz przykład naszego prostego, i/który tworzy obiekt tekstowy między /:

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

Tak długo, jak postępujesz zgodnie z podstawowymi składnikami, możesz tworzyć obiekty tekstowe do wszelkiego rodzaju rzeczy.

Zaawansowane tworzenie obiektów tekstowych za pomocą vim-textobj-user

Vim-textobj użytkownik Wtyczka zapewnia wspólny sposób definiowania niestandardowych obiektów tekstowych w bardziej deklaratywny mody. Na przykład tutaj jest obiekt tekstowy znacznika php:

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

Aby uzyskać więcej pomocy vim-textobj użytkownikowi zobaczyć jego pomocą doc: :h textobj-user-introduction.

Aby uzyskać więcej pomocy

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

Jak również strona wiki Tworzenie nowych obiektów tekstowych Vim.

Peter Rincker
źródło