web-dev-qa-db-ja.com

emacsがターミナルモードであることを検出する方法は?

私の.emacsファイル、グラフィカルモードでのみ意味のあるコマンドがあります((set-frame-size (selected-frame) 166 100))。これらをグラフィカルモードでのみ実行し、ターミナルモードでは実行しません(つまり、emacs -nw)。

ありがとう!

77
sligocki

window-system変数は、Emacsが実行されているウィンドウシステムをLISPプログラムに伝えます。可能な値は次のとおりです。

バツ
EmacsはXを使用してフレームを表示しています。
w32
EmacsはネイティブMS-Windows GUIを使用してフレームを表示しています。
ns
EmacsはNeXTSTEPインターフェイス(GNUstepおよびMac OS Xで使用)を使用してフレームを表示しています。
パソコン
Emacsは、MS-DOSの直接画面書き込みを使用してフレームを表示しています。
なし
Emacsは、文字ベースの端末でフレームを表示しています。

ドキュメント から。

Edit:window-systemは廃止され、display-graphic-p(ソース:emacs 23.3.1のC-h f 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))
95
knarf

window-systemおよびdisplay-graphic-pに言及する回答は間違っていませんが、完全な状況を伝えているわけではありません。

実際には、単一のEmacsインスタンスは複数のフレームを持つことができ、その一部は端末上にあり、他はウィンドウシステム上にある可能性があります。つまり、単一のEmacsインスタンス内でもwindow-systemの異なる値を取得できます。

たとえば、ウィンドウシステムのEmacsを起動してから、ターミナルでemacsclient -tを介して接続できます。結果の端末フレームには、window-systemnilの値が表示されます。同様に、デーモンモードでemacsを起動し、後でグラフィカルフレームを作成するように指示できます。

この結果、window-systemに依存するコードを.emacsに入れないでください。代わりに、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に追加する必要がある場合が多いことに注意してください。

42
sanityinc

window-systemは、「Cソースコード」で定義された変数です。その値はx

ドキュメント:選択したフレームが表示されるウィンドウシステムの名前。値はシンボルです。たとえば、Xウィンドウの場合は「x」です。選択したフレームがテキストのみの端末にある場合、値はnilです。

基本的には:

(if window-system
    (progn
      (something)
      (something-else)))
8
Bozhidar Batsov

Guiモードの場合、次のことが当てはまります。

(window-systemの場合)

6

私は、Emacsをどこでも、つまり端末から、グラフィックモードで、LinuxおよびMacOSで使用しているため、window-name機能をラップする追加の関数を定義しました。

(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やシリアル端末が使用される古いシステムのような他のシステムをカバーするように拡張できます。しかし、私はそうする時間がありません;-)

2
paaguti