Yo uso tmux
en el trabajo como mi IDE. También ejecuto vim
en una variedad de paneles tmux y, con bastante frecuencia, pondrá en segundo plano el proceso (o, alternativamente, simplemente cierro la ventana; tengo vim configurado para no eliminar los búferes abiertos cuando la ventana está cerrada). Ahora tengo un problema, porque un archivo que quiero editar está abierto en una de mis otras sesiones de vim pero no sé cuál.
¿Es posible averiguar cuál, sin pasar manualmente por todas mis ventanas y paneles? En mi caso particular, sé que no lo edité con vim ~/myfile.txt
porque ps aux | grep myfile.txt
no devuelve nada.
Respuesta aceptada:
No me dice todo , pero usé fuser ~/.myfile.txt.swp
que me dio el PID de la sesión vim. Ejecutando ps aux | grep <PID>
Pude averiguar qué sesión de vim estaba usando, lo que me dio una pista sobre en qué ventana la tenía abierta.
Gracias a la inspiración de Giles y un poco de persistencia y suerte, se me ocurrió el siguiente comando:
⚘ (FNAME="/tmp/.fnord.txt.swp"; tmux switch -t $(tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}' | grep $(ps -o tty= -p $(lsof -t $FNAME))$ | awk '{ print $1 }'))
Para explicar lo que esto hace:
(FNAME="/tmp/.fnord.txt.swp";
Esto crea una subcapa y establece FNAME
como variable de entorno. Estrictamente hablando, no es necesario:simplemente podría reemplazar $FNAME
con el nombre del archivo usted mismo, pero facilita la edición. Ahora, trabajando de adentro hacia afuera:
lsof -t $FNAME
Esto produce solo el PID del proceso que ha abierto el archivo.
ps -o tty= -p $(...)
Esto produce los pts
del PID que encontramos usando lsof
.
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'
Esto produce una lista de panel de entradas como session:0.1 /dev/pts/1
. La primera parte es el formato que le gusta a tmux para los objetivos, y la segunda parte son los pts
| grep $(...)$
Esto filtra nuestra lista de paneles:el $
final es por lo que solo coincidirá con el uno nos importa Lo descubrí por casualidad ya que tenía pts/2
y pts/22
, por lo que había dos fósforos, ¡ups!
| awk '{ print $1 }'
Esto produce la session:0.1
parte de la salida del panel, que es adecuada para pasar a tmux switch -t
.
Esto debería funcionar tanto en las sesiones como en los paneles, enfocando el panel que contiene su archivo de intercambio.
Relacionado:¿Eliminar líneas de encabezado adicionales del archivo, excepto la primera línea?