Às vezes, tentei invocar o Vim usando xargs
assim:
find . -name '*.java' | xargs vim
… Que tipo de trabalho:
Quando o Vim é iniciado, vejo o seguinte aviso brevemente:
Vim: Warning: Input is not from a terminal
- A edição funciona -
:files
enumera corretamente todos os.java
arquivos conforme o esperado. - Eu posso salvar e sair.
No entanto, depois de sair do Vim, meu terminal é acionado:
- Tudo o que eu digito no prompt do shell não é ecoado.
- Os retornos de carro não aparecem e os feeds de linha aparecem apenas algumas vezes.
Isso continua até eu emitir um reset(1)
comando para reinicializar o terminal.
Isso é um bug do Vim ou existe uma explicação mais satisfatória para o motivo de ele interagir com o terminal assim? Eu já vi isso acontecer no Vim até a versão 7.3 (a versão não parece importar) no Linux e em vários Unices.
Estou ciente de uma solução alternativa, a saber vim $(find . -name '*.java')
. Outras soluções alternativas seriam bem-vindas, embora essa não seja minha pergunta principal.
terminal
invocation
unix
quit
200_success
fonte
fonte
xargs
usa um manequimstdin
que não pode ser usado pelo Vim e quebras tudo depois.Respostas:
Isso acontece quando o vim é chamado e conectado à saída do pipeline anterior, em vez do terminal e recebendo diferentes entradas inesperadas (como NULs). O mesmo acontece quando você executa :,
vim < /dev/null
portanto, oreset
comando neste caso ajuda. Isso é bem explicado pelo grawity no superusuário .Se você estiver usando
find
para passar nomes de arquivos para editar, não precisaxargs
, basta usar-exec
, por exemplo:Se você deseja usar
xargs
, no Unix / macOS, use o-o
parâmetro, como:ou:
Nota: O uso
-print0
/-0
suportará nomes de arquivos com espaços em branco.find
+ BSDxargs
No Unix / macOS, você pode tentar a seguinte solução alternativa:
Você também pode usar a sintaxe de substituição de comando , por exemplo:
Como alternativa, use o GNU em
parallel
vez dexargs
forçar a alocação de tty, no exemplo:Nota:
parallel
no Unix / OSX não funcionará, pois possui parâmetros diferentes e não suporta tty.Muitos outros comandos populares também fornecem alocação pseudo-tty (como
-t
emssh
), portanto, procure ajuda.Outra sugestão seria usar:
ex
editor de linha de comando para analisar os dados ou usar o modo Ex, para obter mais detalhes, consulte:Como editar arquivos de maneira não interativa (por exemplo, no pipeline)?
vipe
(um canal de comando do Vim)use o seguinte script simples:
Relacionado:
grep -l .. | xargs vim
gera um aviso, por quê? [dup] no unix SEfonte
xargs
não tem-J
. Essa parece ser uma opção do MacOS (BSD) que não está presente na versão GNU.Sugestão de solução alternativa: use um buffer como navegador do sistema de arquivos
Use o
vim -
comando para ler uma lista de caminhos do stdin. Vim's:help --
explica isso: 1Você pode usar gfou Ctrl-wCtrl-fpara navegar para o arquivo no mesmo buffer ou em uma nova janela dividida, respectivamente.
Sugestão de solução alternativa: lista de argumentos
Outra ótima maneira é usar a lista de argumentos do Vim. O
:argadd **/*.java
comando preencherá a lista de argumentos do Vim com todos os arquivos java encontrados dentro do diretório atual recursivamente. Você pode usar os botões:next
e:prev
para se mover entre os arquivos.1 O primeiro
-
diz ao Vim que você deseja procurar na ajuda uma opção de linha de comando; o segundo é realmente o sinalizador de linha de comando que você está procurando. Leia:help help-context
para mais truques como este.fonte
Além disso
reset
, você pode tentar:o que também deve tornar seu terminal utilizável novamente.
Veja aqui para explicações. E de alguma forma isso pode ser considerado um mau comportamento do vim, pelo menos o Neovim não tem esse problema no momento.
fonte
reset
que também deveria.A razão é que
xargs
definestdin
para/dev/null
, enquantovim
precisastdin
ser/dev/tty
.xargs
Solução BSD (por exemplo, Mac):-o
define ostdin
processo filho do xarg (vim
neste caso) paradev/tty
.xargs
Solução GNU (por exemplo, Linux):GNU
xargs
não tem a-o
opção. Em vez disso, você precisará usar uma solução alternativa mais complicada. (Nota: é muito importante ter azero
corda à direita , não a esqueça.)Você também pode criar um alias:
Explicação detalhada da solução GNU xargs
Vamos detalhar passo a passo:
1.
xargs
simplesmente acrescenta ostdin
final da string, assimxargs
estará executando o seguinte:2. O formato para
bash -c
ébash -c 'COMMAND_STRING' $0 $1 $2 etc
."$@"
expande para os parâmetros posicionais"$1", "$2"
etc. Ele não inclui "$ 0" porque esse é um parâmetro especial para o nome do script, não um parâmetro posicional. É por isso que precisamos adicionar a sequência fictíciazero
(pode ser qualquer sequência) para substituí-la$0
. Caso contrário, você perderá o primeiro arquivo.Então, depois de expandir
"$@"
, você acaba com:3.
bash -c
executará o COMMAND_STRING:</dev/tty
definestdin
como/dev/tty
para quevim
possa funcionar no modo interativo.fonte
$0
espaço reservado (aqui "zero") é a chave.Eu encontrei todas essas respostas faltando. Depois de lutar pela questão do xargs, a maneira mais simples - para mim! - de fazer essas pesquisas e aberturas em uma caixa genérica é a seguinte:
Não tenho nenhum problema em usar
find
withxargs
egrep
, mas acho a sintaxe irritante. E como um codificador diário que usavim
e o terminal como seu IDE e pesquisa arquivos por propriedades constantemente, é isso que eu tenho usado.Há um tempo e um local para
find . -path ./node_modules -prune -o -name '*.js' | xargs grep -i mySearchTerm
acoplar à abertura de arquivos via vim e outros métodos. Para mim, isso raramente é.Espero que isso ajude alguém.
fonte
$(...)
. Não é tão importante em sua linha de comando quanto em um script, mas acho que ainda é melhor usá-lo em suas respostas :) (referências aqui e aqui )