Emacs는 "open -a"로 열면 새 프레임에서 파일을 엽니 다


20

명령 줄에서 Emacs를 호출하고 그래픽 Emacs가 실행 중이 아닌 경우 시작하거나 이미 실행중인 Emacs의 파일을 방문하고 싶습니다. 이 작업을 수행 emacsclient하는 "올바른"방법이라는 것을 알고이 작업을 시도했지만 OS X에서 많은 문제가 발생했습니다. 무작위로 충돌하거나 emacs --daemon시스템을 종료하거나 재부팅하는 동안 프로세스가 중단됩니다. 그리고 일반적인 약점. 내가 그것을 작동시키고 싶지만, 지금 open -a아래에 설명 할이 하나의 문제를 제외하고 실제로 실제로 훨씬 더 잘 작동합니다.

open -a이처럼 사용 :

$ open -a Emacs file.txt

Emacs가 실행되고 있지 않으면 시작하고 파일을 방문하십시오. 그러나 현재 버퍼가 아닌 경우이 작업을 수행 *scratch*하면 파일이 새 프레임 (예 : 새 시스템 창)에서 열립니다.

세션 예는 다음과 같습니다.

$ open -a Emacs file.txt

그러면 Emacs가 시작되고 file.txt가 열리므로이 버퍼가있는 단일 프레임이 있습니다. *scratch*버퍼로 전환하면 다음 을 수행하십시오.

$ open -a Emacs file1.txt

이 파일을 같은 프레임에서 엽니 다. 이제이 파일을 열어 놓은 단일 프레임이 있으며이 작업을 수행하면

$ open -a Emacs file2.txt 

새 프레임이 열리면서 한 번에 두 개의 프레임이 열립니다.

--args스위치를 사용하여 Emacs에 명령 줄 인수를 사용하여 시도했지만 open다음 호출에서는 작동하지 않는 것 같습니다.

$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'

이것은 메시지 버퍼에 "foo"만 인쇄합니다. 두 번째로 Emacs가 포 그라운드로 가져 오지만 메시지는 인쇄되지 않습니다.

open이미 실행중인 응용 프로그램과 어떻게 통신 하는지 잘 모르겠습니다. 내가 어떻게 알 수 있습니까? 아니면 Messages버퍼 보다 무슨 일이 일어나고 있는지에 대한 훨씬 자세한 로그를 얻는 방법이 있습니까? 위의 세션 중에 해당 버퍼에 흥미로운 내용이 인쇄되어 있지 않으므로 Emacs Lisp를 해킹하여 원하는 작업을 수행하는 방법을 모르겠습니다.

감사!


OSX에 대해 잘 모르므로 구체적인 내용을 제공 할 수 없습니다. 그래도 이것을 디버깅하려면 구문 오류를 던져서 t find-file로 설정 debug-on-error하고 스택 추적을 확인하여 Emacs가 어떻게 호출되는지에 대한 단서가 있는지 확인하십시오. 에 오류를 추가하면 find-file리스프 스크래치 버퍼에 함수 정의를 복사에 전화를 추가로 간단하게 될 수있다 error(그 안에 예 (error "cause stack trace"). FOR NEVER CHANGE 소스 파일을 find-file항상 스크래치 bufer에서이 작업을 수행 -!
조 Casadonte

@ 조 감사합니다! 아주 좋은 생각입니다. 앞으로도 계속 명심하겠습니다. 실제로 사용하려고 결국 emacsclient다시, 그리고 그것을 시작하는 (server-start)나의에서 init.el보다 더 잘 작동하는 것 같군 emacs --daemon내가하려고 처음 시도했던 것입니다 부팅,시 emacsclient.
michiakig

답변:


26

답은 여기 있습니다 : emacs 변수는 원래 프레임에서 "열기"

최신 버전의 emacs에서 기본 설정으로 변경되었습니다. 더하다:

(setq ns-pop-up-frames nil)

.emacs 파일로.

이것을 발견하게되어 매우 기쁩니다.


이것은 매우 도움이되었습니다! 별명과 함께 open -a /Applications/Emacs.app $1일이 잘 작동 하는 것 같습니다! 예를 들어 git에 emacs를 사용할 수 있도록 init에서 서버를 시작합니다.
Dror
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.