GNU/Linux >> Tutoriales Linux >  >> Linux

¿Es posible encontrar qué Vim/tmux tiene el archivo abierto?

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?
Linux
  1. Cómo encontrar el archivo más antiguo en un árbol de directorios en Linux

  2. ¿Alternativa a 'dd' que no trunca el archivo?

  3. ¿Cómo sabe el comando Xdg-open qué aplicación usar para abrir un archivo?

  4. ¿Cómo puedo editar todos los archivos devueltos por find in vi en Linux?

  5. ¿Cómo encontrar el administrador de archivos predeterminado?

Cómo guardar un archivo en Vim/Vi y salir del editor

¿Cómo encuentro la ubicación MySQL my.cnf?

Cómo abrir un archivo en vim usando pipe

¿Por qué es posible voltear la pantalla?

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

Encuentra qué proceso está modificando un archivo