@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

Carbon Emacsでtrampを使ってsudoしようとしたけど,zshだからハングアップする→微妙に解決


[追記] 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
dumb | emacs)
PROMPT="%m:%~> "
unsetopt zle
;;
esac

zshユーザーが普通にtrampを使う方法 — ディノオープンラボラトリ

これも一緒.

just add the following snippet to your remote .zshrc (or your local ~root/.zshrc if you’re su-tramping locally). Ref inlined :D

# prompts
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

tramp hangs if remote shell is zsh | z·eeki·sh

これを見て~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