OSX에서 Emacs 서버의 기본 설정

OSX에서 Emacs 서버의 기본 설정

나는 최근 10년 만에 처음으로 Mac을 구입했고 구성하는 중입니다. 나는 Emacs 사용자이고 내가 원하는 것을 결정했습니다그냥 일반 Emacs다른 운영 체제의 기존 구성을 사용할 수 있도록 Aquamacs가 아닙니다. 나는 온라인에서 찾은 많은 방법을 따라해 보았습니다(예:이 하나,이 하나그리고이것은 내가 Emacs를 다운로드한 사이트에서 가져온 것입니다.), 여러 가지 방법으로 조각을 결합해 보았지만 내가 익숙하거나 기대하는 상태에 접근한 적이 없습니다.

  1. Emacs 데몬은 다음 중 하나에서 실행을 시작합니다.시작 시또는내가 필요하자마자; 어느 쪽이든 괜찮습니다. 모든 새로운 Emacs 프레임은 동일한 서버에 의해 지원됩니다.
  2. Finder에서 텍스트 파일을 열면 해당 파일은 가능하다면 기존 그래픽 프레임에서 Emacs로 열립니다.
  3. Emacs.app을 실행하면 시스템은 새 인스턴스를 시작하고 새 창을 여는 대신 백그라운드에서 실행 중인 emacs 데몬을 재사용합니다. (모자 팁)
  4. 터미널에서 Emacs를 실행하면 터미널은 내가 Emacs 작업을 마칠 때까지 기다리지 않고 작업을 수행합니다('-nw'를 사용하지 않는 한).
  5. 위에 설명된 작업 중 AFAIK는 Emacs가 내가 입력하기를 기다리는 상태("서버 편집 모드?")로 끝나서는 안 됩니다. C-x #비록 제가 이것에 대해 깊이 이해하지는 못했지만 말입니다.
  6. (나는 이것을 보너스로 생각합니다.) 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/emacsclientHomebrew와 함께 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

관련 정보