[追記] tramp新しくしたらうまくいきました → 新しいtrampは違った! - ぺっくブログミラー@peccul
emacsのtrampを使うとリモートのファイルを直接開いたりできるけど,どうもシェルをzshに変えて,プロンプトをzshらしくしてからうまく動かないことがわかった.
なんでも,trampがプロンプト文字列を正規表現で探してるそうな.
ちなみに環境はMacOSX(Leopard)のCarbonEmacsでM-x tramp-versionは2.0.58-pre
tramp: Waiting 60s for prompt from remote shell
TRAMPとZsh - ゴミ箱の中の雑記帳
という表示が出てそこから先に進まない、というものだ。
同じ現象.でもやりたいのはC-xC-v /sudo::でファイルを開き直したい.sudoxはどうもないみたいだ.
*tramp/sudo *バッファを除くと制御文字っぽいのが並んでていかにも正規表現にマッチしてなさそう.
ちなみに自分のプロンプトの設定は以下のような感じになっていた
リスト2.5 プロンプトの設定例 - 応用例 - 状況によってプロンプトを変えている。色もつく
漢のzsh (2) 取りあえず、プロンプトを整えておく。カッコつけたいからね | マイナビニュース
# set prompt case ${UID} in 0) PROMPT="%B%{^[[31m%}%/#%{^[[m%}%b " PROMPT2="%B%{^[[31m%}%_#%{^[[m%}%b " SPROMPT="%B%{^[[31m%}%r is correct? [n,y,a,e]:%{^[[m%}%b " [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && PROMPT="%{^[[37m%}${HOST%%.*} ${PROMPT}" ;; *) PROMPT="%{^[[31m%}%/%%%{^[[m%} " PROMPT2="%{^[[31m%}%_%%%{^[[m%} " SPROMPT="%{^[[31m%}%r is correct? [n,y,a,e]:%{^[[m%} " [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && PROMPT="%{^[[37m%}${HOST%%.*} ${PROMPT}" ;; esac
そんで,
tramp 経由だと、TERM 環境変数が “dumb” に設定されるので、”dumb” のときはプロンプトを変更しないように、次のような感じで .zshrc を変更します。
if [ "$TERM" != "dumb" ]; then
PROMPT=’左プロンプトの設定’RPROMPT=’右プロンプトの設定’
fi
Emacs から sudo 経由でファイルを編集する方法 | Carpe Diem
とのことなので~/.zshrcにdumbとかの記述を追加してみた.結局変わらず.(ちなみにこの記事ではtramp-2.19を使ってるからすでにdumbを設定するようになってるかも)
case "$TERM" in
zshユーザーが普通にtrampを使う方法 — ディノオープンラボラトリ
dumb | emacs)
PROMPT="%m:%~> "
unsetopt zle
;;
esac
これも一緒.
just add the following snippet to your remote .zshrc (or your local ~root/.zshrc if you’re su-tramping locally). Ref inlined :D
# prompts
tramp hangs if remote shell is zsh | z·eeki·sh
if $TERM == "dumb" ; then # in emacs
PS1='%(?..[%?])%!:%~%# '
# for tramp to not hang, need the following. cf:
# http://www.emacswiki.org/emacs/TrampMode
unsetopt zle
unsetopt prompt_cr
unsetopt prompt_subst
unfunction precmd
unfunction preexec
else
# your prompt stuff
fi
これを見て~root/.zshrcに記述してみた.結局変わらず.
なんでやねんと思って,.zshrcに
case ${UID} in 0) echo "TERM = $TERM" >>~/tramptest env >>~/trampenv ....
みたいなこと書いてみたらなんのこっちゃ$TERMはxterm-colorってターミナルと変わらんやん.
ってわけで,rootになった時の設定がそのまま反映されてたんですね.$TERM==dumbの設定なんか無視されてたわけですよ.
なら話は早い.と.ブログ書きながら確かめたんやけど,プロンプトはそのままでいけた.
rootのときにzle,prompt_cr,prompt_substをunsetoptしたらとりあえず/sudo::は動くようになった.
結局remoteにアクセスする時にもzleやらをunsetせなあかんのやろうか?あとでtrampをアップデートしてみようと思う
case ${UID} in 0) unsetopt zle unsetopt prompt_cr unsetopt prompt_subst # unfunction precmd # unfunction preexec PROMPT="%B%{^[[31m%}%/#%{^[[m%}%b " PROMPT2="%B%{^[[31m%}%_#%{^[[m%}%b " SPROMPT="%B%{^[[31m%}%r is correct? [n,y,a,e]:%{^[[m%}%b " [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && PROMPT="%{^[[37m%}${HOST%%.*} ${PROMPT}" ;; *) PROMPT="%{^[[31m%}%/%%%{^[[m%} " PROMPT2="%{^[[31m%}%_%%%{^[[m%} " SPROMPT="%{^[[31m%}%r is correct? [n,y,a,e]:%{^[[m%} " [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && PROMPT="%{^[[37m%}${HOST%%.*} ${PROMPT}" ;; esac