Você pode usar a substituição de comandos:
vim $(find -name somefile.txt)
ou
find -name somefile.txt -exec vim {} \;
Eu me vejo fazendo o seguinte quase todos os dias
find -name somefile.txt
) 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
Tente isto:
: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
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).
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 '!!'
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:)
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
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")
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.
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''