Das Standardverzeichnis wird automatisch aktualisiert, wenn PWD im Shell- und Term-Modus wechselt

12

Gibt es Optionen oder Pakete, die default-directoryaktualisiert werden, wenn sich das Arbeitsverzeichnis in shell-modeund ändert term-mode? Dh bei der Verwendung cd, aber die Lösung müsste robuster sein, als nur nach diesem bestimmten Befehl und vielleicht ein paar anderen zu suchen - es sollte tatsächlich der Wert $PWDnach jedem Befehl überprüft werden , würde ich denken.

Wichtiger ist jedoch, dass dies auch funktionieren sollte, wenn eine Verbindung zu einem Remote-Computer über einen shell-modeoder einen term-modePuffer hergestellt wird, der zuerst default-directoryals lokales Verzeichnis erstellt wurde. Das ist eigentlich die Funktion, die ich wirklich brauche: Programmgesteuert feststellen zu können, ob die Befehle, die ich in solche Terminals eingebe, auf einem Remote-Computer ausgeführt werden. Ich möchte diese Informationen in Form einer richtigen Menge default-directoryund Figur erhalten, wenn es einen Weg gibt, dies zu erreichen, dann würde das Tool, das dies tut, auch lokal funktionieren, wie oben beschrieben.

Tarsius
quelle
Hast du nachgesehen dirtrack-mode? Es hat einen Haken, der machen kann, was Sie wollen.
J David Smith

Antworten:

12

Ich denke, der erste Teil Ihrer Frage kann erledigt werden dirtrack-mode. Zunächst legen Sie fest, dass Ihre Shell-Eingabeaufforderung das aktuelle Arbeitsverzeichnis enthält. Als Nächstes legen Sie dirtrack-listeinen regulären Ausdruck fest, der angibt, dirtrack-modewie er extrahiert werden soll. Beispiel: Ich habe PS1in Bash folgendes eingestellt:

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

und in Emacs stelle ich ein dirtrack-listund schalte ein dirtrack-mode:

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

(Aus diesem großartigen Blog-Beitrag entnommen .)

Danach kann ich die Verzeichnisse nach Belieben default-directorywechseln und ich ändere sie nach Belieben . Dies funktioniert auch , wenn in einer Schale, ich SSH zu einem Remote - Computer , auf dem ich die Eingabeaufforderung auf die gleiche Weise festgelegt haben - cd /etc/apache2, auf dem entfernten Rechner, ändert sich default-directoryzu /etc/apache2. Beachten Sie jedoch, dass dies lokal ist - im Fall des Remotecomputers default-directorywird dies weiterhin /etc/apache2auf dem lokalen Computer festgelegt.

Wenn ich den zweiten Teil Ihrer Frage verstehe, möchten Sie default-directoryauf so etwas wie remote-machine:/etc/apache2SSHing auf einem anderen Computer festgelegt werden. Wenn Sie ssh-el verwenden , können Sie ausführen ssh-directory-tracking-mode, damit dies funktioniert. Wenn ich zum Beispiel " M-x sshCD to" /etc/apache2und dann "Run" ausführe C-x C-f, wird folgende Eingabeaufforderung angezeigt:

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

Sie können den "Mx ssh-directory-tracking-mode" von Hand ausführen, aber es ist bequemer, ihn als Hook für den ssh-mode festzulegen:

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

Mehr Informationen:

Saint Aardvark der Teppichboden
quelle
2
Ausgezeichnete Antwort, danke! Eigentlich interessiert mich das, weil ein Paket, das ich geschrieben habe, neue Funktionen hat, die dies wünschenswert machen. Es with-editorwird in der nächsten Version von Magit verwendet. Magit selbst verwendet with-editorden shell-mode/ term-mode-support nicht, daher werde ich diesen wahrscheinlich nicht vor der Veröffentlichung einbinden. Aber die Informationen, die Sie uns gegeben haben, werden es viel einfacher machen, wenn ich mit der Magit-Veröffentlichung fertig bin und mich wieder auf andere Dinge konzentrieren kann.
Tarsius
So fangen Siewith-editor außerhalb von Magit an: emacs.stackexchange.com/questions/27/… . Und die Magit-Ausgabe, die mich dazu brachte, diese Frage zu stellen: github.com/magit/magit/issues/1638 .
Tarsius