Emacs の ansi-term でディレクトリの変更を検知
zsh であれば .zshrc
などの設定ファイルに以下を.
# notify pwd to ansi-term function chpwd_emacs_ansi_term() { echo '\033AnSiTc' $PWD } if [[ $EMACS =~ "(term:.*)" ]]; then chpwd_functions=($chpwd_functions chpwd_emacs_ansi_term) echo "\033AnSiTu" $USER echo "\033AnSiTh" $HOST chpwd_emacs_ansi_term fi
これにより Emacs が ansi-term 内のシェルにおける pwd を default-directory として使ってくれるようになるので C-x C-f などでファイルを開こうとした際にシェルの pwd がデフォルトで選択され,気分が良い.
bash などでも cd にフックして chpwd_emacs_ansi_term
を実行させればよいが,方法を知らないのでここには書かない..
仕組み
Emacs の ansi-term は,シェルからの出力を全て盗み見れるのを良いことに \033AnSiT なる独自のコマンドシーケンスを用意している.これを行なっているのが term-handle-ansi-terminal-messages
.
利用可能なコマンドは以下のとおり.
\033AnSiTc ディレクトリ名 | 「ディレクトリ名」で指定されたディレクトリを default-directory に設定 |
\033AnSiTh ホスト名 | 現在のホストが「ホスト名」であることを ansi-term に認識させる |
\033AnSiTu ユーザ名 | 現在のユーザが「ユーザ名」であることを ansi-term に認識させる |
はじめに示したコードでは cd にフックして \033AnSiTc
により現在のディレクトリを ansi-term に送信しているというわけ.
ちなみに term-handle-ansi-terminal-messages
は RMS が書いたコードだそうで,みなのもの心して読むように.