私の.emacs
ファイルには、グラフィカルモードでのみ意味のあるコマンドがあります(のように(set-frame-size (selected-frame) 166 100)
)。これらをグラフィカルモードでのみ実行し、ターミナルモードでは実行しないようにするにはどうすればよいですか(つまりemacs -nw
)。
ありがとう!
回答:
このwindow-system
変数は、Emacsが実行されているウィンドウシステムをLispプログラムに通知します。可能な値は次のとおりです。
ドキュメントから。
編集:window-systemは非推奨になっているようですdisplay-graphic-p
(出典:emacs23.3.1のChf window-system RET)。
(display-graphic-p &optional DISPLAY)
Return non-nil if DISPLAY is a graphic display.
Graphical displays are those which are capable of displaying several
frames and several different fonts at once. This is true for displays
that use a window system such as X, and false for text-only terminals.
DISPLAY can be a display name, a frame, or nil (meaning the selected
frame's display).
だからあなたがしたいことは:
(if (display-graphic-p)
(progn
;; if graphic
(your)
(code))
;; else (optional)
(your)
(code))
また、else句がない場合は、次のことができます。
;; more readable :)
(when (display-graphic-p)
(your)
(code))
答えは言及window-system
しdisplay-graphic-p
ていて間違っていませんが、全体像を示しているわけではありません。
実際には、単一のEmacsインスタンスに複数のフレームを含めることができ、その一部は端末上にあり、その他はウィンドウシステム上にある場合があります。つまりwindow-system
、単一のEmacsインスタンス内でも異なる値を取得できます。
たとえば、ウィンドウシステムのEmacsを起動emacsclient -t
して、ターミナルで接続することができます。結果のターミナルフレームには、の値が表示さnil
れwindow-system
ます。同様に、デーモンモードでemacsを起動し、後でグラフィカルフレームを作成するように指示することができます。
この結果として、に依存するコードを.emacsに配置することは避けてくださいwindow-system
。代わりに、set-frame-size
フレームが作成された後に実行されるフック関数に、例のようなコードを配置します。
(add-hook 'after-make-frame-functions
(lambda ()
(if window-system
(set-frame-size (selected-frame) 166 100)))))
'after-make-frame-functions
フックは最初のフレームでは実行されないため、上記のようなフレーム関連のフック関数もに追加する必要がある場合が多いことに注意してください'after-init-hook
。
split-window-horizontally
は、現在のウィンドウ(「フレーム」)で現在アクティブなペイン(「ウィンドウ」)を2つのペイン(「ウィンドウ」)に分割します。
'after-init-hook
。
window-systemは、「Cソースコード」で定義されている変数です。その値はxです
ドキュメント:選択したフレームが表示されるウィンドウシステムの名前。値はシンボルです。たとえば、Xウィンドウの場合は「x」です。選択したフレームがテキストのみの端末にある場合、値はnilです。
基本的に次のことを行います。
(if window-system
(progn
(something)
(something-else)))
GUIモードの場合、次のことが当てはまります。
(ウィンドウシステムの場合)
私はどこでもEmacsを使用しているので、ウィンドウ名機能をラップするための追加の関数を定義しました。つまり、ターミナルから、グラフィックモードで、LinuxとMacOSで:
(defun window-system-name()
(cond ((eq system-type 'gnu/linux) (if (display-graphic-p) "x" "nox"))
((eq system-type 'darwin) (if (display-graphic-p) "mac" "nox"))
(t (error "Unsupported window-system") nil)))
Windowsやシリアル端末が使用されている古いシステムなどの他のシステムをカバーするように拡張できます。しかし、私にはそうする時間がありません;-)