Por que os nomes dos arquivos de tubulação no VIM interrompem quando eu retorno ao shell?

1

Eu procurei por alguns arquivos com o find e queria abrir todos eles em guias no Vim. Então eu tentei isso:

find . | xargs fgrep -l myExpression | xargs vim -p

Isso funcionou muito bem, exceto quando eu terminei e abandonei o Vim. Tudo que eu digitei no vim era invisível, e o backspace não funcionava (então, quando eu digitei como ls<backspace><backspace>exit , o histórico resultante era ls^?^?exit e não exit Também me deu um aviso de que minha tubulação não era de um terminal.

Tudo estava bem novamente quando reiniciei o shell. Isso era reproduzível sempre.

Versão do Bash:

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

Versão do Vim:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 14 2015 05:43:37)
Included patches: 1-699
    
por durron597 29.01.2016 / 22:53

1 resposta

3

Um programa de linha de comando pode receber informações de um usuário através de duas fontes: de stdin (para o qual você está direcionando), e anexando diretamente ao TTY. Coisas ruins podem acontecer quando estas são misturadas. O Vim não quer ler a entrada de um tubo, quer você, o usuário, diretamente. Então vamos dar o real stdin de volta.

Como solução, podemos usar uma substituição de comando para passar diretamente os arquivos como argumentos para o Vim:

vim -p $(find . | xargs fgrep -l myExpression)

Note que, devido às expansões executadas pelo shell, isso não manipula arquivos com espaços em seus nomes corretamente, mas meu Bash-fu é muito fraco para saber uma correção fácil.

Além disso, find options | xargs some command pode ser escrito como find options -exec some command {} + , o que pode ser considerado mais elegante.

    
por 29.01.2016 / 23:12