본문 바로가기

macOS에서 Emacs가 실행되지 않기 시작했다

기술적인 이야기/이맥스 2024. 12. 17.
반응형

개인적으로 선호하는 편집 환경인 Emacs는 macOS 상에서 편하게 빌드하기 위해 Homebrew를 통해 emacs-plus 패키지로 설치하는 편인데 상당히 오랜 기간 잘 써왔고 별 문제도 없었기에 지금에 이르고 있다. 다만 최근에 emacs-plus를 업그레이드 한 이후로 문제가 생기기 시작했는데 제목과 같이 Dock이나 파인더에 있는 바로가기를 통해서 앱이 실행되지 않는다는 점이다. 이 문제를 해결하기 위해 상당한 삽질을 했지만 실패했고 그나마 대안을 찾았다.

좀 더 상세한 문제 내용

언제부터인지 모르겠지만 emacs-plus의 정보나 설치 후 메시지를 살펴보면 아래와 같은 문구를 볼 수 있었다.

Homebrew의 emacs-plus 정보 중

여기서 osascript를 사용하는 긴 커맨드가 보인다. 기존에는 빌드된 앱(Emacs.app)을 링크(link) 방식으로 macOS의 Applications 폴더에 바로가기를 만들어 주던 방식 대신 별도의 애플 스크립트를 실행하는 형태로 바뀐 것이다. 아마도 뭔가 이유가 있으니 이렇게 바뀐 것 같지만 그 이유는 아직 모르는 부분이다.

어쨌든 위 안내대로 준비하면 Applications에 Emacs.app이 생긴다. 그런데 이걸 실행시키거나 Dock에 끌어다 놓고 클릭해 보면 아래와 같은 다이얼로그가 표시되기만 하고 정작 Emacs는 실행되지 않았다.

Dock의 Emacs.app 실행 실패 시 다이얼로그

어디서 실행시키느냐에 따라 메시지 모양은 약간 달랐지만 동일하게 "(null)을 열 수 있는 권한이 없다"라는 내용이었다. Emacs가 아니라 null이라니 뭔가 흔치 않은 이상한 에러였다.

기존 방식으로 brew link 커맨드를 써보면 어떻겠냐고 할 수 있는데 무의미했다. 왜냐하면 빌드된 내용물을 그대로 실행시켜도 위와 비슷한 오류가 발생하기 때문이다.

문제 해결을 위한 여러 시도들

그나마 다행이라면 Emacs를 실행시킬 수 있는 대안은 있었다는 점이다. 터미널을 통해서 아래와 같은 셸 커맨드를 입력하면 Emacs GUI가 떴기 때문이다.

$ emacs &

혹시나 해서 첨부하는데, 제일 앞의 $는 셸 프롬프트다. 그리고 &는 셸 커맨드를 백그라운드로 실행시킨다는 의미다.

다만 위 방법은 큰 단점이 하나 있었다. 바로 실행시킨 부모 셸이 종료되면 자식 프로세스에 해당하는 Emacs도 따라서 종료된다는 점이다. 쉽게 말해서 터미널을 닫으면 Emacs도 같이 닫혀버린다는 말이다. 만약 실수로 작업 도중 터미널의 탭을 닫거나 셸을 종료시키면 어이없게 Emacs가 강제종료 되어 작업 내역을 다 날려버리는 무시무시한 일로 이어질 수도 있다는 말이고 따라서 쉽게 넘길 일이 아니었다.

이럴 때를 위해 쓸 수 있는 nohup을 이용하면 되지 않을까 생각했는데 이 방법을 써봐도 셸이 종료되면 Emacs도 함께 죽어버렸다. 뭔가 모르고 있거나 빼먹고 있거나 혹은 제한 사항이 있는 게 아닐까 의심은 되지만 해답을 확인하지는 못했다.

다른 방법은 없을까 찾아봤더니 "빌드된 Emacs.app을 Applications에 통째로 복사하면 된다"는 답변도 찾을 수 있었다. 하지만 이는 Emacs 30의 특정한 오류에 관한 대안이었고, 실제로 빌드된 Emacs.app을 Applications에 복사해 넣어도 에러는 동일하게 발생했다. 어차피 원본에서 문제가 생기는 상황에서 복사해 봤자 무의미한 일이다. 애초에 macOS는 앱이 어디에 위치하든 실행시킬 수 있게 설계되어 있기도 하니 말이다.

그렇다면 셸 커맨드를 GUI 방식으로 우회해서 구동시키는 방법은 쓸 수 있을까? 빠르게 시도할 수 있는 방법 중 macOS의 Automator를 활용하는 방법을 한 Reddit 스레드에서 찾을 수 있었다.

Automator로 시도 중인 모습

참고로 위 스크린샷은 그 시도 중 하나인데 답이 안 되었기 때문에 별도의 설명은 생략한다. 이렇게 만들어진 앱을 실행시켜도 아무 반응이 없었다. 뭔가 오류라도 알려주면 해결해 주겠는데 아무런 오류 메시지조차 볼 수 없었다. 스크립트 내용에서 명령이 역따옴표로 둘러싸여 있는데 이걸 빼는 것도 도움이 안 되었다. 그리고 기존에 쓰던 emacs를 바로 실행시키는 커맨드도 동작하지 않았다.

대안의 발견

그나마 쓸 만한 수단은 이번에도 '터미널에서 셸 커맨드를 입력하는 방법'이다. 앞서 nohup은 의도대로 되지 않았다고 적었는데, zsh을 쓴다는 가정 하에 아래 커맨드가 의도대로 동작한다는 것을 찾을 수 있었다.

$ emacs &!

이렇게 하면 프로세스 종속 없이 Emacs GUI를 띄울 수 있었다. 셸을 종료해도, 터미널을 닫아도 Emacs는 살아남았다. 불행히도 터미널을 경유해야 한다는 불편함 점은 있었지만 개인적으로 터미널은 항상 띄워져 있는 앱이기 때문에 약간 불편한 정도의 일이기도 하다.

참고로 &!는 zsh에서만 확인한 커맨드라는 점을 참고하자. 다른 셸에서도 비슷하게 지원할 수도 있다.

어쨌거나 이걸로 큰 문제는 해결했지만 그래도 약간의 불편함과 비정상적(?)인 환경을 그저 두고 보기엔 개인적인 성격이 용납하지는 않을 것 같다. 후속 조치가 있거나 해결 방안을 찾게 되면 추가로 글을 정리하고 이 글은 여기서 마무리한다.

728x90
반응형

댓글