emacs가 터미널 모드인지 어떻게 감지합니까?


81

.emacs파일에는 그래픽 모드에서만 의미가있는 명령이 있습니다 (예 :) (set-frame-size (selected-frame) 166 100). 난 단지 그래픽 모드가 아닌 터미널 모드 (즉, 이러한 실행하려면 어떻게 emacs -nw).

감사!

답변:


101

window-system변수는 Lisp 프로그램에 Emacs가 실행중인 윈도우 시스템을 알려줍니다. 가능한 값은 다음과 같습니다.

엑스
Emacs는 X를 사용하여 프레임을 표시합니다.
w32
Emacs는 기본 MS-Windows GUI를 사용하여 프레임을 표시합니다.
ns
Emacs는 Nextstep 인터페이스 (GNUstep 및 Mac OS X에서 사용)를 사용하여 프레임을 표시합니다.
pc
Emacs는 MS-DOS 직접 화면 쓰기를 사용하여 프레임을 표시합니다.
Emacs는 문자 기반 터미널에 프레임을 표시하고 있습니다.

에서 다큐먼트 .

편집 : 윈도우 시스템이 더 이상 사용되지 않는 것 같습니다 display-graphic-p(출처 : emacs 23.3.1의 Ch f 윈도우 시스템 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))

(윈도우 시스템) == 내 맥의 "NS"
니콜라스

43

언급 window-system하고 display-graphic-p잘못된 대답 은 아니지만 전체 그림을 말하지는 않습니다.

실제로 단일 Emacs 인스턴스는 여러 프레임을 가질 수 있으며, 그중 일부는 터미널에 있고 다른 일부는 윈도우 시스템에있을 수 있습니다. 즉 window-system, 단일 Emacs 인스턴스 내에서도 다른 값을 얻을 수 있습니다 .

예를 들어, 윈도우 시스템 Emacs를 시작한 다음 emacsclient -t터미널을 통해 연결할 수 있습니다 . 결과 터미널 프레임에 nilfor 값이 표시 됩니다 window-system. 마찬가지로 데몬 모드에서 emacs를 시작한 다음 나중에 그래픽 프레임을 만들도록 지시 할 수 있습니다.

따라서 .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) 실행하면 새 프레임이 생성되어 이것을 호출합니까? 아니면이 인스턴스에 연결된 완전히 새로운 창을 만들 때만 실행됩니까 (예 : emacsclient 사용)?
sligocki 2011

6
Emacs 용어는 "프레임"을 사용하여 일반적으로 "창"이라고 부르는 것을 의미하고 "창"을 사용하여 일반적으로 "창"이라고 부르는 것을 나타냅니다. 혼란 스럽지만 결국 익숙해집니다. 도움이되기를 바랍니다. :-)
sanityinc 2011

4
그리고 질문에 명시 적으로 대답 split-window-horizontally하려면 현재 창 ( "프레임")에서 현재 활성화 된 창 ( "창")을 두 개의 창 ( "창")으로 분할합니다.
sanityinc 2011

2
이것은 작동하지 않습니다 : 프레임이 생성 된 후 프레임 후 기능이 실행됩니다. 이것은 프레임이 이미 생성 된 후에 .emacs가 읽혀지기 때문에 초기 emacs 프레임 (시작시)에는 적용되지 않습니다. stackoverflow.com/questions/875667/…
Rubycut 2011

1
@Rubycut이 동의했습니다. 이와 같은 프레임 관련 후크 함수를 'after-init-hook.
sanityinc 2011

8

윈도우 시스템은`C 소스 코드 '에 정의 된 변수입니다. 값은 x입니다.

문서 : 선택한 프레임이 표시되는 창 시스템의 이름입니다. 값은 기호입니다 (예 : X 윈도우의 경우 'x'). 선택한 프레임이 텍스트 전용 터미널에있는 경우 값은 nil입니다.

기본적으로 다음을 수행하십시오.

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

디스플레이 그래픽-P 찬성되지 않는
웰치 이보


2

터미널과 그래픽 모드, 그리고 Linux와 MacOS에서 Emacs를 모든 곳에서 사용하고 있기 때문에 창 이름 기능을 래핑하는 추가 함수를 정의했습니다.

(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.