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


81

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

ありがとう!

回答:


101

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

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

ドキュメントから。

編集: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)==私のMacの「ns」
nicolas 2015

43

答えは言及window-systemdisplay-graphic-pていて間違っていませんが、全体像を示しているわけではありません。

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

たとえば、ウィンドウシステムのEmacsを起動emacsclient -tして、ターミナルで接続することができます。結果のターミナルフレームには、の値が表示さnilwindow-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-horizo​​ntally)を実行すると、新しいフレームが作成され、これが呼び出されますか?または、これは、(emacsclientを使用するなどして)このインスタンスにアタッチされたまったく新しいウィンドウを作成する場合にのみ実行されますか?
sligocki 2011

6
Emacsの用語では、「フレーム」を使用して通常「ウィンドウ」と呼ぶものを意味し、「ウィンドウ」を使用して通常「ペイン」と呼ぶものを示します。紛らわしいですが、最終的にはそれに慣れます。お役に立てば幸いです。:-)
sanityinc 2011

4
そして、あなたの質問に明確に答えるにsplit-window-horizontallyは、現在のウィンドウ(「フレーム」)で現在アクティブなペイン(「ウィンドウ」)を2つのペイン(「ウィンドウ」)に分割します。
sanityinc 2011

2
次の理由により、これは機能しません。フレームの作成後にafter-make-frame-functionsが実行されます。フレームがすでに作成された後に.emacsが読み取られるため、これは最初のemacsフレーム(起動時)には適用されません。 stackoverflow.com/questions/875667/...
Rubycut

1
@Rubycutは同意しました。そのようなフレーム関連のフック関数をに追加する必要がある場合が多いことを述べておかなければなりません'after-init-hook
sanityinc 2011年

8

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

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

基本的に次のことを行います。

(if window-system
    (progn
      (something)
      (something-else)))

display-graphic-pを支持して非推奨
ivo Welch 2015


2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.