6

ターミナル エミュレータで emacsclient を実行するときに、いくつかの関数を呼び出したいと考えています。私が持っているコードは、Emacs がテキストのみの端末で起動されたときに機能します。Emacs をグラフィカル モードで起動emacsclient -tしてターミナルで実行すると、関数が実行されないため、ターミナル エミュレータでマウスを使用できません。

問題のコードは次のとおりです。

(defun my-terminal-config (&optional frame)
  "Establish settings for the current terminal."
  (message (format "%s" window-system)) ;; "ns" (Mac OS X) when Emacs is started graphically
  (message (format "%s" (display-graphic-p))) ;; nil when Emacs is started graphically
  (unless (display-graphic-p)
    ;; enable mouse reporting for terminal emulators
    (xterm-mouse-mode 1)
    (global-set-key [mouse-4] '(lambda ()
                                 (interactive)
                                 (scroll-down 1)))
    (global-set-key [mouse-5] '(lambda ()
                                 (interactive)
                                 (scroll-up 1)))))
(add-hook 'after-make-frame-functions 'my-terminal-config)

これは奇妙な状況です。Emacsclient はサーバーに接続して新しいフレームを作成しますが、サーバーがグラフィカル環境で実行されているため、window-system は "ns" と報告されますが、ターミナル環境では nil となります。したがってemacsclient -t、ターミナルで実行すると、マウス レポートを有効にする機能が実行されません。emacsclient が実行されたら、 で新しいフレームを作成するとC-x 5 2、ウィンドウ システムがそのフレームで nil になるため、マウス レポートを有効にする関数が実行されます。

端末とウィンドウ システムの間でフレームを混合する場合、 の値window-systemは常に Emacs サーバーの値になるようです。

Emacs をグラフィカルに実行し、emacsclient をテキスト モードで実行して、そこでマウス機能を実行する方法はありますか? つまり、作成中のフレームが最終的にグラフィックまたはテキスト環境になることを検出できますか?

の値に関係なく、フレームが作成されたときに常にこれらの関数を実行する必要があるかもしれませんwindow-system

4

1 に答える 1

10

トリックはそれでwindow-systemありdisplay-graphic-p、現在はフレーム固有です。フック関数内のそのフレームにいる必要があります(すでにそうなっているはずですが、そうではないと思います)。これをフックの先頭に追加する必要がありましたafter-make-frame-functions(window-system と display-graphic-p を正しく動作させるため):

(select-frame frame)
于 2011-10-01T23:16:14.450 に答える