Digamos que tengo un servidor X11 que está colgando, evitando que guarde el trabajo de la sesión XTerm Vim que controla el servidor X11. (No GVim, solo Vim-in-XTerm normal).
¿Hay alguna manera de que pueda (desde una terminal diferente) decirle al proceso Vim en ejecución que "guarde todo y salga" de la línea de comando? ¿Enviando una señal o por algún otro medio?
Sé acerca de los archivos de intercambio de Vim, y que podría matar a Vim y recuperarme del intercambio. Estoy preguntando si hay una forma "más limpia".
Respuestas:
Recientemente me he encontrado con este problema (de otra manera: Vim ejecutándose en un servidor remoto, y había olvidado la pantalla), decidí buscar una forma.
La primera idea fue buscar los descriptores de archivo utilizados por Vim e intentar escribir en él. Los fds de Vim apuntan al terminal psedoterminal abierto por el emulador de terminal, naturalmente:
Sin embargo, mis primeros intentos fallidos:
Los
^[
y^M
fueron obtenidos por CtrlVEscy CtrlVEnter, respectivamente.Todos dieron como resultado que los caracteres aparecieran en el terminal (estaba probando esto localmente, antes de aplicarlo a la sesión remota). Buscando en Google, encontré esta publicación SO , usando Python para escribir en el dispositivo pseudoterminal:
Y probarlo en un shell interactivo de Python funcionó:
¡Hecho!
fuente
Puede enviar comandos a vim externamente si está ejecutando ...
Servidores Vim
Por ejemplo, haciendo:
hará que vim inicie un servidor con el nombre "vim". Llámelo dos veces y el nuevo servidor se llamará "vim1", llámelo tres veces y será "vim2", etc. Es posible que desee crear un alias de ese comando.
Puede saber qué servidor se nombra una instancia en particular mirando el título de la ventana. Cuando veas:
el nombre del servidor distingue entre mayúsculas y minúsculas "VIM3" ("vim3" se referiría a la misma instancia). Tenga en cuenta que si ve:
eso no significa necesariamente que tenga un servidor llamado "VIM". Puede asegurarse de que el servidor existe enumerando los nombres del servidor con:
Aún así, la pregunta solo surge para "VIM", específicamente. Si ve "GVIM" o algún otro nombre con un número adjunto, significa que es un servidor.
Cómo usar el cliente
Ahora, en su pregunta, puede guardar todo y salir de una instancia vim dada haciendo, por ejemplo:
Usamos el escape para volver al modo normal en caso de que esté en modo de inserción o comando. Puede hacer otra cosa que no sea
:wqa
, pero eso me parece más apropiado porque dejará los archivos de intercambio de buffers que no se pudieron guardar (porque son nuevos y no tienen un nombre de archivo, etc.).Si desea hacerlo para todas las instancias, como en su caso aquí, puede recorrer la lista de servidores de esta manera:
Si por alguna razón no le gusta
--remote-send
, puede usar el--remote-expr
que tiene la ventaja de que causará que el cliente muestre el resultado o el error que podría haber causado, así:Tenga en cuenta que el uso de la funcionalidad del servidor de Vim requiere que Vim se haya creado con la
+clientserver
opción.fuente
Instale el
reptyr
comando utilizando el administrador de paquetes del sistema, como:Luego use el
reptyr
comando para cambiar el tty remoto al tty local (nuevo), de la siguiente manera:¿Dónde
PID
está la ID del proceso de laps
salida del comando?Ante el error:
Cambie el "alcance de ptrace" a 0:
Una vez que la sesión vim se ha cambiado de la sesión anterior a la nueva, guarde y salga como de costumbre. Tenga en cuenta que puede que tenga que presionar Enterpara actualizar la consola.
fuente
¿Qué pasa si matas con gracia a Vim?
kill -s 15 -p [PID for Vim]
kill -s (señal) 15 se llama SIGTERM, que le dice a ese proceso que se cierre con gracia.
Para obtener el PID (ID de proceso) de Vim use:
ps ax | grep vim
fuente