나는 최근 10년 만에 처음으로 Mac을 구입했고 구성하는 중입니다. 나는 Emacs 사용자이고 내가 원하는 것을 결정했습니다그냥 일반 Emacs다른 운영 체제의 기존 구성을 사용할 수 있도록 Aquamacs가 아닙니다. 나는 온라인에서 찾은 많은 방법을 따라해 보았습니다(예:이 하나,이 하나그리고이것은 내가 Emacs를 다운로드한 사이트에서 가져온 것입니다.), 여러 가지 방법으로 조각을 결합해 보았지만 내가 익숙하거나 기대하는 상태에 접근한 적이 없습니다.
- Emacs 데몬은 다음 중 하나에서 실행을 시작합니다.시작 시또는내가 필요하자마자; 어느 쪽이든 괜찮습니다. 모든 새로운 Emacs 프레임은 동일한 서버에 의해 지원됩니다.
- Finder에서 텍스트 파일을 열면 해당 파일은 가능하다면 기존 그래픽 프레임에서 Emacs로 열립니다.
- Emacs.app을 실행하면 시스템은 새 인스턴스를 시작하고 새 창을 여는 대신 백그라운드에서 실행 중인 emacs 데몬을 재사용합니다. (모자 팁)
- 터미널에서 Emacs를 실행하면 터미널은 내가 Emacs 작업을 마칠 때까지 기다리지 않고 작업을 수행합니다('-nw'를 사용하지 않는 한).
- 위에 설명된 작업 중 AFAIK는 Emacs가 내가 입력하기를 기다리는 상태("서버 편집 모드?")로 끝나서는 안 됩니다.
C-x #
비록 제가 이것에 대해 깊이 이해하지는 못했지만 말입니다. - (나는 이것을 보너스로 생각합니다.) Emacs가 가능하다면 기존 프레임을 재사용할 수 있도록 터미널에서 Emacs를 호출하는 방법이 있습니다.
Emacs가 이와 같이 작동하도록 어떻게 구성할 수 있습니까?
나는 Finder가 내가 원하는 방식으로 Emacs에서 항목을 열도록 하는 것에 특히 당황했습니다(#2). 내가 찾은 가이드는 일반적으로 많은 별칭, Applescript, bash 스크립트 등을 생성하기 때문에 확실하지 않습니다. Finder에게 텍스트 파일을 여는 데 사용하라고 지시하고 싶습니다.
감사해요!
ㅏ.@lawlist가 "기존 프레임이 있는데도 터미널에서 새 파일을 열면 기본적으로 새 프레임이 열리는 건가요?"라고 질문합니다. 대답은 설명된 대로 시작 시 서버를 시작하면여기, 프레임을 연 다음 를 입력하여 파일을 열면 /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>
파일이 기존 프레임에서 열리도록 할 수 있습니다. 현재 열려 있는 프레임이 없으면 "-nc"를 사용해야 합니다. 그렇지 않으면 파일을 열려고 할 때 아무 일도 일어나지 않습니다.
비.@lawlist가 "로그인 시 데몬을 실행하시겠습니까? 아니면 로그인 후 Emacs를 수동으로 로드해도 충분합니까?"라고 묻습니다. 수동으로 실행하는 것이 좋습니다.
답변1
(setq ns-pop-up-frames nil)
Emacs.app이 새 프레임 대신 기존 프레임에서 파일을 열도록 하려면 ~/.emacs
.
open -a emacs file
또는 를 사용하여 터미널에서 파일을 열 수 있습니다 emacsclient -n file
. Emacs.app이 열려 있지 않지만 프로세스가 있는 경우 Emacs --daemon
어떤 이유로 emacsclient -n file
작동하지 않지만 emacsclient -nc file
작동합니다.
emacsclient
와 같이 사용하는 Emacs 버전에 포함된 바이너리를 사용 /Applications/Emacs.app/Contents/MacOS/bin/emacsclient
하거나 /usr/local/bin/emacsclient
Homebrew와 함께 Emacs를 설치한 경우를 확인하십시오 .
예를 들어 로그인 시 Emacs 서버를 시작하려면 다음 plist를 다음과 같이 저장하십시오 ~/Library/LaunchAgents/my.emacsdaemon.plist
.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>my.emacsdaemon</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/Emacs.app/Contents/MacOS/Emacs</string>
<string>--daemon</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/> <!-- run the program again if it terminates -->
</dict>
</plist>
plist는 다음에 로그인할 때 자동으로 로드되지만 를 실행하면 즉시 로드할 수 있습니다 launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist
.
편집: 사람들이 Emacs.app 대신 AppleScript 응용 프로그램과 파일 형식을 연결하는 이유를 아직도 모르겠습니다. kuzzooroo의 답변에 있는 스크립트는 쉘 스크립트로 작성할 수도 있습니다.
macos=/Applications/Emacs.app/Contents/MacOS
if pgrep -qf 'Emacs.*--daemon'; then
[[ $($macos/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))') = t ]] && args=-nc || args=-n
else
$macos/Emacs --daemon
args=-nc
fi
$macos/bin/emacsclient $args "$@"
open -a /Applications/Emacs.app
당신이 사용할 수있는오리너구리스크립트를 애플리케이션으로 저장하려면:
방금 Emacs를 사용하기 시작했지만 설정이 완전히 다릅니다. 나는 iTerm.app의 복사본을 만들고 Info.plist에서 CFBundleIdentifier를 변경하여 응용 프로그램이 다른 기본 설정 파일을 사용하도록 하고 기본 명령을 /usr/local/bin/emacs
. 나는 로그인 시 사용자 정의 Emacs 응용 프로그램을 추가 (server-start)
하고 엽니다. ~/.emacs
나는 오리너구리를 사용하여 실행되는 응용 프로그램을 만들고 emacsclient -n "$@";open -b my.emacs
이를 텍스트 파일의 기본 응용 프로그램으로 만들었습니다.
답변2
의견의 제안과 결합된 Lauri의 솔루션은 내 문제를 크게 해결했습니다. 온라인에서 찾은 내용을 모아서 Applescript를 아래에 붙여넣었습니다. 스크립트는 남아 있는 주름을 부드럽게 하는 데 도움이 됩니다. 예를 들어 현재 Emacs 프레임이 없으면 동작이 조금 더 좋아집니다.
편집: 스크립트의 목적은 Finder의 .txt 파일과 연결되는 것입니다.
-- http://superuser.com/questions/457484/how-to-open-emacs-from-macs-finder
-- https://gist.github.com/ambethia/304964#comment-799519
on run {input}
set filepath to quoted form of POSIX path of input
tell application "Terminal"
try
-- we look for <= 2 because Emacs --daemon seems to always have an entry in visibile-frame-list even if there isn't
set frameVisible to do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))'"
if frameVisible is "t" then
do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n " & filepath
else
-- there is a not a visible frame, launch one
do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n " & filepath
end if
on error
-- daemon is not running, start the daemon and open a frame
do shell script "/Applications/Emacs.app/Contents/MacOS/Emacs --daemon"
do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n"
end try
end tell
-- bring the visible frame to the front
tell application "Emacs" to activate
return input
end run