Abra um arquivo dado pelo resultado de um comando no vim

28

Eu me vejo fazendo o seguinte quase todos os dias

  1. Executar uma descoberta ( find -name somefile.txt )
  2. Abra o resultado em vim

O problema é que eu tenho que copiar e colar o resultado do find no comando vim . Existe alguma maneira de evitar ter que fazer isso? Eu experimentei um pouco ( find -name somefile.txt | vim ) mas não encontrei nada que funcionasse.

Obrigado antecipadamente

    
por smauel 14.01.2011 / 18:22

9 respostas

27

Você pode usar a substituição de comandos:

vim $(find -name somefile.txt)

ou

find -name somefile.txt -exec vim {} \;
    
por 14.01.2011 / 18:27
6

Tente isto:

  1. inicie o vim
  2. no vim, use o seguinte:

:r!find /<path> -name 'expression'

Os resultados devem aparecer no vim quando a pesquisa estiver completa.

Ou

Tente:

find /<path> -name > results.txt
vim results.txt 
    
por 14.01.2011 / 20:46
4

Se você não se importar em executar o comando novamente: pressione Up e anexe um comando xargs . Ou use a substituição de histórico e execute

!! | xargs vim          # won't work with file names containing \'" or whitespace
!! | xargs -d \n vim   # GNU only (Linux, Cygwin)

Existe uma maneira leve de salvar a saída de um comando que funciona em ksh e zsh, mas não em bash (requer que o lado de saída de um pipeline seja executado no shell pai). Pipe o comando para a função K (definição zsh abaixo), que k eeps sua saída na variável $K .

function K {
    K=("${(@f)$(tee /dev/fd/3)}") 3>&1;
}
find … |K
vim $K

Salvar automaticamente a saída de cada comando não é realmente possível com o shell sozinho, você precisa executar o comando em um terminal emulado. Você pode fazê-lo executando dentro script (um utilitário BSD, mas disponível na maioria dos unices incluindo Linux e Solaris), que salva toda a saída da sua sessão através de um arquivo (ainda há um pouco de esforço necessário para detectar com segurança o último prompt no texto datilografado).

    
por 14.01.2011 / 22:59
2

Eu gosto de usar os tiques de volta '(É na mesma chave que o ~)

> vim 'find . -name somefile.txt'

O back ticks executa o comando dentro dos ticks e a saída pode então ser usada pelo comando. O arquivo acima encontrará todos os arquivos somefile.txt, permitindo que você use :next para percorrer todos os arquivos.

É muito útil se você passar algumas tentativas refinando o comando, porque você pode usar a substituição do histórico para repetir o comando para o editor.

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi '!!'
    
por 14.01.2011 / 21:31
1

Eu devo ter perdido o ponto aqui, porque eu usaria:

:find **/somefile.txt

(se eu soubesse que havia apenas um no meu :echo &path ) ou, se eu quisesse todos eles:

:args **/somefile.txt

Edit: Whoa! Ok, então eu fiz perder o ponto - você quer a lista de busca, não os arquivos reais abertos? Tente (novamente, de dentro do Vim):

!!find . -name somefile.txt

- meu mau:)

    
por 28.01.2012 / 07:29
1

Como @davidmh apontou nos comentários, você pode usar xargs com o sinalizador -o se quiser usar um aplicativo interativo.

find . -name somefile.txt | xargs -o vim

Se você não usa -o , você provavelmente irá atrapalhar o estado terminal depois de sair do vim. Se você tiver feito isso, você deve poder redefinir seu terminal com o seguinte comando:

reset
    
por 15.12.2017 / 12:56
0

Eu escrevi uma função pvim , que faz o que você quer. Se várias linhas forem canalizadas para pvim , ele ignorará todos, menos o primeiro, mas poderá ser estendido para abrir vários arquivos no vim.

stu@sente ~ $ function pvim() { read -r somefile; exec < /dev/fd/1; vim "$somefile"; }
stu@sente ~ $ type pvim
pvim is a function
pvim ()
{
    read -r somefile;
    exec < /dev/fd/1;
    vi "$somefile"
}

Use como:

stu@sente ~ $ find . -name "foo.txt" | pvim

que carregará o primeiro "foo.txt" no vim como se você tivesse digitado:

vim $(find . -name "foo.txt | head -n1")

    
por 28.01.2012 / 05:26
0

Aqui está uma solução xargs mais simples do que as já mencionadas:

find -name somefile.txt | xargs vim -p

A opção -p informa vim para abrir cada arquivo em uma guia separada. Acho isso mais conveniente do que usar buffers.

    
por 14.10.2015 / 23:52
0

Descobri que abrir um arquivo com a ajuda de locate no vim é extremamente conveniente e muito mais rápido do que find .

O comando a seguir procura um arquivo chamado app.py no caminho que contém o diretório MyPythonProject .

:args 'locate '*MyPythonProject*app.py''
    
por 11.12.2016 / 04:53