2011-11-30 10 views
5

trovo spesso ritrovo a fare un flusso di lavoro come questo:modo rapido per modificare la linea n-esima di output del comando precedente

$ find . |grep somefile 
./tmp/somefile.xml 
./test/another-somefile.txt 

(recensione uscita)

$ vim ./tmp/somefile.xml 

Ora, sarebbe stato facile se non ci era un modo conveniente di utilizzare l'output del comando find e alimentarlo a vim.

Il migliore che è venuta in mente è:

$ nth() { sed -n $1p; } 
$ find . |grep somefile 
./tmp/somefile.xml 
./test/another-somefile.txt 

(recensione uscita)

$ vim `!!|nth 2` 

Mi chiedevo se ci sono altri, forse più bella, modi di realizzare la stessa cosa?

Per chiarire, voglio un modo comodo di afferrare l'ennesima riga da un comando eseguito in precedenza per aprire rapidamente quel file per la modifica in vim, senza dover tagliare il nome del file con il mouse o la scheda-completare la mia strada attraverso il percorso del file.

risposta

4

modo 1: non passare il file esatto a vim, ma l'intero output. scegliere il file in vim

attualmente si sta lavorando in due fasi:

1 - lanciare il ritrovamento/grep ... cmd

2 - vim !! ....

se sei sicuro di voler utilizzare vim per aprire uno (o più) file dal risultato di ricerca. potete provare:

find. (with grep if you like) |vim - 

allora si ha l'intera produzione in vim, ora si può usare la magia vim per spostare il cursore sul file che si desidera modificare, quindi premere gf. (Lo faccio a volte)

modo 2: perfezionare la propria espressione regolare nel find (o grep), per ottenere il singolo file, che si desidera modificare.

questa non è una cosa difficile. quindi puoi semplicemente vim !!.

il tuo n() è bello. tuttavia, immagina che ci siano 30 righe in uscita e il tuo file si trova nella riga n. 16. come lo contate? sicuro di poter aggiungere |nl alla fine, quindi non puoi usare direttamente !! più ..

solo i miei 2 centesimi

+0

Penso che piping il comando su' vim -' e poi usare 'gf' è la soluzione che mi sentirei più a mio agio. Comunque il mio vim mi richiede di salvare il buffer dell'elenco file prima di permettermi di fare 'gf'. C'è un modo per rendere buffer di trattare vim da stdin come buffer temporanei/nascosti? – Erik

+0

L'aggiunta di 'set hidden' a ~/.vimrc sembra fare il trucco. Grazie a tutti! – Erik

+0

@Erik Ho modificato la tua domanda, per aggiungere un nuovo tag "vim". spero che non ti dispiaccia. – Kent

1

Modificato dopo il tuo commento. Non so se è "conveniente" però ..

command | tail -n3 | head -n1 | xargs vim 
+0

No, voglio un modo conveniente per afferrare la linea ennesima dall'output di un comando precedente e dei mangimi come argomento di vim. – Erik

+0

Oh bene. Ho aggiunto xargs per aggiungere l'output a vim, quindi – Miquel

0

Forse questo è quello che stai cercando?

find . -name "*somefile*" -exec vim -p {} \; 
0

Se si desidera una revisione interattivo forse è possibile utilizzare qualcosa di simile:

TMP_LIST=""; for i in `find . | grep somefile`; do echo $i; read -p "(y/n)?"; [ $REPLY == "y" ] && TMP_LIST="$TMP_LIST $i"; done; vim $TMP_LIST 
+0

Questo è abbastanza pulito, ma non quello che sto cercando. Il punto è che il mio flusso di lavoro è 1) find/ls/..., 2) vedere un file che voglio modificare, 3) aprire rapidamente quel file in vim senza il mouse taglia e incolla di nomefile o tab-completando il percorso – Erik

0

È quasi lo ha fatto !!

pearl.251> cat file1 
a b c d e f pearl.252> find . -name "file*" 
./file1 
./file2 
./file3 
./file4 
./file5 
./file6 
./file7 
pearl.253> vi `!!|awk 'NR==1'` 

l'ultima riga overe qui si aprirà la file1 in vi.

+0

Per chiarire, la mia soluzione funziona, ma mi chiedevo se fosse possibile ottenere una cosa ancora più carina di '!! nth 2'. La chiave 'è una cagna da digitare su una tastiera svedese;) – Erik

Problemi correlati