Algo que eu achei útil em outros editores é a capacidade de:
- pegue o texto selecionado
- execute um comando externo e passe a seleção para seu
stdin
- pegue os comandos externos
stdout
e substitua a seleção atual por ele.
Dessa forma, você pode escrever ferramentas de texto úteis que operam na seleção usando qualquer idioma que possa executar io básico.
Como isso pode ser feito com o vim usando a seleção? ... um único caractere, palavra, parágrafo ... etc.
(Diretamente na linha de comando ou através de uma ligação de tecla?)
Nota
Comandos como o !sort
trabalho no nível da linha, a razão pela qual estou fazendo essa pergunta é porque gostaria de operar na seleção. (ou seja, o texto que seria removido se x
pressionado).
fonte
sort
comando.:sort
?Eu escrevi um plugin chamado express.vim que pode ajudar com isso. O plug-in define um operador
g=
que permite avaliar uma expressão VimScript sobre um movimento (ou seleção Visual). Ele solicita uma expressão, na qual você pode usarv:val
como um espaço reservado para o texto coberto pela moção (ou, novamente, seleção Visual).Nesse caso, uma expressão útil usaria a
system()
função, que executa um comando externo.(Aqui eu usei
tr
como um exemplo simples de comando externo.)A maneira de usar o express.vim para esse problema seria selecionar o texto no modo Visual, digite o tipo
g=
seguido por essa expressão e pressioneEnter
:Eu admito, não é fácil de usar. (Na verdade, eu raramente uso esse plugin!) Estou pensando em adicionar um atalho para chamar um comando externo, como iniciar a expressão
!
. Vou postar uma atualização aqui se acabar fazendo isso.EDITAR
Modifiquei o express.vim para tratar expressões que começam com
!
comandos externos. Portanto, seguindo otr
exemplo, o acima se torna muito mais simples. Após uma seleção Visual, digite o seguinte:Explicação:
g=
!tr a-z A-Z
como a expressãoEnter
fonte
Você está procurando os comandos de filtro no Vim. Veja
:help filter
. Aqui está a documentação relevante:Assim, a digitação
5!!sort
classificará as próximas 5 linhas, começando pelo cursor.fonte
tr [:lower:] [:upper]
, o vim irá adicionar não apenas essa palavra, mas toda a linha.Observe que isso pode ser feito com:
s^R=system('tr a-z A-Z', @")[:-2]^M
(^R
sendo CTRL + R e ^ M sendo ENTER)Também poderia funcionar com qualquer coisa que a seleção + substitua como
ci"^R=...
.fonte
v
e mover o cursor), recebo o erroE16: Invalid range\nE16: Invalid range\nE476: Invalid command
(no Linux,tr
existem outros comandos básicos).s
que entra no modo de inserção ou:s
no comando?s
no modo visual ou:
primeiro? Não há:
envolvimento na sequência de chaves que escrevi. Um mapeamento seria:vnoremap µ s<c-r>=system('tr a-z A-Z', @")[:-2]<cr>
.