zshユーザーが普通にtrampを使う方法

久々にEmacsの話題です。trampって便利ですよね。ローカルのEmacsでssh先のファイルを編集したり、sudoしてroot権限で編集できたりするのは素晴らしいと思います。trampの素晴らしさを知らない人は、下記サイトなどを参照してください。

ところで、zshをログインシェルにしているとtrampが上手く動かない現象に出くわします。具体的には、「/sudo::/etc/hosts」などを開こうとして下記のように怒られることがあります。

tramp: Waiting 30s for remote `/bin/sh' to come up...
apply: Couldn't `exec env 'ENV=' 'PS1=$ ' /bin/sh', see buffer `*tramp/sudo *'

この解決方法ですが、.zshrcや.zsh_profileなどに下記のように書けばOKです。

case "$TERM" in
  dumb | emacs)
    PROMPT="%m:%~> "
    unsetopt zle
    ;;
esac

詳細な原因は私も理解していませんが、zshのイチオシ機能であるZLE(Zsh Line Editor)の挙動がtrampの想定外ということなのでしょう。

この設定だけで、近所のサーバ上のファイルなら瞬時に開くことができます。他には特に設定は不要です。ネットで探すと、.emacsでtrampの設定を変更したりファイルが開くまで10秒待ったりしている人がいるようですが、ひょっとするとシェルを疑った方がいいかもしれません。

ちなみに、TERMがdumbとemacsのときはPROMPTの設定も変更しています。これは、M-x shellしたときなど、端末制御が貧弱な端末でプロンプトがグチャグチャになるのを防ぐ意図です。併せて設定することをオススメします。

追記:「瞬時に開くことができる」は勘違いでした。比較的近くのサーバでも最初に開くときは5秒くらいかかります。同一サーバの別ファイルを開く場合は一瞬なんですけどね。

追記2:今回の内容の参考にした記事を紹介するのを忘れていました。「EmacsのM-x shellでzshを使う設定 – ’(rubikitch wanna be (a . lisper))」が参考になりました。

コメント / トラックバックはありません

コメントする