Abra un archivo dado por el resultado de un comando en vim


34

Me encuentro haciendo lo siguiente casi todos los días

  1. Ejecuta un find ( find -name somefile.txt)
  2. Abra el resultado en vim

El problema es que tengo que copiar y pegar el resultado de finden el vimcomando. ¿Hay alguna forma de evitar tener que hacer esto? He experimentado un poco ( find -name somefile.txt | vim) pero no he encontrado nada que funcione.

Gracias por adelantado

Respuestas:


31

Puede usar la sustitución de comandos:

vim $(find -name somefile.txt)

o

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

1
Okay. Si eso es lo que se necesita, busque -name somefile.txt | xargs vim
balki

3
No, eso no funciona correctamente e incluso podría estropear su terminal. No puede canalizar a xargs vim, porque vim espera que la entrada provenga de un terminal interactivo.
dogbane


44
Otra alternativa sería vim `find -name somefile.txt`. @StuartPowers Alternativamente, puede usarlo vim `!-1`si ya usó este hallazgo si fue su comando anterior
Bernhard el

1
@balki para usar xargs en este escenario, debe usar la bandera -o, está en el hombre: -o Vuelva a abrir stdin como / dev / tty en el proceso secundario antes de ejecutar el comando. Esto es útil si desea que xargs ejecute una aplicación interactiva.
davidmh

7

Prueba esto:

  1. empezar vim
  2. en vim, use lo siguiente:

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

Los resultados deberían aparecer en vim cuando se complete la búsqueda.

O

Tratar:

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

Mi solución hace exactamente lo mismo, pero ¿por qué se rechaza?
balki

5

Si no le importa ejecutar el comando nuevamente: presione Upy agregue un xargscomando. O use la sustitución del historial y ejecute

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

Hay una manera liviana de guardar la salida de un comando que funciona en ksh y zsh pero no en bash (requiere que el lado de salida de una tubería se ejecute en el shell principal). Pipe el comando en la función K(zsh definición más abajo), que k EEPS su salida en la variable $K.

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

Guardar automáticamente la salida de cada comando no es realmente posible solo con el shell, debe ejecutar el comando en un terminal emulado. Puede hacerlo ejecutándose desde adentro script(una utilidad BSD, pero disponible en la mayoría de los dispositivos, incluidos Linux y Solaris), que guarda toda la salida de su sesión a través de un archivo (todavía se necesita un poco de esfuerzo para detectar de manera confiable el último mensaje en el mecanografiado )


2

Me gusta usar los ticks posteriores '(Está en la misma tecla que ~)

> vim `find . -name somefile.txt`

Los ticks posteriores ejecutan el comando dentro de los ticks y la salida puede ser utilizada por el comando. Lo anterior encontrará todos los archivos somefile.txt, lo que le permite usar :nextpara moverse por todos los archivos.

Es muy útil si pasa un par de intentos refinando el comando, porque luego puede usar la sustitución del historial para repetir el comando para el editor.

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

2

Debo haber perdido el punto aquí, porque usaría:

:find **/somefile.txt

(si supiera que solo hay uno en mi :echo &path ) o, si los quisiera a todos:

:args **/somefile.txt

Editar: Whoa! Ok, así que hice perder el punto - desea que la lista que ha encontrado, no se abrieron los archivos reales? Intenta (de nuevo, desde Vim):

!!find . -name somefile.txt

-- mi error :)


1

Como @davidmh señaló en los comentarios, puede usarlo xargscon la bandera -osi desea usar una aplicación interactiva.

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

Si no lo usa -o, probablemente estropeará el estado del terminal después de salir de vim. Si lo ha hecho, debería poder restablecer su terminal con el siguiente comando:

reset

0

Escribí una función pvimque hace lo que quieres. Si se canalizan varias líneas pvim, ignora todas menos la primera, aunque podría extenderse para abrir varios archivos en 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"
}

Úselo como:

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

que cargará el primer "foo.txt" en vim como si hubiera escrito:

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


0

Aquí hay una xargssolución más simple que las ya mencionadas:

find -name somefile.txt | xargs vim -p

La -popción le dice vimque abra cada archivo en una pestaña separada. Esto me parece más conveniente que usar tampones.


0

Descubrí que abrir un archivo con la ayuda de locatein vim es extremadamente conveniente y mucho más rápido que find.

El siguiente comando busca un archivo llamado app.pyen la ruta que contiene el directorio MyPythonProject.

:args `locate '*MyPythonProject*app.py'`
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.