Slip Ahead Logging

It's not your fault at all.

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

これにより Emacsansi-term 内のシェルにおける pwd を default-directory として使ってくれるようになるので C-x C-f などでファイルを開こうとした際にシェルの pwd がデフォルトで選択され,気分が良い.

bash などでも cd にフックして chpwd_emacs_ansi_term を実行させればよいが,方法を知らないのでここには書かない..

仕組み

Emacsansi-term は,シェルからの出力を全て盗み見れるのを良いことに \033AnSiT なる独自のコマンドシーケンスを用意している.これを行なっているのが term-handle-ansi-terminal-messages

利用可能なコマンドは以下のとおり.

\033AnSiTc ディレクトリ名 「ディレクトリ名」で指定されたディレクトリを default-directory に設定
\033AnSiTh ホスト名 現在のホストが「ホスト名」であることを ansi-term に認識させる
\033AnSiTu ユーザ名 現在のユーザが「ユーザ名」であることを ansi-term に認識させる

はじめに示したコードでは cd にフックして \033AnSiTc により現在のディレクトリを ansi-term に送信しているというわけ.

ちなみに term-handle-ansi-terminal-messagesRMS が書いたコードだそうで,みなのもの心して読むように.