Les régions rectangulaires comme objets texte?

11

Est-il possible de définir un objet texte dans vim qui agira sur une région rectangulaire?

Par exemple, supposons que j'ai des colonnes de texte alignées verticalement, comme ceci:

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

Serait-il possible de définir un objet texte cpour les colonnes, de manière à dacsupprimer une colonne, à la retirer yac, à la cacmodifier, etc.?

(Je sais Control-V pour sélectionner une zone rectangulaire, et je sais que vous pouvez utiliser d, yetc pour supprimer, etc Yank la région sélectionnée. Mais je suis particulièrement curieux de savoir ce qui est possible en utilisant des objets de texte.)

Leah Velleman
la source
6
C'est possible? Absolument! Cas et point: textobj-word-column.vim
Peter Rincker
@PeterRincker C'est bien, mais je me demande si cela ne pourrait pas être simplifié pour profiter de l' utilisateur textobj de Kana .
lcd047
Merci, Peter, c'est exactement le genre d'exemple que je cherchais.
Leah Velleman, du
2
@PeterRincker en fait une réponse :)
Vitor

Réponses:

5

Oui, c'est possible. @PeterRincker suggère le plugin textobj mot-colonne , qui définit quatre objets de texte ( ic, ac, iC, et aC) pour les colonnes à base de mots.

L'idée derrière cette fonctionnalité est de créer une fonction qui définit un mouvement basé sur une colonne, puis de mapper cette fonction de manière appropriée aux mappages en mode visuel / sélection et aux mappages en attente de l'opérateur. Pour utiliser le plugin mentionné ci-dessus à titre d'exemple, il crée les mappages suivants:

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(...)Définit ici le mouvement de la colonne et est mappé à la fois en mode visuel / sélection avec xnoremapet en mode opérateur en attente avec onoremap. Notez que la fonction est légèrement complexe afin de gérer l'indentation et de trouver les limites de mouvement appropriées.

Karl Yngve Lervåg
la source
4

C'est possible? Absolument! Cas et point: textobj-word-column.vim .

Comment créer vos propres objets texte

Le mode visuel est généralement utilisé pour créer un nouvel objet texte. Le mode visuel peut être en ligne, en caractère (typiquement) ou en bloc visuel. Voici les bases de ce dont vous aurez besoin:

  • Une combinaison de touches inutilisée généralement a{char}ou i{char}{char}est à la fois descriptive et inutilisée. par exemple i/comme un objet texte d'exemple entre /.
  • Besoin d'un moyen de trouver le début de votre objet texte. par exempleT/
  • Besoin d'un moyen de trouver la fin de votre objet texte. par exemplet/
  • Choisissez un mode visuel. par exemplev
  • Créez une cartographie en mode visuel (uniquement) via xnoremap.
  • Créez un mappage de mode en attente d'opérateur qui utilise le mappage de mode visuel via onoremapet :normal.

Maintenant, pour un exemple de notre simple i/qui crée un objet texte entre /'s:

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

Tant que vous suivez les ingrédients de base, vous pouvez créer des objets texte pour toutes sortes de choses.

Création avancée d'objets texte avec vim-textobj-user

Le plugin vim-textobj-user fournit un moyen courant de définir des objets texte personnalisés de manière plus déclarative. Par exemple, voici un objet texte de balise php:

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

Pour plus d' aide vim-textobj utilisateur voir son aide doc: :h textobj-user-introduction.

Pour plus d'aide

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

Ainsi que la page Créer de nouveaux objets texte Vim wiki.

Peter Rincker
la source