Rechteckige Bereiche als Textobjekte?


11

Ist es möglich, in vim ein Textobjekt zu definieren, das auf einen rechteckigen Bereich einwirkt?

Angenommen, ich habe vertikal ausgerichtete Textspalten wie folgt:

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

Wäre es möglich, ein Textobjekt cfür Spalten zu definieren , dacdas eine Spalte löscht, yacsie zerrt, cacändert und so weiter?

(Ich weiß , über Ctrl-V für einen rechteckigen Bereich auswählen und ich weiß , Sie dann verwenden kann d, yusw. zu löschen, yank etc der ausgewählten Region. Aber ich bin speziell gespannt , was möglich Textobjekte verwenden.)


6
Ist es möglich? Absolut! Fall und Punkt: textobj-word-column.vim
Peter Rincker

@PeterRincker Das ist schön, aber ich frage mich, ob es nicht vereinfacht werden könnte, Kanas Textobj-Benutzer zu nutzen .
lcd047

Danke, Peter, das ist genau das Beispiel, nach dem ich gesucht habe.
Leah Velleman

2
@ PeterRincker machen dies eine Antwort :)
Vitor

Antworten:


5

Ja, das ist möglich. @PeterRincker schlägt das Plugin textobj Wort-Spalte , die vier Textobjekte definiert ( ic, ac, iCund aC) für wortbasierten Spalten.

Die Idee hinter dieser Funktionalität besteht darin, eine Funktion zu erstellen, die eine spaltenbasierte Bewegung definiert, und diese Funktion dann entsprechend den Zuordnungen des visuellen / ausgewählten Modus und den ausstehenden Zuordnungen des Bedieners zuzuordnen. Um das oben genannte Plugin als Beispiel zu verwenden, werden die folgenden Zuordnungen erstellt:

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>

Hier wird TextObjWordBasedColumn(...)die Spaltenbewegung definiert und sowohl dem visuellen / Auswahlmodus mit xnoremapals auch dem vom Bediener anstehenden Modus mit zugeordnet onoremap. Beachten Sie, dass die Funktion etwas komplex ist, um mit Indendationen umzugehen und die entsprechenden Bewegungsgrenzen zu finden.


4

Ist es möglich? Absolut! Groß- und Kleinschreibung und Text : textobj-word-column.vim .

So erstellen Sie Ihre eigenen Textobjekte

Normalerweise wird der visuelle Modus verwendet, um ein neues Textobjekt zu erstellen. Der visuelle Modus kann zeilenweise, zeichenweise (normalerweise) oder visuell blockiert sein. Hier sind die Grundlagen dessen, was Sie benötigen:

  • Eine nicht verwendete Tastenkombination ist normalerweise a{char}oder i{char}wo {char}sowohl beschreibend als auch nicht verwendet. zB i/als Beispieltextobjekt zwischen /'s.
  • Benötigen Sie einen Weg, um den Anfang Ihres Textobjekts zu finden. z.BT/
  • Benötigen Sie einen Weg, um das Ende Ihres Textobjekts zu finden. z.Bt/
  • Wählen Sie einen visuellen Modus. z.Bv
  • Erstellen Sie eine (nur) visuelle Moduszuordnung über xnoremap.
  • Erstellen Sie eine Operator-Pending-Mode-Zuordnung, die die visuelle Moduszuordnung über onoremapund verwendet :normal.

Nun zu einem Beispiel unserer einfachen, i/die ein Textobjekt zwischen /'s erstellt:

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

Solange Sie den Grundzutaten folgen, können Sie Textobjekte für alle möglichen Dinge erstellen.

Erweiterte Erstellung von Textobjekten mit vim-textobj-user

Das vim-textobj-user- Plugin bietet eine gängige Methode, um benutzerdefinierte Textobjekte deklarativer zu definieren. Zum Beispiel ist hier ein PHP-Tag-Textobjekt:

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

Weitere Hilfe zu vim-textobj-user finden Sie in der Hilfe doc : :h textobj-user-introduction.

Für weitere Hilfe

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

Sowie die Vim-Wiki-Seite Neue Textobjekte erstellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.