2011-11-30 6 views
5

a menudo encuentro encuentro haciendo un flujo de trabajo de esta manera:manera rápida para editar enésima línea de salida del comando anterior

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

(salida de opinión)

$ vim ./tmp/somefile.xml 

Ahora, sería interesante si existe fue una forma conveniente de usar la salida del comando find y alimentarlo a vim.

El mejor que he llegado con es:

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

(salida de opinión)

$ vim `!!|nth 2` 

Me preguntaba si hay otros, quizá más bonita, maneras de lograr lo mismo?

Para aclarar, quiero una manera conveniente de tomar la enésima línea de un comando ejecutado previamente para abrir rápidamente ese archivo para editar en vim, sin tener que cortar & pegar el nombre de archivo con el mouse o la pestaña Completar mi camino la ruta del archivo

Respuesta

4

manera 1: no pase el archivo exacto a vim, pero toda la salida. elegir el archivo en vim

Actualmente se está trabajando en dos pasos:

1 - lanzar el hallazgo/grep ... cmd

2 - vim !! ....

si está seguro de que desea usar vim para abrir uno (o más) archivo (s) del resultado de búsqueda. usted puede intentar:

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

entonces usted tiene toda la salida en vim, ahora se puede usar la magia vim para mover el cursor hasta el archivo que desea editar y, a continuación, pulse gf. (Esto lo hago a veces)

manera 2: refine su expresión regular en su búsqueda (o grep), para obtener el único archivo, que desea editar.

esto no es una cosa difícil en absoluto. entonces puedes simplemente vim !!.

su nth() es agradable. sin embargo, imagine que hay 30 líneas en la salida, y su archivo se encuentra en la línea 16. ¿Cómo lo cuenta? ¡Seguro que puedes agregar |nl al final, entonces no puedes usarlo directamente! por más tiempo ..

sólo mis 2 centavos

+0

Creo que conectar el comando a' vim -' y luego usar 'gf' es la solución con la que me sentiría más cómodo. Sin embargo, mi vim requiere que guarde el búfer de la lista de archivos antes de permitirme hacer 'gf'. ¿Hay alguna manera de hacer que vim trate los almacenamientos intermedios de stdin como almacenamientos intermedios temporales/ocultos? – Erik

+0

Agregar 'set hidden' a ~/.vimrc parece ser el truco. ¡Gracias a todos! – Erik

+0

@Erik Edité su pregunta, para agregar una nueva etiqueta "vim". espero que no te importe – Kent

1

Modificado después de tu comentario. Sin embargo, no estoy seguro si es "conveniente" ...

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

No, yo quiero una manera conveniente para agarrar la enésima línea de la salida de un comando anterior y alimentarlo como argumento para vim. – Erik

+0

Oh, bien. He agregado xargs para agregar la salida a vim, luego – Miquel

0

Quizás esto es lo que está buscando?

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

Si desea una revisión interactiva tal vez se puede usar algo como esto:

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

Eso es bastante claro, pero no es lo que estoy buscando. El punto es que mi flujo de trabajo es 1) find/ls/..., 2) ver un archivo que quiero editar, 3) abrir rápidamente ese archivo en vim sin mouse cortar y pegar de nombre de archivo o tab-completando la ruta – Erik

0

Casi lo hizo !!

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'` 

la última línea overe aquí se abrirá el archivo1 en vi.

+0

Para aclarar, mi solución funciona, pero me preguntaba si era posible obtener algo aún más bonito que '!! nth 2'. La tecla 'es una perra para escribir en un teclado sueco;) – Erik

Cuestiones relacionadas