2011-09-30 3 views
6

터미널 에뮬레이터에서 emacsclient를 실행할 때 몇 가지 함수를 호출하고 싶습니다. Emacs가 텍스트 전용 터미널에서 시작될 때 작동하는 코드. 그래픽 모드에서 Emacs를 시작하고 터미널에서 emacsclient -t을 실행하면 함수가 실행되지 않으므로 터미널 에뮬레이터에서 마우스를 사용할 수 없습니다.emacsclient가 터미널에서 시작된 경우에도 윈도우 시스템이 0이 아닌 경우

(defun my-terminal-config (&optional frame) 
    "Establish settings for the current terminal." 
    (message (format "%s" window-system)) ;; "ns" (Mac OS X) when Emacs is started graphically 
    (message (format "%s" (display-graphic-p))) ;; nil when Emacs is started graphically 
    (unless (display-graphic-p) 
    ;; enable mouse reporting for terminal emulators 
    (xterm-mouse-mode 1) 
    (global-set-key [mouse-4] '(lambda() 
           (interactive) 
           (scroll-down 1))) 
    (global-set-key [mouse-5] '(lambda() 
           (interactive) 
           (scroll-up 1))))) 
(add-hook 'after-make-frame-functions 'my-terminal-config) 

이 이상한 상황 : 여기

문제의 코드입니다. Emacsclient는 서버에 연결하여 새 프레임을 만들지 만 서버가 그래픽 환경에서 실행 중이기 때문에 터미널 시스템에서는 "ns"로 표시되지만 윈도우 시스템은 nil이됩니다. 따라서 터미널에서 emacsclient -t을 실행하면 마우스보고 기능 활성화가 실행되지 않습니다. emacsclient가 실행 중일 때 C-x 5 2으로 새 프레임을 만들면 윈도우 시스템이 해당 프레임에서 nil이되므로 마우스보고 기능 활성화가 실행됩니다.

터미널과 윈도우 시스템간에 프레임을 섞으면, window-system의 값은 항상 Emacs 서버의 값으로 보입니다.

그래픽 모드에서 emacs를 사용하고 텍스트 모드에서 emacsclient를 실행하고 마우스 기능을 실행할 수있는 방법이 있습니까? 즉, 생성되는 프레임이 그래픽 또는 텍스트 환경에서 끝날 것임을 감지 할 수 있습니까?

window-system 값에 관계없이 프레임을 만들 때 항상 이러한 기능을 실행해야합니까?

+0

재미있는 문제 : 나는 (윈도우 시스템 및 디스플레이 그래픽-P 동작합니다 제대로을 만들기 위해) 내 after-make-frame-functions 후크의 시작 부분에이를 추가했다. Linux (RHEL)에서 Emacs 23.2.1을 사용하고 그래픽 서버에 대해 emacsclient -t를 실행하고 창 시스템을 검사 할 때 그래픽이 아닌 Emacs 인 반면 X는 X입니다. 올바르게 작동하는 것. 설치 세부 사항은 무엇입니까? –

+0

Mac OS X 10.6.8에서 Emacs 23.3을 사용하고 있습니다. 나는 그것과 같은 결과를 가지고있다. emacsclient가 실행되면 window-system은 nil이지만 * make-frame-functions 후크 안에는 "ns"가됩니다. 후크가 완료된 후 얼마 지나지 않아 프레임에 대상 창 시스템이없는 것으로 보입니다. – hekevintran

+0

@hekevintran Mac 사용자가 터미널 에뮬레이션에서 Emacs를 사용하는 것에 대해 많은 질문이있는 이유를 간단히 살펴볼 수 있습니까? 사용 시나리오는 정확히 무엇입니까? 나는이 질문들을 많이 볼 수 있기 때문에 정말로 호기심이 많습니다. –

답변

10

트릭은 window-systemdisplay-graphic-p이 이제 프레임마다 다릅니다. 당신은 당신의 훅 기능 안에서 그 프레임에 있어야한다. (이미 그랬던 것처럼 보이지만, 나는 생각하지 않는다.)

(select-frame frame) 
+1

머리에 못을 박 았어요! 더 좋은 방법은 display-graphic-p 프레임을 직접 전달할 수 있다는 것입니다 (display-graphic-p 프레임). 솔루션을 가져 주셔서 감사합니다. 그것은 나를 미치게했다. – hekevintran

관련 문제