Regioni rettangolari come oggetti di testo?


11

È possibile definire un oggetto di testo in vim che agirà su una regione rettangolare?

Ad esempio, supponiamo che io abbia allineato verticalmente colonne di testo, in questo modo:

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

Sarebbe possibile definire un textobject cper le colonne, tale da daceliminare una colonna, yacstrapparla, caccambiarla e così via?

(Conosco Control-V per selezionare una regione rettangolare e so che puoi quindi usare d, yecc. Per cancellare, strappare ecc. La regione selezionata. Ma sono specificamente curioso di sapere cosa è possibile usare gli oggetti di testo.)


6
È possibile? Assolutamente! Caso e punto: textobj-word-column.vim
Peter Rincker,

@PeterRincker Questo è carino, ma mi chiedo se non possa essere semplificato per sfruttare l' utente textobj di Kana .
lcd047

Grazie, Peter, è esattamente il tipo di esempio che stavo cercando.
Leah Velleman,

2
@PeterRincker rende questa una risposta :)
Vitor

Risposte:


5

Sì, questo è possibile. @PeterRincker suggerisce il plug textobj-word-colonna , che definisce quattro oggetti testo ( ic, ac, iCe aC) per le colonne parola a base.

L'idea alla base di questa funzionalità è quella di creare una funzione che definisce un movimento basato su colonna e quindi mappare questa funzione in modo appropriato per mappare le modalità di visualizzazione / selezione e mappature in attesa dell'operatore. Per utilizzare il plug-in sopra citato come esempio, crea i seguenti mapping:

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>

Qui TextObjWordBasedColumn(...)definisce il movimento della colonna ed è mappato alla modalità di visualizzazione / selezione con xnoremape alla modalità in attesa dell'operatore con onoremap. Si noti che la funzione è leggermente complessa per gestire l'indendenza e trovare i limiti di movimento appropriati.


4

È possibile? Assolutamente! Caso e punto: textobj-word-column.vim .

Come creare i tuoi oggetti di testo

In genere la modalità visiva viene utilizzata per creare un nuovo oggetto di testo. La modalità visiva può essere lineare, tipicamente (tipicamente) o visiva. Ecco le basi di ciò di cui avrai bisogno:

  • Una combinazione di tasti inutilizzata in genere a{char}o i{char}dove {char}è sia descrittiva che inutilizzata. es. i/come esempio di un oggetto di testo tra /'s.
  • Hai bisogno di un modo per trovare l'inizio del tuo oggetto di testo. per esempioT/
  • Hai bisogno di un modo per trovare la fine del tuo oggetto di testo. per esempiot/
  • Scegli una modalità visiva. per esempiov
  • Crea una modalità di visualizzazione (solo) mappatura tramite xnoremap.
  • Creare un mapping modalità operatore in sospeso che utilizza il mapping modalità visiva tramite onoremape :normal.

Ora per un esempio del nostro semplice i/che crea un oggetto di testo tra /:

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

Finché segui gli ingredienti di base puoi creare oggetti di testo per ogni sorta di cose.

Creazione avanzata di oggetti di testo con vim-textobj-user

Il plug-in vim-textobj-user fornisce un modo comune per definire oggetti di testo personalizzati in modo più dichiarativo. Ad esempio, ecco un oggetto di testo tag php:

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

Per ulteriori informazioni con vim-textobj-utente consultare la guida in doc: :h textobj-user-introduction.

Per ulteriore aiuto

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

Così come la creazione di nuovi oggetti di testo nella pagina wiki di Vim.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.