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

smauel
fuente

Respuestas:

31

Puede usar la sustitución de comandos:

vim $(find -name somefile.txt)

o

find -name somefile.txt -exec vim {} \;
dogbane
fuente
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
1
Un usuario anónimo observa que esto fallará si el nombre de archivo tiene espacios
Michael Mrozek
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 
Karl
fuente
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 )

Gilles 'SO- deja de ser malvado'
fuente
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 `!!`
Martin York
fuente
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 :)

Barry Arthur
fuente
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
durum
fuente
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")

sente
fuente
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.

Cory Klein
fuente
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'`
Searene
fuente