2

私はterm-modeEmacs 内で Bash シェルを実行していました。リモート ホストでは、term-modeのディレクトリ追跡機能default-directoryがホスト名を含むように設定されているため、タブ補完とファイル アクセスは Tramp を介してリモートで行われます。ただし、NFS から同じディレクトリをロードするため、ワークステーションとほとんど同じファイルシステムを共有するリモート ホストを使用することがあります。これらの場合、Tramp は私を遅らせすぎます。default-directoryこれらのシステムを使用する場合、Emacs がローカルに設定できるようにしたいと思います。これを行うためにterm-handle-ansi-terminal-messages、システムterm.elから、.emacs. この部分を置き換えます:

((= command-code ?h)
 (setq term-ansi-at-host argument))

これとともに:

((= command-code ?h)
 (setq term-ansi-at-host-real argument)
 (setq term-ansi-at-host
       ;; if it has an equivalent filesystem group, set to system-name
       (if (term-equivalent-filesystem-host-group-p argument)
           (system-name)
         argument)))

これはterm-equivalent-filesystem-host-group-p、ホストが同等のファイルシステムを持つものとして扱われるべきかどうかを伝える関数を呼び出します。

この方法には望ましい効果がありますが、システムの Lisp コードをコピーして変更することは、コードの将来の変更に対して堅牢ではありません。関数の機能の半分 (メッセージ ループまたはdefault-directoryand ange-ftp-… 変数の設定) を複製せずに関数をアドバイスすることはできないと思います。

これを行うより良い方法はありますか?

4

1 に答える 1

2

アドバイスをいただければ親身になれると思います。私はアドバイスを次のように定義します。

(defadvice term-handle-ansi-terminal-messages
   (before rewrite-remote-paths-to-local (message) activate)
   (when (and (string-match ".*\eAnSiTh.\\([^\r\n]+\\)\r?\n" message)
              (term-equivalent-filesystem-host-group-p (match-string 1 message)))
     (setq term-ansi-at-host-real (match-string 1 message))
     (setq message (replace-match (system-name) t t message 1))))

term-handle-ansi-terminal-messagesこれが行うことは、問題のケースに該当する への入力の部分文字列を探し、積極的にパスを書き直すことだけです。term-handle-ansi-terminal-messagesリモート パスが表示されないため、 の内部をいじる必要がなくなりました。

これは関数の変更とは異なりますか? そうだと思いますが、これは解釈の余地があります。特に、上記のコードが依存する唯一の知識は、サブメッセージが検索しようとしている形式であると思います。これは、実際には端末プロトコルterm-long-function-name-you-already-knowの属性であり、の内部ではありません。マッチの 7 番目の文字に基づいて動作を変更する新しいコードなど、潜在的な問題がいくつかあります。(これは上記の唯一のものです。)term-now-i'm-just-being-silly.string-match

言うまでもなく、私はこのコードをまったくテストしていません。

于 2012-07-11T06:09:56.487 に答える