Actualiza automáticamente el directorio predeterminado cuando PWD cambia en modo shell y modo término

12

¿Hay alguna opción o paquete que haga default-directoryque se actualice si el directorio de trabajo cambia en shell-modey term-mode? Es decir, cuando se usa cd, pero la solución tendría que ser más robusta que solo buscar este comando en particular y tal vez algunos otros; en realidad debería verificar el valor de $PWDdespués de cada comando, creo.

Más importante aún, también debería funcionar cuando se conecta a una máquina remota desde dentro de un búfer shell-modeo term-modeque se creó por primera vez con default-directoryun directorio local. Esa es realmente la característica que realmente necesito: poder decir mediante programación si los comandos que escribo en dichos terminales se ejecutan en una máquina remota. Me gustaría obtener esa información en forma de un conjunto adecuado default-directoryy calcular si hay una manera de obtener eso, entonces la herramienta para hacerlo también funcionaría localmente como se describe anteriormente.

tarsius
fuente
¿Has investigado dirtrack-mode? Tiene un gancho que puede hacer lo que quieras.
J David Smith

Respuestas:

12

Creo que la primera parte de tu pregunta se puede hacer con dirtrack-mode. Primero, configura su indicador de shell para incluir el directorio de trabajo actual. Luego, establece dirtrack-listuna expresión regular que le dice dirtrack-modecómo extraerla. Ejemplo: configuré PS1en Bash para que sea esto:

export PS1="[\h:\w] $ "

y en Emacs configuro dirtrack-listy enciendo dirtrack-mode:

(set-variable 'dirtrack-list '("^.*[^ ]+:\\(.*\\)]" 1 nil))
(dirtrack-mode 1)

(Tomado de esta gran publicación de blog ).

Después de eso, puedo cambiar los directorios a voluntad, y los default-directorycambios a medida que avanzo. Esto también funciona si, en un shell, utilizo SSH en una máquina remota donde configuré el indicador de la misma manera - cd /etc/apache2, en la máquina remota, cambia default-directorya /etc/apache2. Sin embargo, tenga en cuenta que esto es local : en el caso de la máquina remota, default-directorytodavía se configurará /etc/apache2en la máquina local .

Si entiendo la segunda parte de su pregunta, desea default-directoryque se establezca algo así como remote-machine:/etc/apache2cuando SSHing a otra máquina. Cuando use ssh-el , puede ejecutar ssh-directory-tracking-modepara que esto funcione. Por ejemplo, si ejecuto M-x ssh, cd a /etc/apache2, luego ejecuto C-x C-f, el mensaje que veo es:

Find Files or Url: /scp:aardvark@remote-machine:/etc/apache2

Puede ejecutar 'Mx ssh-directory-tracking-mode` a mano, pero es más conveniente configurarlo como un enlace para el modo ssh:

(setq ssh-mode-hook 'ssh-directory-tracking-mode)

Más información:

San Aardvark el Alfombrado
fuente
2
Excelente respuesta, gracias! De hecho, estoy interesado en esto porque un paquete que he escrito tiene características desarrolladas que lo harán deseable. Es el with-editorque será utilizado en el próximo lanzamiento de Magit. Magit en sí no usa with-editor's shell-mode/ term-mode-support, por lo que probablemente no integre esto antes del lanzamiento. Pero la información que proporcionó hará que sea mucho más fácil hacerlo, una vez que haya terminado con el lanzamiento de Magit y pueda concentrarme nuevamente en otras cosas.
tarsius
Aquí le mostramos cómo comenzar with-editorfuera de Magit: emacs.stackexchange.com/questions/27/… . Y el tema Magit que me llevó a hacer esta pregunta: github.com/magit/magit/issues/1638 .
tarsius