Отслеживание пути оболочки в Emacs

Не так давно я нашел следующий ценный фрагмент, который позволяет Emacs отслеживать мой текущий каталог в любом ansi-term буфере.

Более конкретно, если я cd <some/path> изнутри терминала внутри Emacs, а затем нажмите Cx Cf , Emacs будет запускать find-file из <some/path> напрямую, что очень и очень удобно.

 if [ -n "$INSIDE_EMACS" ]; then chpwd() { print -P "\033AnSiTc %d" } print -P "\033AnSiTu %n" print -P "\033AnSiTc %d" fi 

Однако вышеприведенный трюк не работает, если я ssh на удаленную машину из оболочки. В идеале в этом случае, если я нажимаю Cx Cf Emacs должен признать, что я пропустил какую-то машину и использовал tramp для запуска find-file на соответствующем компьютере и удаленном пути.

Это приводит меня к двум следующим вопросам:

  1. Как и почему этот сниппет выше?
  2. Как я могу расширить его, чтобы он мог отслеживать мои удаленные пути после того, как я ssh на другой компьютер?

Во-первых, как упоминалось в комментарии Роберта, ваш фрагмент недействителен. Как минимум вам нужно либо точку с запятой, либо новую строку до } . Утверждения печати, вероятно, также неверны.

Однако этого достаточно, чтобы догадаться, что происходит, поэтому я объясню это.

Когда вы запускаете ansi-term , он вызывает оболочку с переменной среды $INSIDE_EMACS . Код оболочки затем делает дополнительный материал, главное – переопределить функцию chpwd чтобы она chpwd дополнительные материалы, которые, без сомнения, включают текущий рабочий каталог. Вы можете легко проверить это, отметив, что по каждой команде вы, вероятно, увидите текущий каталог где-нибудь в области подсказки после завершения последней соответствующей команды.

Когда ansi-term видит что-то похожее на каталог в начале строки, он отслеживает это. Поэтому в этом смысле код не является особенным; каталог мог быть показан любым количеством способов, таких как добавление \w в приглашение через настройку переменной среды PS1 .

Что касается № 2, см. « Открыть удаленный файл, находящийся в emacs ansi-term buffer / window: ansi-term + tramp »