Mac의 Emacsdaemon 및 Emacsclient


25

운영체제 : OS X 10.9.5, Mavericks

Rainers-MacBook-Pro-3.local에서 2014-04-03의 GNU Emacs 24.3.1 (x86_64-apple-darwin13.1.0, Carbon 버전 1.6.0 AppKit 1265.19)

나는 통해 이맥스를 설치 한 사제 에서 railwaycat 그것은 잘 작동 - 아니 불만. 나는 termoinal에서 emacs를 사용하지 않고 보통 응용 프로그램을 통해 시작합니다.

내가 말했듯이-나는 지금까지 행복하다.

나는 내가 제대로 얻지 못했던 한 가지 일을했다 (이전에는 리눅스에서 잘 작동했다).

  1. 로그인시 emacs 데몬 시작
  2. emacsclient를 사용하여 열기
  3. 로그 오프시 emacsdaemon을 닫고 al 파일을 저장하십시오.

이것을 설정하는 데 도움이되는 작업 레시피가 있습니까?

추가 된 정보

로그인시 emacs 데몬을 시작하려면

bash 명령을 실행하는 Automator Application을 만들었습니다.

/usr/local/bin/emacs --daemon

제대로 작동하는 로그인 항목에 추가했습니다.

터미널에서 데몬 활용

다음을 사용하여 emacs 데몬을 활용할 수 있습니다

emacsclient .bashrc

emacs 터미널 세션에서 .bashrc가 열립니다.

GUI에서 활용

이제 질문이 남아 있습니다. GUI에서 어떻게 활용할 수 있습니까?

emacsclient를 이해하면 열 파일을 지정하지 않으면 emacsclient를 열 수 없습니다.

emacsclient GUI를 열고 이전에 연 모든 파일을 열고 싶습니다. 이것이 가능한가?

사용할 수 있다는 것을 알았습니다

emacsclient -c

터미널에서 원하는 것을 수행하지만 GUI에 대해서도 동일한 작업을 수행 할 수 있습니까?


여기서 "GUI에서"가 무엇을 의미하는지 이해하지 못합니다. "Finder에서 파일을 두 번 클릭"하거나 완전히 다른 것을 의미 할 수 있습니다.
tarsius

앱 런처 사용 (예 : 스포트라이트를 통해)
Rainer

App Launcher는 파일 선택을 허용합니까 (파일 유형의 기본 응용 프로그램을 사용하여 열림). 아니면 "앱"만? emacsclientOS X에 관한 한 앱이 아니며 Emacs(그런 식으로 설치된 경우에만)입니다. 열린 응용 프로그램 / 창을 선택하기 위해 시스템 키 바인딩을 사용하지 않는 이유는 무엇입니까? (Emacs가 데몬 모드에서 시작되었고 아직 프레임 ( "창")이 없으면 작동하지 않습니다).
tarsius

emacsclient를 시작하는 Emacsclient라는 앱을 정의했습니다. 따라서 Emacsclient라는 앱이 있습니다. 분명히 실행중인 emacs 인스턴스로 전환 할 수는 있지만 위에서 설명한 워크 플로우를 살펴 보는 것만으로는 충분하지 않습니다.
Rainer

1
이 질문에 대한 답은 거의 도움이됩니다. :)
Roy Truelove

답변:


6

나는 Emacs.app가 항상 실행되는 것을 신경 쓰지 않지만 실수로 Emacs 서버를 죽이지 않고 창을 닫을 수 없다는 사실은 성가신 일이었습니다. 그리고 마지막 프레임을 실제로 죽이려고해도 "단일 보이는 프레임이나 아이콘 화 된 프레임을 삭제하려고합니다"라는 메시지는 여전히 표시되지 않습니다. 그래서 우리는 속임수를 쓴다.

이 솔루션 은 닫기 버튼을 클릭하여 마지막 창을 닫으려고 할 때 Emacs ( Command+ 와 같은 h)를 숨 깁니다 .

Emacs init에 다음을 추가하십시오 :

(defadvice handle-delete-frame (around my-handle-delete-frame-advice activate)
  "Hide Emacs instead of closing the last frame"
  (let ((frame   (posn-window (event-start event)))
        (numfrs  (length (frame-list))))
    (if (> numfrs 1)
      ad-do-it
      (do-applescript "tell application \"System Events\" to tell process \"Emacs\" to set visible to false"))))

그리고 "사용자 및 그룹> 로그인 항목"에 Emacs를 추가하고 "숨기기"체크 상자를 클릭하십시오.

Emacs init도 (start-server)어딘가에 전화해야합니다 .

emacsclient래퍼를 사용하여 Emacs를 맨 앞으로 가져옵니다.

#!/bin/sh
osascript -e 'tell application "Emacs" to activate'
exec emacsclient "$@"

이슈 :

  • Emacs 활성화 / 숨김 해제는 모든 창을 앞으로 가져옵니다 . 이것은 약간 성가시다.
  • Dock에서 Emacs 아이콘을 클릭하면 때때로 새 창이 무작위로 생성되는 것 같습니다. 그러나 항상 그런 것은 아닙니다.
  • TODO : 마지막 프레임의 make Command+ w도 Emacs를 숨길까요?
  • 새로운 기능 편집 : 모든 창이 최소화 된 상태에서 도크 아이콘을 클릭해도 자동으로 그 중 하나가 최대화되지 않습니다.

이것은 Emacs를 최소화하도록 제안하는 @noaham의 대답 과 마지막 창을 닫으려고하는 방법에 대해 설명합니다.

편집하다:

소스를 검색하면서 call에 대한 "키 바인딩"을mac-apple-event-map 찾았습니다 mac-ae-reopen-application. mac-ae-reopen-application보이는 프레임과 아이콘 화 된 프레임을 확인하는 것처럼 보이지만 숨겨진 프레임을 놓쳐 야합니다. 이것은 아마도 버그 일 것입니다.

쉬운 수정은 init에서 키 바인딩을 비활성화하는 것입니다.

(define-key mac-apple-event-map [core-event reopen-application] nil)

이것은 새로운 사소한 버그를 소개합니다 : 모든 창이 최소화 된 상태에서 도크 아이콘을 클릭해도 그 중 하나가 자동으로 최대화되지는 않습니다. 올바른 수정은 다시 작성하는 mac-ae-reopen-application것이지만 emacs와 elisp는 거의 알지 못합니다.


누구든지 무작위 새 창 (글 머리 기호 2)을 멈추는 방법을 알고 있다면 알려주십시오. 아마도이 설정에 대해 여전히 나를 괴롭히는 것은 남은 유일한 것일 것입니다.
parent5446

@ parent5446 완료! 첫 번째 수정만큼 해 키지 만 작동합니다.
bburky '11

감사! 어쨌든 도크에서 Emacs를 시작하지 않았기 때문에 그 해킹 부분은 나를 귀찮게하지 않습니다.
parent5446

4

Yamamac Mitsuharu emacs 포트는 불행히도 멀티 tty를 지원하지 않습니다 (이 문제 참조 ). 즉, 터미널에서 emacs 데몬을 시작할 수없고 emacsclient로 gui 창을 시작할 수 없습니다.

내가하는 일은 다음과 같습니다. init.el (server-start)에서 로그인하고 Emacs.app을 시작합니다. 여기서 성가심은 이것이 수동으로 최소화 해야하는 창을 가져 오는 것입니다.

그런 emacsc다음 다음과 같은 bash 스크립트가 있습니다.

#!/bin/bash                                                                          
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
emacsclient -n -c

그런 다음 applescript로 다음을 포함하는 앱을 만듭니다.

tell application "Emacs"
    activate
end tell
do shell script "~/bin/emacsc"

-n플래그를 emacsclient 에 전달하는 것이 중요합니다. 그렇지 않으면 emacsc 앱을 사용하여 한 번에 하나의 클라이언트 만 열 수 있습니다. 경로 변수를 설정하면 OS X에서 올바른 버전의 emacsclient를 찾을 수 있습니다.

Emacs에 "활성화"하도록 지시하면 클라이언트 창이 포 그라운드에서 시작됩니다.

내가 말했듯이, 로그인 할 때 수동으로 emacs 창을 최소화 한 다음 도크에 앉아 있어야한다는 것이 귀찮습니다. 이 문제를 피하는 한 가지 방법은 로그인 후 Emacs를 자동으로 "숨기기"하는 것이지만 활성화하면 숨길 수 있습니다.


2

railwaycat Emacs가 일반 가정용 양조법과 어떻게 다른지 잘 모르겠지만 후자 는 로그인 ln -sfv /usr/local/opt/emacs/*.plist ~/Library/LaunchAgents할 때 실행 emacs --daemon됩니다.

plist는 공식 에서 HERE 문서로 포함됩니다 . 이 라인을 사용하여 emacs 앱의 경로를 변경하기 만하면됩니다 <string>#{opt_bin}/emacs</string>.

BTW, --cocoa옵션으로 설치하면 Homebrew Emacs를 사용하여 Emacs를 OS X 앱으로 얻을 수도 있습니다. ( brew linkapps나중에 실행 /Applications하거나에 연결하거나 직접 링크를 만들어야합니다.


1

mac 데몬은 90 %의 시간을 launchd를 사용하여 관리 합니다. 사용자 로그인 / 로그 아웃을 포함하여 많은 트리거에서 실행할 수 있습니다. Lingon 이라는 예쁜 Mac 응용 프로그램이 있으며 실행 되는 다양한 것들을보고 편집 할 수 있습니다. emacs 위키에는 config file 예제를 포함하여 이에 대한 언급있습니다 . 그러나 로그 아웃시 데몬을 종료하는 방법과 같은 문제를 해결하지 못하는 것 같습니다.


0

다음과 같이 AppleScript 응용 프로그램을 생성하십시오.

tell application "Terminal"
do shell script "/usr/local/bin/emacsclient -c"
endtell

경로를 조정해야하거나 경로를 완전히 생략 할 수 있습니다. 데몬이 아직 실행되지 않은 경우 start 데몬으로 더 멋진 것을 사용할 수도 있습니다.


@Rainer 이것으로 성공? emacsclient를 사용하여 데몬에 연결하기 전에 필요한 경우 데몬을 시작하는 더 빠른 구현을 검색 할 수도 있습니다. "applescript emacsclient"는 Google 검색에서 좋은 결과를 제공합니다.
tarsius

당신은 여전히 ​​더 나은 답변을 기다리고 있습니까 아니면 이것을 받아 들일 수 있습니까?
tarsius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.