8

EmacsW32 と cygwin で Tramp をセットアップするのに問題があります。w32shell を使用して cygwin をシェルとして使用するように emacs を構成しました。また、HOME 環境変数を c:/cygwin/home/myusername に設定します。

問題は、tramp がハングしたように見え、接続が確立されないことです:

「新しいシェルのプロンプトを待っているトランプ」.

デバッグを有効にしようとしましたが、まだこのメッセージしか表示されません。これについてのヒントが得られることを楽しみにしています。ありがとうございました。

4

4 に答える 4

7

emacs wiki の cygwin 関連の情報に注意してください: http://www.emacswiki.org/emacs/TrampMode

私は EmacsW32 を使用していませんが、Cygwin と NT Emacs で ssh 経由の TRAMP をうまく使用しています。

sshエージェントなしでTRAMPを動作させることはできませんでした(つまり、資格情報の入力を求めます). エージェントを使用することにも満足している (そして、必要に応じてキーを生成し、authorized_keys ファイルを追加した) と仮定すると、私にとって有効なアプローチは次のとおりです。

  1. cygwin から ssh-agent を実行します。
  2. cygwin 経由で NT Emacs を起動します (ssh-agent 環境変数を継承するため)。
  3. TRAMP メソッドとして「sshx」を使用します (各ファイル パスで手動で指定できますが、デフォルトにすることをお勧めします(setq tramp-default-method "sshx"))。

これらのポイントはすべて Wiki でカバーされていますが、多少自動化することもできます。

ステップ 1 では、私の bash プロファイルは、ssh エージェントがまだ実行されていない場合は自動的に開始し、ID の有効期限が切れている場合はパスフレーズの入力を求めます。(以下のコードを参照してください。)

ステップ 2 では、emacs を起動するための Windows ショートカットのターゲットは次のようになります。

C:\cygwin\bin\bash.exe --login -c "env HOME=\"`cygpath '%APPDATA%'`\" /cygdrive/c/emacs/emacs-23.1/bin/runemacs.exe"

引数は、私の bash プロファイルが実行されることを意味します。--loginこれにより、emacs が開始される前にステップ 1 が常に処理されることが保証されます。

( HOMETRAMP には設定は必要ありませんが%APPDATA%、NT Emacs ではデフォルトです。これにより、Cygwin のホーム ディレクトリが優先されなくなります。したがって、このショートカットを使用して実行するかどうかに関係なく、emacs 構成の一貫性が保たれます。)

最後に、ssh-agent を管理する cygwin .bash_profile のコードを次に示します。少しハックですが、私にとってはうまくいきます。

4 時間 (14400 秒) 後に ID が期限切れになることに注意してください。その後、TRAMP がハングアップする可能性があるため (前述のように、資格情報の入力を求められることはありませんでした)、この問題に注意してください。C-g接続しようとするのを止めるために入力します。接続を再開するには、通常、別の cygwin シェルを起動し、パスフレーズを再入力するだけで、TRAMP は再び満足します。ときどき応答しないままになることがありますが、*tramp* バッファを強制終了すると解決します。もちろん、ID を期限切れにしないことで、この問題を回避できるはずです。

SSH_ENV="${HOME}/.ssh/environment"

# Run ssh-agent, if one is not already running
function start_agent {
    echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent -t 14400 | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" >/dev/null
    /usr/bin/ssh-add;
}

# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" >/dev/null
    #ps ${SSH_AGENT_PID} doesn't work under cywgin
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ >/dev/null || {
        start_agent;
    }
    #if our ssh-added identity has expired (see -t option to ssh-agent)
    #then we need to re-add it
    if ! /usr/bin/ssh-add -l >/dev/null; then
        /usr/bin/ssh-add;
    fi
else
    #no ssh-agent running at the moment
    start_agent;
fi
于 2010-04-23T11:50:20.533 に答える
7

補足として、それ以来、私は Windows での TRAMP の使用方法を変更しました。

Windows での TRAMP は単純に遅すぎました。OpenSSH の Control Master 機能は私が必要としていたものでした。これにより、永続的な SSH 接続が開かれたままになり、他の方法ではすべての TRAMP 操作に必要なコストのかかる接続が不要になります。残念ながら、現時点では Cygwin は基本的に Control Master をサポートできません:/

これが事実であるため、私の現在の解決策は、WindowsでEmacsをまったく実行しないことです。代わりに、Cygwin の X.Org サーバーをインストールし、GNU/Linux VM (私の Windows ボックスでホストされている) で Emacs を実行し始め、Cygwin X ディスプレイを使用しました。

これは本当にうまく機能します。

私はデーモン モードで emacs を実行しています。つまり、X サーバーに問題が発生したかどうかは関係ありません。また、Windows ボックスをシャットダウンする必要がある場合は、VM の状態を保存して復元するだけで済みます。その後、実際にセッションを失うことはありません(*)。(desktop.el は、どのような場合でも、または VM を再起動する必要がある場合に、かなり適切なセッション管理を提供します。ただし、それを使用している場合は、desktop-files-not-to-saveすべての TRAMP バッファを無視しないように変数を変更することをお勧めします! 「 」に設定しただけです^$

startxwinではなくCygwin の X サーバーを起動するようにしてくださいstartx(前者は、X サーバーのウィンドウを通常の Windows ウィンドウとして表示できるようにします)。次に、xterm から実行ssh -Y (me)@(linux) -f "emacs --daemon"してサーバーを最初ssh -Y (me)@(linux) -f "emacsclient -c"に起動し、新しいクライアントを起動します。

'scpc' および 'rsyncc' TRAMP メソッドは Control Master を自動的に使用します。ただし、Linuxボックスではまだssh-agentを実行しています(emacsなどからリモートシェルを開くときに認証する必要がないようにするため)。「emacs --daemon」コマンドはssh -Y (me)@(linux) -f "source ~/.ssh/agent-environment && emacs --daemon"、実行時に ssh-agent の出力をそのファイルに転送/コピーしたと仮定して、次のようになります (これについては ID タイムアウトは気にしません)。

最後に、最後に、bash_profile で cygwin ssh-agent を管理するために最初に述べたメカニズムと同様のメカニズムを使用している場合は、認証されたIDがロードされていません-何もありません(タスクマネージャーを見て、そこにssh-addプロセスが座っているのを確認するまで)。したがって、これstartxwinを避けるために、常にコマンドラインから使用することをお勧めします。

編集:
(*)それは悪い仮定でした。それ以来、X サーバーを再起動すると、後で emacs デーモンに再接続できなくなることに気付きました。これはかなり残念なことです。したがって、セッションを復元するためにデスクトップ ライブラリに完全に依存しています。デスクトップファイルを定期的auto-save-hookに保存して、最新の状態に保ちます。デスクトップ機能を強化するためのこのオプションとその他のオプションについては、Emacs Wiki を参照してください。

于 2010-06-15T21:59:57.087 に答える
4

以前は EmacsW32 を使用していましたが、このような問題が山ほどありました。CygwinのEmacsに切り替えたときに、それらはすべてなくなりました。すでにインストールされている可能性があります。bash プロンプトで次のように入力するだけです。

XWin - マルチウィンドウ &
エクスポート DISPLAY=:0.0
emacs

Linux VM よりも少し軽量になります。

于 2010-12-07T15:39:30.537 に答える