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

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

감사!



답변

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))


답변

언급 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.


답변

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

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

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

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


답변

Gui 모드이면 다음이 참입니다.

(윈도우 시스템 인 경우)


답변

터미널과 그래픽 모드, 그리고 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 또는 이전 시스템과 같은 다른 시스템을 포함하도록 확장 할 수 있습니다. 그러나 나는 그렇게 할 시간이 없다 😉


답변