programing

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

nasanasas 2020. 10. 14. 07:54
반응형

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입니다.

Documentation: Name of window system through which the selected frame is displayed. The value is a symbol--for instance, `x' for X windows. The value is nil if the selected frame is on a text-only-terminal.

Basically do a:

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

If its in Gui mode, then the following would be true.

(if window-system )


I have defined an extra function to wrap the window-name functionality because I'm using Emacs everywhere, i.e. from the terminal and in graphics mode and in Linux and 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)))

It can be extended to cover other systems like Windows or older systems where a serial terminal is used. But I Have no time to do so ;-)

참고URL : https://stackoverflow.com/questions/5795451/how-to-detect-that-emacs-is-in-terminal-mode

반응형