OSX의 명령 줄에서 GUI Emacs를 시작하는 방법은 무엇입니까?


91

OSX의 명령 줄에서 GUI Emacs를 어떻게 시작합니까?

http://emacsformacosx.com/ 에서 Emacs를 다운로드하여 설치했습니다 .

다음 기준을 모두 충족하는 답변을 받겠습니다.

  1. emacs 창이 터미널 창 앞에 열립니다 .
  2. "emacs"를 입력하면 GUI Emacs 창이 열립니다. 해당 창에서 파일을 찾는 것은 기본적으로 내가 Emacs를 시작한 디렉토리를 찾는 것입니다.
  3. foo.txt가있을 때 "emacs foo.txt"를 입력하면 foo.txt가로드 된 GUI Emacs 창이 시작됩니다.
  4. foo.txt가 없을 때 "emacs foo.txt"를 입력하면 "foo.txt"라는 빈 텍스트 버퍼가있는 GUI Emacs 창이 시작됩니다. 해당 버퍼에서 ^ X ^ S를 수행하면 Emacs를 시작한 디렉토리에 foo.txt가 저장됩니다.

터미널 프롬프트에서 'emacs'를 입력하여 충족되지 않는 기준은 무엇입니까? 요구 사항은 Linux의 기본 동작을 설명합니다. 나는 한동안 Mac을 사용하지 않았지만 트릭은 실행할 올바른 프로그램을 찾는 것이라고 생각합니다-emacs.app 아마도?
Tyler

8
Tyler, Linux 배경에서 온 저는 항상 당신과 함께 있습니다. 프롬프트에서 "emacs"를 입력하는 것만으로도 충분합니다. OSX에서 그렇게하면 터미널 창에서 텍스트 모드 Emacs가 시작됩니다 (따라서 기준 1에 실패 함). 내가 원하는 것은 아닙니다.
Johan Walles

1
Johan-그동안 해결책을 찾았습니까? 나는 같은 문제로 어려움을 겪고 있으며 현상금을 시작할 생각입니다. 특히 성가신 명령 줄에서 이맥스를 호출 (아닌 Emacs.app하는) 백그라운드에서 창을 여는 것입니다 ...
alexurba

1
@DougHarris 내 요구 사항은 모든 Linux 배포판의 현실과 일치합니다. 귀하에게 적합한 워크 플로우를 찾으 셨다니 기쁩니다. 건배!
Johan Walles 2013-04-12

2
OSX에서 작동하는지 여부는 모르겠지만 시도해 볼 수 있습니다. emacsclient -c -a "" "$@"command
jfs

답변:


113

다음 스크립트 "emacs"를 호출하여 PATH어딘가에 넣으십시오 .

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@"

여기에는 # 2, # 3 및 # 4가 포함됩니다.

# 1의 경우 .emacs 파일에 다음을 넣으십시오.

(x-focus-frame nil)

emacsformacosx.com의 사이트는 지금이 방법으로 페이지 상단 조각이 어디에서 왔는지이다. emacsclientEmacs를 실행 하고 연결 하는 것에 대한 더 많은 정보가 git mergetool있습니다.


1
감사합니다 David, 당신은 통치합니다!
요한 Walles

1
잘 작동합니다. 현상금 예정입니다.
Tamzin Blake 2013

2
Mavericks에서 내가 폴더에 ~/foo있고 열려면 bar.txt입력 gmacs bar.txt하지만 ~/bar.txt여는 대신 새 파일을 만듭니다 ~foo/bar.txt. 내가 뭘 잘못하고 있니?
Daniel Compton

2
.emacs 파일은 어디에 있습니까?
Bren

1
어디에나 (x-focus-frame nil)을 추가 할 수 없으며, (custom-set-variables) 표현식 내에 있어야합니다. 메뉴 표시 줄에서 "깜박이는 커서"를 설정 (싫으면 해제)하는 것과 같이 사용자 정의하면 해당 섹션이 .emacs에 생성됩니다. 또한 이것은 테스트를 거쳤습니까? Cocoa의 emacs가이 설정을 존중할지 모르겠습니다.
Chuck Adams

70

셸에서 'emacs'명령을 별명으로 지정하여 OSX emacs 애플리케이션을 가리 킵니다.

내 셸 (기본 bash 실행)에는 다음이 있습니다 (내 .bashrc에)

alias emacs='open -a /Applications/Emacs.app $1'

그런 다음 명령 줄에 emacs를 입력하면 emacs 응용 프로그램이 시작됩니다.

그러나 나는 당신이 emacs의 사본을 열고 그것을 계속 실행하는 것을 권장합니다. 이 경우 기존 emacs 사본에 파일을로드하려는 경우 .bashrc에 다음을 배치하여 emacsclient를 사용할 수 있습니다.

alias ec='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'

그런 다음 .emacs 파일에 다음을 추가하여 emacs 서버 (emacsclient 호출 수신)를 시작합니다.

;;========================================
;; start the emacsserver that listens to emacsclient
(server-start)

그런 다음 입력 할 수 있습니다.

ec .bashrc

.bashrc 사본을 기존 emacs 세션에로드하려면!


4
안녕 크리스! 첫 번째 답변은 기준 2와 4에 실패했습니다. 두 번째 답변은 기준 2에 실패했습니다. 번호가 매겨진 모든 기준을 충족하는 솔루션을 찾고 있습니다. 감사합니다 / Johan
Johan Walles

3
매번 새 인스턴스를 시작하기 위해 명령 줄에 의존하는 대신 emacs 자체를 사용하여 파일을로드하면 모든 문제가 해결 될 수있는 것 같습니다. 나는 일반적으로 하루가 시작될 때 (아직 실행되지 않는 경우) emacs를 시작하고 터미널 창을 건드리지 않고도 파일을로드하고, 디렉토리를 변경하고, 새 파일을 만드는 등 원하는 모든 것을 사용합니다.
Chris McMahan 2012

이 사이트에는이 질문을 다루는 몇 가지 질문이 있지만 이것이 파일을 여는 문제를 짧고 웅변적인 방식으로 완전히 해결하는 유일한 질문입니다.
tylerthemiler

3
@tylerthemiler, 문제를 완전히 해결하는 답은 어디입니까? 이 답변의 두 답변 모두 기준 2에 실패하고 첫 번째 답변도 4에 실패합니다.
Johan Walles

5
약간의 재치만으로도 질문에 대한 답을 얻을 수 있습니다. 인터넷 검색도 마찬가지입니다.
두마

10

이것은 백그라운드에서 Emacs를 시작 하여 David Caldwell의 답변 을 향상시킵니다 .

#!/bin/sh
$(/Applications/Emacs.app/Contents/MacOS/Emacs "$@") &

다른 답변에서 언급했듯이 이것은 # 2, # 3 및 # 4를 포함합니다. # 1의 경우 .emacs 파일에 다음을 넣으십시오.(x-focus-frame nil) .

참고 다음은 않습니다 하지 나를 위해 작동 -이 명령 행에 지정된 디렉토리에 이맥스 시작되지 않습니다 (예를 emacs .)

# NOT RECOMMENDED
#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" &

1
이것은 OSX의 문제를 해결합니다 (아마도 10.9 Mavericks로 시작). 10.9에서 "권장되지 않음"방법은 실패합니다. 최소 10.6까지 권장되지 않는 방법은 쉘 $ PWD와 Emacs (pwd)를 동기화했습니다. David의 대답은 다른 곳에있을 수 있지만 검색 엔진이 "pwd not pwd"를 이해하게하려면 어떻게해야합니까?
infogizmo

이 답변의 두 조각은 macOS 10.15.6 및 Emacs 26.2에서 테스트했을 때 올바른 디렉토리에서 emacs를 시작하지 않습니다.
gsingh2011

5

나는 당신이 다음 중 하나를 가정합니다.

  • 로그인시 emacs 데몬 시작
  • .emacs에 (server-start)가 있습니다.
  • 실행중인 emacs의 개별 복사본이 많이 있어도 상관 없습니다

그렇다면 이것이 원래의 4 가지 기준과 1 가지 더 많은 기준을 충족한다고 생각합니다.

  1. emacs 창이 터미널 창 앞에 열립니다.

항상 전경으로 열립니다 (x-focus-frame 사용).

  1. "emacs"를 입력하면 GUI Emacs 창이 열립니다. 해당 창에서 파일을 찾는 것은 기본적으로 내가 Emacs를 시작한 디렉토리를 찾는 것입니다.

dired 모드에서 기존 emacs 창을 엽니 다.

  1. foo.txt가있을 때 "emacs foo.txt"를 입력하면 foo.txt가로드 된 GUI Emacs 창이 시작됩니다.

emacs가 이미 실행 중이고 서버가있는 경우 기존 창에서 열리고 포 그라운드로 표시됩니다.

  1. foo.txt가 없을 때 "emacs foo.txt"를 입력하면 "foo.txt"라는 빈 텍스트 버퍼가있는 GUI Emacs 창이 시작됩니다. 해당 버퍼에서 ^ X ^ S를 수행하면 Emacs를 시작한 디렉토리에 foo.txt가 저장됩니다.

옳은.

하나 추가 :

제어는 명령을 입력 한 직후 터미널 세션으로 돌아갑니다.

~ / bin / emacs

#!/bin/bash
EMACSPATH=/Applications/Emacs.app/Contents/MacOS

# Check if an emacs server is available 
# (by checking to see if it will evaluate a lisp statement)

if ! (${EMACSPATH}/bin/emacsclient --eval "t"  2> /dev/null > /dev/null )
then
    # There is no server available so,
    # Start Emacs.app detached from the terminal 
    # and change Emac's directory to PWD

    nohup ${EMACSPATH}/Emacs --chdir "${PWD}" "${@}" 2>&1 > /dev/null &
else
    # The emacs server is available so use emacsclient

    if [ -z "${@}" ]
    then
        # There are no arguments, so
        # tell emacs to open a new window

        ${EMACSPATH}/bin/emacsclient --eval "(list-directory \"${PWD}\")"
    else    
        # There are arguments, so
        # tell emacs to open them

        ${EMACSPATH}/bin/emacsclient --no-wait "${@}"
    fi

    # Bring emacs to the foreground

    ${EMACSPATH}/bin/emacsclient --eval "(x-focus-frame nil)"
fi

대박! 당신의 args와 no-args 다리가 바뀌는 것 같습니다.
eriksensei


4

간단한 솔루션 ...

이 문제에 대한 매우 복잡한 솔루션이 여기에 게시되어 있습니다. 사소하지 않은 것처럼 보이기 때문에 공평합니다.

그러나이 솔루션은 저에게 정말 잘 작동합니다.

ec() {
  emacsclient -n $@ 2> /dev/null
  if [[ $? == 1 ]]; then
    open -a Emacs.app  -- $@
  fi
}

용법

ec file [...]

무슨 일이 일어나고 있는지 정리해 보겠습니다.

  1. 모든 ec인수를 emacsclient에 전달하고 -n계속하기 전에 emacs를 기다리지 마십시오 ( ).
    1. Emacs가 이미 실행 중이면 모두 완료되었으며 편집 중입니다.
  2. emacs가 실행되지 않을 때 emacsclient가 게시 한 오류 메시지를 삼키십시오. ( 2> /dev/null)
  3. 종료 코드 1( [[ $? == 1 ]]) 수동 처리
    1. Emacs.app을 열고 파일 인수를 전달합니다 (경로가 올바르게 열립니다.)
    2. 모든 작업이 완료되었으며 Emacs가 파일을 열었습니다.


3

David James의 응답을 더욱 개선하면 다음과 같은 효과가 있습니다.

http://www.emacswiki.org/emacs/EmacsForMacOS#toc20에 있는 터미널에서 파일을 여는 지침에 따라

open -a /Applications/Emacs.app <file-name>

이것을 David Jame의 응답과 결합하여 다음 emax bash 스크립트를 만들고 ~ / bin의 내 경로에 배치했습니다.

#!/bin/bash
(open -a /Applications/Emacs.app "$@") &

주의 사항 : Dired by name 모드 에서 현재 디렉토리를 열기 위해 emacs를 얻으려면 다음 을 사용해야합니다.

emax .

환경:

  • OS X Yosemite 버전 10.10.2
  • 2014-11-13의 GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14)

이 내용은 기존 파일을 작동, 그것 거기 경우 하나를 만들 실 거예요
Stíofán합니다.

macOS 10.15 (Catalina)를 사용하고 있는데 처음에는 작동하지만 (Emacs가 아직 열려 있지 않은 경우) 두 번째에는 작동하지 않는 것 같습니다 (Emacs 창이 이미 열려있을 때). 이 문제를 해결하는 방법을 알고 있습니까?
user102008

1

여기에있는 다른 답변은 저에게 효과적이지 않았습니다. 특히 내 컴퓨터에서 bash 스크립트

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" 

항상 홈 디렉토리에서 emacs를 엽니 다. 현재 작업 디렉토리에서 열려면

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$PWD/$@"

대신.


1
내 특정 빌드 / 설치에는 해당 문제가 없지만 솔루션에 문제가 있습니다. 두 개 이상의 파일을 열려고하면 첫 번째 파일 만 PWD 디렉터리로 확장됩니다. 나머지는 $ PWD 경로 접두사가 없습니다.
kmarsh

0

다음 단계에 따라 Emacs를 컴파일하십시오.

./configure --with-x --prefix=/usr
make
sudo make install

그리고 끝났습니다! XQuartz를 다운로드하고 설치하는 것이 도움이 될 수 있지만 그것은 제 의견입니다.


0

이것은 osx에서 열린 emacs / emacsclient에 대한 스크립트입니다.

#!/bin/bash

# Ensure (server-start) is added in your emacs init script.

EMACS=/Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
EMACSCLIENT=/Applications/Macports/Emacs.app/\
Contents/MacOS/bin/emacsclient

# test if client already exsit.
$EMACSCLIENT -e "(frames-on-display-list)" &>/dev/null

# use emacsclient to connect existing server.
if [ $? -eq 0 ]; then
    $EMACSCLIENT -n "$@"
# open emacs.app instead.
else
    `$EMACS "$@"` &
fi

0

위의 모든 항목에서 "open"을 사용할 때- "--args"옵션을 사용해야합니다.

이렇게하지 마십시오 :

alias emacs='open -a /Applications/Emacs.app $1'

대신 이것은 :

alias emacs='open -a /Applications/Emacs.app --args $1'

--args옵션은 "open"이 Emacs를위한 다양한 옵션을 소비하는 것을 방지합니다.


어떤 이유로 macOS 10.15.6 및 Emacs 26.2에서 이것을 테스트했을 때 emacs 작업 디렉토리가 내 홈 디렉토리로 설정되어 상대 경로를 사용하여 파일을 열 수 없었습니다. 이것은 존재하지 않는 파일 열기 문제를 해결했습니다.
gsingh2011

0

가장 좋은 대답 은 좋지만 emacs 프로세스가 백그라운드에서 실행되어 쉘을 계속 사용할 수 있기를 원했습니다. 이 대답 은 내가 원하는대로 보였지만 올바른 디렉토리에서 emacs를 시작하지 않았으므로 절대 경로가 필요했습니다 (또는 pwd모든 경우에 작동하지 않는 경로 에 추가 하는 해킹 ). 또한 단순히 사용 &한다는 것은 터미널을 죽이면 emacs도 죽임 을 의미합니다.

나는 screenbash 기능 을 사용하기로 결정 했으며 다음 솔루션은 다음과 함께 설치된 macOS 10.15.6 및 emacs 26.2에서 나를 위해 작동합니다 brew.

function emacs() {
    screen -d -m /Applications/Emacs.app/Contents/MacOS/Emacs "$@"
}

이 질문은 GUI 창에서 Emacs를 명시 적으로 요청했으며 이것은 터미널 세션에서 Emacs를 엽니 다.
Johan Walles
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.