TRAMPとZsh

投稿: 2008年5月6日

Emacsで、別のマシンにあるファイルをさもローカルにあるかのように扱うための TRAMPが、いつの頃からかちゃんと動かなくなっていて困っていた。そのうちちゃんと調べて直そう、と思いつつ、この問題を思い出すのは急いで TRAMPを使わないといけない時ばかりだったので先延ばしになっていたのだが、ようやく今日ちゃんと調べて対応してみた。

現象としては、リモートのファイルにアクセスしようとすると、
tramp: Waiting 60s for prompt from remote shell
という表示が出てそこから先に進まない、というものだ。

Emacsの TRAMPのバッファーを見てみると、正常にログインはできていて、プロンプトも返ってきていることが分かった。しかし、上述のメッセージから、これが正しくプロンプトとして認識されていないらしいことが分かる。 TRAMPの infoファイルを見てみると、プロンプトの判断は、 shell-prompt-pattern、 tramp-shell-prompt-patternという変数に設定されている正規表現に基づいているということだ。これらの変数の設定を眺めつつ、実際に返ってきている文字列を見てみると、どうもプロンプトの前にある CR (^M) が問題らしいことが分かった。

まず、 sttyの設定で CR, LFの出力を制御してみることにした。 ocrnl を設定することで、 TRAMPの問題については解決できるようなのだが、これをログインシェルの初期化で行ってしまうと、端末の表示がおかしなことになってしまうようだったので、この方法は断念した。 (もちろん sttyで -onlcrして端末ソフトの設定を変える、なんてことは試してみた。)

さて、ここでちょっと考えてみて思い当たることがあった。この TRAMPの問題は、以前は存在しなかったのだが、いつの頃からか発生するようになった、というのは前述の通りだ。それで、いつからなのかを考えてみたのだが、どうもログインシェルを tcshから Zshに変えた時からかもしれない、という気がしてきた。そこで Zshの infoファイルを調べて、何か問題解決に結びつくような設定がないかざっと見てみたのだが、これというものは見つからなかった。

だとすると、 Zshではなく shが起動されるようにすれば良いのではないかと思い、再度 TRAMPの infoを見てみた。で、分かったことは、接続方法として sshxもしくは scpx (デフォルトは ssh) を設定すると、標準のログインシェルではなく、 /bin/shが使われる、ということだ。

ということで結論は、 tramp-default-method を scpxに設定する、ということだ。実際、これでどうやら解決した模様。