Alias para pesquisar arquivos pelo nome e abri-los no vim

1

Eu já tenho um alias para (mais) pesquisar arquivos rapidamente:

alias f='find . -iname'

Eu uso como tal:

$ f *statis*
./main/statistics.py
./test/test_statistics.py

Agora, gostaria de ter outro alias que faça a mesma pesquisa, mas, em vez de imprimir os arquivos encontrados, eles serão abertos no vim. Idealmente, funcionaria quando vários arquivos fossem encontrados.

Eu tentei (usando 'echo' em vez de 'vim' para fins de depuração):

 alias fvi='find . -exec echo {} + -iname'

... mas parece que -exec cancela o -iname que vem depois:

$ fvi *statis*
 ./main/statistics.py ./main/probability.py ./test/test_statistics.py 
 ./test/test_probability.py
    
por Manur 07.09.2015 / 10:52

3 respostas

6

Como os argumentos -exec {} devem vir depois do -iname (como find 'executa' seus argumentos da esquerda para a direita), não é possível fazer o que você deseja usando um alias. Em vez disso, deixe seu alias invocar um script que contenha, por exemplo:

#!/bin/sh
find . -iname "" -exec vi {} \;

Observe que isso invocará vi uma vez para cada arquivo encontrado. Se houver muitos desses arquivos, você estará fazendo muitos :q! ou ZZ para sair deles. Se você quiser invocar uma instância de vi para editar todos os arquivos encontrados, altere o \; para um + :

find . -iname "" -exec vi {} +

Como alternativa, você pode usar a substituição de comando para fornecer os argumentos para vi :

vi $(find . -iname "")   # do not use when file names may contain whitespace

No entanto, a desvantagem disso é que ele falhará nos nomes de arquivos que contêm espaço em branco.

Se você preferir não criar um arquivo de script para o comando, coloque a declaração em uma função do shell:

fvi () { find . -iname "" -exec vi {} + ; }
    
por zwets 07.09.2015 / 11:06
3

... ou use um hack sujo para usar o alias como se tivesse parâmetros ...

Como várias respostas apontaram, os aliases não suportam parâmetros como os scripts e funções shell. Invocar um alias equivale a expandir o alias para seu valor e, em seguida, executar a linha de comando resultante com todos os argumentos ainda em vigor.

Nenhuma substituição de parâmetro ocorre. Se você quiser a substituição de parâmetros, defina uma função em vez de um alias. São tantas as teclas digitadas:

fvi () { find . -iname "" -exec vi {} + ; }

No entanto, se você insistir, aqui está um hack para se referir a argumentos de linha de comando dentro de uma expansão de alias: pegue-os no histórico do shell. No seu caso, isso fará o trabalho:

alias fvi='find . -iname "$(history|tail -n1|sed -e "s/^.*\sfvi\s*//")" -exec vi {} + #'

A saída do subshell executando history | tail -n1 | sed -e "s/.*\sfvi\s*//" é o que segue fvi . Isso é colocado no comando find . -iname HERE -exec vi {} + , que é o que você precisa.

Exceto ... há aquele sinal de hash queer no final da definição do alias. Deixo para o leitor descobrir sua raison d'être , pelo sorriso que revela um hack completo. ; -)

    
por zwets 07.09.2015 / 13:37
1

Se você realmente precisar de um alias, poderá usar essa resposta.

Um alias no bash não aceita parâmetros. Portanto, você precisa de uma função e um alias e um comando find ligeiramente alterado:

  1. Edite seu .bashrc

    nano ~/.bashrc
    

    e adicione as linhas abaixo no final do arquivo

    myfvi() {
        find . -type f -iname "" -exec vi -o {} +
    }
    alias fvi=myfvi
    
  2. Recarregue a configuração ou faça logout e faça o login novamente

    source ~./bashrc
    
  3. Comece com

    fvi '*statis*'
    

    Mas você também pode usar a função diretamente

    myfvi '*statis*'
    

Exemplo

Eu tenho três arquivos na minha pasta

$ ls -laog
total 4288
drwxrwxr-x  2 4329472 Sep  7 11:43 .
drwx------ 67   20480 Sep  7 11:28 ..
-rw-rw-r--  1       0 Sep  7 11:43 bar
-rw-rw-r--  1       4 Sep  7 11:23 foo
-rw-rw-r--  1       4 Sep  7 11:23 foobar

E quando eu uso o alias

fvi 'foo*'

vi é aberto com dois arquivos.

    
por A.B. 07.09.2015 / 11:44