it-swarm-pt.tech

Para que serve o modo EX para processamento em lote?

O tutorial menciona que o modo Ex é para processamento em lote. Uma vez que é um incômodo, ao invés de uma ferramenta, para mim, gostaria de ver alguns exemplos práticos. Quem usa? Por quê?

Para que serve o modo EX para processamento em lote?

20
Léo Léopold Hertz 준영

O Vim no modo Ex (também conhecido como ex) é útil quando:

  • Você precisa editar (vários) arquivos de forma não interativa (como parte do script).
  • Sua conexão está muito lenta ou a tela não é atualizada após suas ações.
  • Mapeamentos e abreviações estão desativados.
  • Chaves comuns como Escape ou Control não funciona corretamente.

Editar arquivos de forma não interativa é o uso mais comum e as pessoas o usam de maneira semelhante a sed e awk, no entanto, eles são mais orientados para o fluxo - eles apenas lêem o arquivo do início ao end enquanto vim é orientado a buffer - você pode mover para frente e para trás no arquivo como quiser. Em segundo lugar, as expressões regulares do vim são mais poderosas do que as expressões do awk e do sed (elas não foram projetadas para funcionar com várias linhas) - por exemplo, o vim pode corresponder a várias linhas e não aceita correspondências.

Ex é também um editor (predecessor direto de vi) e no Vim - Modo Ex emula ex (eles ainda executam o mesmo código), portanto, é possível chegar ao modo de comando de ex de dentro do vi e vice-versa. Existe o modo Ex (vim -e) e modo Ex aprimorado que permite comandos mais avançados do que o modo Ex compatível com vi (vim -E). Veja: Qual é a diferença entre o modo Ex e o modo Ex aprimorado?

Ex é a raiz de uma família de editores: edit, ex e vi. Ex é um superconjunto de ed, com a extensão mais notável sendo um recurso de edição de exibição.ex (1)


Aqui está um exemplo simples de alteração de 127 para 128 do seu arquivo hosts e imprimir a saída:

ex -s +%s/127/128/g +%p +q! /etc/hosts

é equivalente a:

sed s/127/128/g /etc/hosts

Para uma solução mais avançada, você pode ter o arquivo com comandos vim e usá-lo por uma abordagem mais clássica para o redirecionamento de I/O:

echo :%s/127/128/g > cmds.vim
echo :%print >> cmds.vim
echo :%quit! >> cmds.vim
ex -s /etc/hosts < cmds.vim # The same as: vim -s cmds.vim /etc/hosts

Você também pode usar plug-ins do vim para realizar algumas tarefas.

Por exemplo, o seguinte one-liner converteria seu arquivo de código-fonte em html usando um dos plug-ins padrão:

ex -s '+let g:html_no_progress=1' '+syntax on' '+set ft=c' '+runtime syntax/2html.vim' -cwqa my_code.c

Ele irá gerar um arquivo html (com destaque de sintaxe) a partir do seu código (escrito em qualquer linguagem suportada) que está pronto para impressão ou publicação em seu site.


Ou algum exemplo real ao vivo da especificação RPM :

vim -E -s Makefile <<-EOF
   :%substitute/CFLAGS = -g$/CFLAGS =-fPIC -DPIC -g/
   :%substitute/CFLAGS =$/CFLAGS =-fPIC -DPIC/
   :%substitute/ADAFLAGS =$/ADAFLAGS =-fPIC -DPIC/
   :update
   :quit
EOF

O script a seguir criará um novo arquivo html baixando o html do site Example e substituindo seu corpo por uma tabela 20x20 gerada automaticamente com números aleatórios nela:

" table.vim
%!curl -s example.com 
let @t='<table>'.repeat('<tr>'.repeat('<td>_</td>',20).'</tr>',20).'</table>'
/<body
norm!vitd"tP
%s/_/\=system('echo $RANDOM')/g
wq

Uso:

ex -s table.html < table.vim

Isso funcionará em sistemas do tipo * nix com curl instalado. Adicionar -V para ver o script em ação.

Mais exemplos:


Veja também:

4
kenorb

O Ex-Mode serve principalmente para executar a mesma ação em vários arquivos.

Digamos que você tenha 25 arquivos .html, todos com:

<a href="/home.html"> ...

Em vez de abrir cada um deles, você pode usar o modo Ex para alterar tudo para index.html:

vim -E -s bob.html <<-EOF
   :%substitute/home.html/index.html/
   :update
   :quit
EOF
22
Jack M.

A partir do 7.3 recente, que como suporte a desfazer persistente, o modo ex e outras formas de processamento em lote do vim são superiores a outros métodos não-vim, uma vez que não irá destruir o histórico de desfazer.

Adicionando: 'desfazer persistente' se habilitado, mantém todas as mudanças em um arquivo (até um limite) no histórico de desfazer, através das sessões de edição do vim. Se o arquivo for editado por um programa externo, o vim irá zerar o histórico de desfazer ao detectar por checksum que ele mudou. vim -E permitirá que você edite em lote um arquivo e a edição ficará no histórico de desfazer.

6
u0b34a0f6ae

Isso não responde à sua pergunta sobre o processamento em lote, mas é outra maneira de explicar o que é o modo Ex. Você sabe como você pressiona : para entrar no modo de linha de comando e inserir comandos? O modo Well Ex também permite que você insira os mesmos comandos, exceto que o Vim não sai do modo Ex depois de inserir um comando, ele permanece no modo Ex e você pode inserir outro comando. É como um REPL (ler, avaliar, imprimir, loop), mas sem imprimir (apenas um REL ...). Voltarei ao motivo de você querer esse tipo de REL mais tarde. É por isso que é chamado de modo Ex, ele permite que você insira comandos Ex, que é a mesma coisa que o modo de linha de comando faz, ele permite que você insira um comando Ex. Outra maneira de explicar isso é que permite que você insira e execute imediatamente o código Vimscript/VimL. Vimscript/VimL é uma linguagem que você pode usar para escrever plug-ins do Vim. É também a linguagem que você usa para escrever seu arquivo de configuração (provavelmente .vimrc). É também a linguagem que você está usando quando insere comandos Ex no modo de linha de comando ou no modo Ex. Portanto, dessa perspectiva, o modo Ex pode ser visto como um REL VimL. Por que você quer um REL VimL? Pela mesma razão que as pessoas gostam de REPLs para outras linguagens. Eles podem ser realmente úteis para depurar código ou experimentar a linguagem para ver como as coisas funcionam, especialmente se você estiver escrevendo plug-ins em VimL ou personalizando altamente seu confi g (o que provavelmente significa que você está violando o principal SRP e deve dividi-lo em plug-ins).

1
still_dreaming_1