Regiones rectangulares como objetos de texto?


11

¿Es posible definir un objeto de texto en vim que actuará en una región rectangular?

Por ejemplo, supongamos que tengo columnas de texto alineadas verticalmente, como esta:

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

¿Sería posible definir un objeto cde texto para columnas, de modo que dacelimine una columna, la yactire, la caccambie, etc.?

(Sé acerca de Control-V para seleccionar una región rectangular, y sé que luego puede usar d, yetc. para eliminar, tirar, etc., la región seleccionada. Pero tengo curiosidad específica sobre lo que es posible usando objetos de texto).


66
¿Es posible? ¡Absolutamente! Caso y punto: textobj-word-column.vim
Peter Rincker

@PeterRincker Esto es bueno, pero me pregunto si no podría simplificarse para aprovechar el textobj-usuario de Kana .
lcd047

Gracias, Peter, ese es exactamente el tipo de ejemplo que estaba buscando.
Leah Velleman

2
@PeterRincker hace de esto una respuesta :)
Vitor

Respuestas:


5

Si, esto es posible. @PeterRincker sugiere el plugin textobj-palabra-columna , que define cuatro objetos de texto ( ic, ac, iC, y aC) para las columnas basados en palabras.

La idea detrás de esta funcionalidad es crear una función que defina un movimiento basado en columnas y luego asignar esta función de manera apropiada a las asignaciones de modo visual / select y las asignaciones pendientes del operador. Para utilizar el complemento mencionado anteriormente como ejemplo, crea las siguientes asignaciones:

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>

Aquí TextObjWordBasedColumn(...)define el movimiento de la columna y se asigna tanto al modo visual / selectivo como al modo xnoremappendiente del operador con onoremap. Tenga en cuenta que la función es un poco compleja para manejar la indendación y encontrar los límites de movimiento apropiados.


4

¿Es posible? ¡Absolutamente! Caso y punto: textobj-word-column.vim .

Cómo hacer tus propios objetos de texto

Normalmente, el modo visual se usa para crear un nuevo objeto de texto. El modo visual puede ser de línea, de carácter (típicamente) o de bloque visual. Aquí están los conceptos básicos de lo que necesitará:

  • Una combinación de teclas no utilizada típicamente a{char}o i{char}donde {char}es tanto descriptiva como no utilizada. por ejemplo, i/como un objeto de texto de ejemplo entre /'s.
  • Necesita una forma de encontrar el inicio de su objeto de texto. p.ejT/
  • Necesita una forma de encontrar el final de su objeto de texto. p.ejt/
  • Elige un modo visual. p.ejv
  • Cree un modo visual (solo) mapeo vía xnoremap.
  • Cree un mapeo de modo pendiente del operador que use el mapeo de modo visual a través de onoremapy :normal.

Ahora para un ejemplo de nuestro simple i/que crea un objeto de texto entre /'s:

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

Siempre que siga los ingredientes básicos, puede crear objetos de texto para todo tipo de cosas.

Creación avanzada de objetos de texto con vim-textobj-user

El complemento vim-textobj-user proporciona una forma común de definir objetos de texto personalizados de una manera más declarativa. Por ejemplo, aquí hay un objeto de texto de etiqueta php:

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

Para obtener más ayuda con vim-textobj usuario consulte la ayuda doc: :h textobj-user-introduction.

Para más ayuda

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

Además de la página wiki Crear nuevos objetos de texto de Vim.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.