端末エミュレータでemacsclientを実行するといくつかの関数を呼び出す必要があります。 Emacsがテキストのみの端末で起動されたときに動作するコードです。私がEmacsをグラフィカルモードで起動し、端末にemacsclient -t
を実行すると、関数は実行されないので、端末エミュレータでマウスを使用することはできません。ここで端末でemacsclientを起動しても、ウィンドウシステムがnilではない
は、問題のコードです:
(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はサーバーに接続して新しいフレームを作成しますが、サーバーはグラフィカル環境で実行されているため、ウィンドウシステムは「ns」と報告されますが、端末環境ではそれはゼロになります。したがって、端末でemacsclient -t
を実行すると、マウスレポート有効化機能は実行されません。 emacsclientが起動すると、C-x 5 2
の新しいフレームを作成すると、ウィンドウシステムがそのフレームでnilになるため、マウスレポート機能が実行されます。
端末とウィンドウシステムの間でフレームを混合するとき、window-system
の値は常にEmacsサーバの値になると思われます。
Emacsをグラフィカルに、そしてemacsclientをテキストモードで実行し、マウス機能をそこで実行できる方法はありますか?言い換えれば、作成中のフレームがグラフィカルまたはテキスト環境で終了することを検出することは可能ですか?
window-system
の値に関係なく、フレームが作成されたときにこれらの機能を実行するだけでよいのでしょうか?
興味深い問題:私は私の
after-make-frame-functions
フック(ウィンドウ・システムおよびディスプレイ・グラフィック-pが正常に動作させるため)の先頭にこれを追加する必要がありました。私はLinux(RHEL)でEmacs 23.2.1を使用していますが、emacsclient -tをグラフィカルサーバーに対して実行してウィンドウシステムを検査するときはnilですが、グラフィカルなX EmacsではXです。正しく働くこと。あなたのセットアップの詳細は何ですか? –私はMac OS X 10.6.8でEmacs 23.3を使用しています。私はそれと同じ結果を持っています。 emacsclientが実行されると、window-systemはnilですが、* make-frame-functionsのフックの後ろには "ns"です。フックが完了してからしばらくするまで、フレームには宛先ウィンドウシステムがないようです。 – hekevintran
@hekevintran MacのユーザーからEmacsをターミナルエミュレーションで使用することに関する質問が多すぎる理由を簡単に説明できますか?使用シナリオはどのようなものですか?私はこれらの質問がたくさんあるので、本当に興味があります。 –