Como localizar vários arquivos e abri-los no vim?

10

Suponha que eu tenha um arquivo chamado filename123.txt e seja o único arquivo com o mesmo nome, e eu posso locate com o comando locate filename123 . E isso só retorna este arquivo.

Agora quero abri-lo com vi / vim . Mas eu não quero ir para esse local e digitar o comando vi seguido do nome do arquivo. Aqui eu quero que o resultado de locate filename123 seja anexado ao comando vi. Como posso fazer isso? Eu já tentei:

locate filename123 | vi

Mas isso não funciona. E esse erro vem no terminal:

santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
    
por Santosh Kumar 18.08.2012 / 13:49

3 respostas

12

Você pode usar xargs :

locate filename123 | xargs vi

Por padrão, xargs executará o menor número possível de instâncias do comando especificado, passando tantos parâmetros quanto possível de acordo com o sistema ARG_MAX . Para limitar o número de parâmetros passados para uma instância de vi , use a opção xargs ' -n .

Para lidar com nomes de arquivos que contêm espaços, use xargs ' -d option:

locate filename123 | xargs -d '\n' vi

Para lidar com nomes de arquivos que contêm novas linhas, use a opção xargs ' -0 junto com a opção locate -0 :

locate -0 filename123 | xargs -0 vi

(Se -0 não estiver disponível em nenhum deles, verifique também --null ou outra maneira de especificar o caractere %code%0 como delimitador.)

    
por 18.08.2012 / 13:55
3

Você pode usar a expansão de comando:

vi "$(locate filename123 | head -n1)"

Para fazer com que vim leia seu stdin, você pode fazer vim - , mas isso fornecerá apenas a saída de locate , que são caminhos de nome de arquivo. Isso pode funcionar, porém, usando o comando vim gf normal, então, abrirá o caminho em que o cursor está.

Editar

No caso de nomes de arquivos com espaços, é melhor usar a opção xargs mencionada ou a solução vim descrita acima. Nota para tornar o gf trabalho necessário para adicionar espaço a isfname :

set isfname+=32

Esta dica e alternativas são descritas aqui .

Editar 2

Aspas adicionadas e head , conforme sugerido por PeterO no comentários .

    
por 18.08.2012 / 14:14
1

A maneira mais simples é passar locate como substituição de shell , como:

vim $(locate filename123)

Você também pode considerar usar find em vez de locate para passar nomes de arquivos para edição, no exemplo:

find . -name 'filename123' -exec vim {} +

No Unix / OSX você pode usar o parâmetro xargs with -o , como:

locate filename123 | xargs -o vim

-o Reopen stdin as /dev/tty in the child process before executing the command. This is useful if you want xargs to run an interactive application.

Ou no Linux, tente a seguinte solução alternativa usando:

locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'

Se você estiver usando comandos diferentes, use a substituição de comandos para conseguir isso, como:

vim $(locate filename123)
vim 'locate filename123'

Como alternativa, use o GNU parallel em vez de xargs para forçar a alocação de tty, no exemplo:

locate filename123 | parallel -X --tty vi

Nota: parallel no Unix / OSX não funciona porque tem parâmetros diferentes e não suporta tty.

Muitos outros comandos populares também oferecem alocação pseudo-tty (como -t in ssh ), portanto, procure por ajuda.

Outra sugestão seria usar vipe (um canal de comando do Vim) ou usar o seguinte script simples :

#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"

Relacionados:

por 18.02.2015 / 13:31