Mettre à jour automatiquement le répertoire par défaut lorsque PWD change en mode shell et en mode term

12

Existe-t-il des options ou des packages qui provoquent default-directoryune mise à jour si le répertoire de travail change dans shell-modeet term-mode? C'est-à-dire lors de l'utilisation cd, mais la solution devrait être plus robuste que de simplement rechercher cette commande particulière et peut-être quelques autres - elle devrait en fait vérifier la valeur $PWDaprès chaque commande, je pense.

Plus important encore, il devrait également fonctionner lors de la connexion à une machine distante depuis l'intérieur d'un tampon shell-modeou term-modequi a été créé pour la première fois en default-directoryétant un répertoire local. C'est en fait la fonctionnalité dont j'ai vraiment besoin: pouvoir dire par programme si les commandes que je tape dans de tels terminaux sont exécutées sur une machine distante. Je voudrais obtenir ces informations sous la forme d'un ensemble correctement défini default-directoryet s'il existe un moyen d'obtenir cela, alors l'outil faisant cela fonctionnerait également localement comme décrit ci-dessus.

tarse
la source
Avez-vous regardé dirtrack-mode? Il a un crochet qui peut faire ce que vous voulez.
J David Smith

Réponses:

12

Je pense que la première partie de votre question peut être terminée dirtrack-mode. Tout d'abord, vous définissez votre invite shell pour inclure le répertoire de travail actuel. Ensuite, vous définissez dirtrack-listune expression régulière qui indique dirtrack-modecomment l'extraire. Exemple: j'ai défini PS1dans Bash comme suit:

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

et dans Emacs je mets dirtrack-listet allume dirtrack-mode:

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

(Tiré de cet excellent article de blog .)

Après cela, je suis capable de changer de répertoire à volonté et de default-directorychanger au fur et à mesure. Cela fonctionne également si, dans un shell, je SSH vers une machine distante où j'ai défini l'invite de la même manière - cd /etc/apache2, sur la machine distante, passe default-directoryà /etc/apache2. Notez cependant que ceci est local - dans le cas de la machine distante, default-directorysera toujours réglé sur /etc/apache2sur la machine locale .

Si je comprends la deuxième partie de votre question, vous voulez default-directoryêtre réglé sur quelque chose comme remote-machine:/etc/apache2lorsque SSHing sur une autre machine. Lorsque vous utilisez ssh-el , vous pouvez exécuter ssh-directory-tracking-modepour que cela fonctionne. Par exemple, si je lance M-x ssh, cd to /etc/apache2, puis run C-x C-f, l'invite que je vois est:

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

Vous pouvez exécuter «Mx ssh-directory-tracking-mode» à la main, mais il est plus pratique de le définir comme hook pour le mode ssh:

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

Plus d'information:

Saint Aardvark le Moquette
la source
2
Excellente réponse, merci! Cela m'intéresse vraiment parce qu'un package que j'ai écrit a développé des fonctionnalités qui le rendront souhaitable. C'est ce with-editorqui sera utilisé par la prochaine version de Magit. Magit lui-même n'utilise pas with-editor's shell-mode/ term-mode-support, donc je ne l'intégrerai probablement pas avant la sortie. Mais les informations que vous avez fournies le rendront beaucoup plus facile à faire, une fois que j'aurai terminé avec la version Magit et que je pourrai à nouveau me concentrer sur d'autres choses.
tarsius
Voici comment démarrer avec l' with-editorextérieur de Magit: emacs.stackexchange.com/questions/27/… . Et le problème Magit qui m'a amené à poser cette question: github.com/magit/magit/issues/1638 .
tarsius