Regiões retangulares como objetos de texto?


11

É possível definir um objeto de texto no vim que atuará em uma região retangular?

Por exemplo, suponha que eu tenha colunas de texto alinhadas verticalmente, assim:

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

Seria possível definir um objeto cde texto para colunas, de modo a dacexcluir uma coluna, yacarrancá-la, cacalterá-la e assim por diante?

(Conheço o Control-V para selecionar uma região retangular e sei que você pode usar d, yetc para excluir, puxar etc a região selecionada. Mas estou especificamente curioso sobre o que é possível usar objetos de texto.)


6
É possível? Absolutamente! Caso e ponto: textobj-word-column.vim
Peter Rincker

@ PeterRincker Isso é legal, mas eu me pergunto se não poderia ser simplificado para tirar proveito do textobj-user de Kana .
Lcd047

Obrigado, Peter, esse é exatamente o tipo de exemplo que eu estava procurando.
Leah Velleman

2
@PeterRincker tornar esta uma resposta :)
Vitor

Respostas:


5

Sim, isso é possível. @PeterRincker sugere o plug-in textobj-palavra-coluna , que define quatro objectos de texto ( ic, ac, iC, e aC) para as colunas com base em palavras.

A idéia por trás dessa funcionalidade é criar uma função que defina um movimento baseado em coluna e, em seguida, mapear essa função adequadamente para mapeamentos de modo visual / de seleção e mapeamentos pendentes do operador. Para usar o plug-in mencionado acima como exemplo, ele cria os seguintes mapeamentos:

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>

Aqui TextObjWordBasedColumn(...)define o movimento da coluna e é mapeado para o modo visual / de seleção com xnoremape para o modo pendente do operador com onoremap. Observe que a função é um pouco complexa para lidar com indendações e encontrar os limites de movimento apropriados.


4

É possível? Absolutamente! Caso e argumento: textobj-word-column.vim .

Como criar seus próprios objetos de texto

Normalmente, o modo visual é usado para criar um novo objeto de texto. O modo visual pode ser em linha, em caracteres (normalmente) ou em bloco visual. Aqui está o básico do que você precisará:

  • Uma combinação de teclas não utilizada normalmente a{char}ou i{char}onde {char}é descritiva e não utilizada. por exemplo, i/como um exemplo de objeto de texto entre /'s.
  • Precisa de uma maneira de encontrar o início do seu objeto de texto. por exemploT/
  • Precisa de uma maneira de encontrar o final do seu objeto de texto. por exemplot/
  • Escolha um modo visual. por exemplov
  • Crie um mapeamento de modo visual (somente) via xnoremap.
  • Crie um mapeamento de modo pendente de operador que use o mapeamento de modo visual via onoremape :normal.

Agora, um exemplo do nosso simple i/que cria um objeto de texto entre /'s:

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

Contanto que você siga os ingredientes básicos, poderá criar objetos de texto para todo o tipo de coisas.

Criação avançada de objeto de texto com vim-textobj-user

O plug- in vim-textobj-user fornece uma maneira comum de definir objetos de texto customizados de maneira mais declarativa. Por exemplo, aqui está um objeto de texto com tag php:

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

Para obter mais ajuda com o vim-textobj pelo usuário ver seu doc ajuda: :h textobj-user-introduction.

Para mais ajuda

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

Bem como a página wiki Criando novos objetos de texto Vim.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.