Apri un file dato dal risultato di un comando in vim


34

Mi ritrovo a fare quanto segue quasi ogni giorno

  1. Esegui find ( find -name somefile.txt)
  2. Apri il risultato in vim

Il problema è che devo copiare e incollare il risultato di findnel vimcomando. C'è un modo per evitare di doverlo fare? Ho sperimentato un po '( find -name somefile.txt | vim) ma non ho trovato nulla che funzioni.

Grazie in anticipo

Risposte:


31

È possibile utilizzare la sostituzione dei comandi:

vim $(find -name somefile.txt)

o

find -name somefile.txt -exec vim {} \;

1
ok. Se è quello che serve, allora trova -name somefile.txt | xargs vim
balki

3
No, non funziona correttamente e potrebbe persino rovinare il tuo terminale! Non è possibile eseguire il pipe su xargs vim, poiché vim prevede che l'input provenga da un terminale interattivo.
dogbane,


4
Un'altra alternativa sarebbe vim `find -name somefile.txt`. @StuartPowers In alternativa, puoi usare vim `!-1`se hai già usato questa ricerca se eri il comando precedente
Bernhard

1
@balki per usare xargs in questo scenario, devi usare il flag -o, è nell'uomo: -o Riapri stdin come / dev / tty nel processo figlio prima di eseguire il comando. Ciò è utile se si desidera che xargs esegua un'applicazione interattiva.
davidmh,

7

Prova questo:

  1. inizia vim
  2. in vim, utilizzare quanto segue:

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

I risultati dovrebbero apparire in vim al termine della ricerca.

O

Provare:

find /<path> -name > results.txt
vim results.txt 

La mia soluzione fa esattamente lo stesso, ma perché è stata votata?
Balki,

5

Se non ti dispiace eseguire nuovamente il comando: premi Upe aggiungi un xargscomando. Oppure usa la sostituzione della cronologia ed esegui

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

Esiste un modo leggero per salvare l'output di un comando che funziona in ksh e zsh ma non in bash (richiede che il lato output di una pipeline sia eseguito nella shell genitore). Piping del comando nella funzione K(zsh definizione seguente), che k PEE sua uscita nella variabile $K.

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

Il salvataggio automatico dell'output di ciascun comando non è realmente possibile con la sola shell, è necessario eseguire il comando in un terminale emulato. Puoi farlo eseguendo all'interno script(un'utilità BSD, ma disponibile sulla maggior parte dei unices tra cui Linux e Solaris), che salva tutto l'output della tua sessione attraverso un file (c'è ancora un po 'di sforzo necessario per rilevare in modo affidabile l'ultimo prompt nel dattiloscritto ).


2

Mi piace usare i segni di spunta posteriori `(è sullo stesso tasto del ~)

> vim `find . -name somefile.txt`

I tick posteriori eseguono il comando all'interno dei tick e l'output può quindi essere utilizzato dal comando. Quanto sopra troverà tutti i file somefile.txt che ti permetteranno di usare :nextper muoverti attraverso tutti i file.

È molto utile se si impiegano un paio di tentativi per perfezionare il comando, poiché è possibile utilizzare la sostituzione della cronologia per ripetere il comando per l'editor.

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`

2

Devo aver perso il punto qui, perché avrei usato:

:find **/somefile.txt

(se sapessi che ce n'era solo uno nel mio :echo &path ) o, se li volessi tutti:

:args **/somefile.txt

Modifica: Whoa! Ok, quindi non ho colto il punto: vuoi che l'elenco di ricerca, non i file effettivi siano aperti? Prova (di nuovo, da Vim):

!!find . -name somefile.txt

-- colpa mia :)


1

Come indicato da @davidmh nei commenti, è possibile utilizzare xargscon il flag -ose si desidera utilizzare un'applicazione interattiva.

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

Se non lo usi -o, probabilmente sbaglierai lo stato del terminale dopo aver lasciato vim. Se lo hai fatto, dovresti essere in grado di resettare il tuo terminale con il seguente comando:

reset

0

Ho scritto una funzione pvimche fa quello che vuoi. Se vengono reindirizzate più righe, vengono pvimignorate tutte tranne la prima, ma è possibile estenderle per aprire più file in 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"
}

Usalo come:

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

che caricherà il primo "foo.txt" in vim proprio come se avessi digitato:

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


0

Ecco una xargssoluzione più semplice di quelle già menzionate:

find -name somefile.txt | xargs vim -p

L' -popzione dice vimdi aprire ogni file in una scheda separata. Trovo questo più conveniente rispetto all'utilizzo dei buffer.


0

Ho scoperto che aprire un file con l'aiuto di locatein vim è estremamente conveniente e molto più veloce di find.

Il seguente comando cerca un file chiamato app.pynel percorso contenente la directory MyPythonProject.

:args `locate '*MyPythonProject*app.py'`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.