지난번 글에서 인텔맥이 새로온 김에 개인적인 환경과 그 간 사용한 모델에 대해 간략하게 소개해드린적이 있습니다 ( https://www.clien.net/service/board/cm_mac/16140666CLIEN ). 그 간 사용하던 맥북에서 (특히 Catalina/Big Sur에서) 의존성 문제들을 임시방편으로 해결한 적이 있어서 새로 사용하는 맥북에서는 단계적으로 문제를 해결하면서 몇가지 참고사항을 제 개인 블로그 형태의 위키에 기록하고 있습니다. 이 글은 그 중에서도 기본 에디터로서 Emacs설정에 관련한 내용입니다. 혹시 도움이 될 내용이 있을까 싶어 맥당에도 함께 올려봅니다.
아울러 필자의 경우 개발자가 아니라 과학에 종사하는 연구자로서, 개발자 분들에 비해 전문성이 많이 떨어질 수 있음을 미리 밝혀두는 바입니다.
최근 시스템 변경을 하면서 처음부터 설치를 하는 방법을 선택하고 여러가지 시스템설정에 업데이트가 있었습니다. 그동안 트렌드를 반영하여 업데이틀 할 예정이고, 테마와 관련된 몇 가지 설정들은 Subicura님의 블로그를 참고하였습니다.
간단 요약:
- iTerm2 및 oh-my-zsh (이는 Mac OS X Catalina부터 기본 shell script가 bash에서 zsh로 변경된것에 기인합니다 [1])를 사용하고, 여기에 맞춰 다양한 컬러테마를 적용할수있습니다. 필자의 경우, Powerlevel10k를 사용하고 이에맞춰 폰트를 MesloLGS NF로 변경하였습니다. 키맵의 경우에는 필자는 좌측 커맨드를 이맥스에서의 Meta로 대응합니다. 그래서 자주 쓰이는 M-x를 Cmd-x가 됩니다. 이를 위해 몇가지 추가 설정이 필요합니다.
- Brew에서 설치하는 Emacs 기본 배포판의 경우에는 현재 Big Sur에서 GUI앱이 따라오지 않습니다. 이로인해 Aquamacs와 같은 다른 배포판을 이용해야 하는 듯 합니다만, 필자의 경우 과한 커스터마이즈는 좋아하지 않는 편이라서 비교적 기본 배포판과 비슷한 emacs-plus (해당 깃허브 링크 참조)를 사용하게 되었습니다. 일단 장점은 brew에서 설치/관리가 가능합니다. 여기에 iTerm 2와 비슷하거나 다른 테마 및 폰트들을 설정해 주게 됩니다.
내용:
1. iTerm2 의 설정
많은 부분에서 기존의 설정을 답습해옵니다. 요약하자면 다음과 같습니다.
1-1. 키 설정 변경: Left Command key를 Emacs의 Meta키로 사용하기 위한 설정
Preferences -> Profiles -> Keys에서 Left/Right Option key를 ESC+로 설정해둡니다. 이는 이맥스의 Meta키의 디폴트값이 ESC+이다보니, 편의성을 위해 Option키로 대체시킵니다.
이 다음 Preferences -> Keys -> Remap Modifiers에서 왼쪽 옵션키와 커맨드키를 서로 바꿔치기 합니다. 결과적으로, 이제 iterm2사용중에서는 왼쪽 커맨드키는 Meta키로 대응됩니다. 만약 iTerm2 외적으로 Command키가 필요한 경우 오른쪽 커맨드키를 활용하면 됩니다.
1-2. 테마
원래는 iTerm2 와 Emacs모두 Solarized Dark를 사용했엇는데, iTerm 2에서는 Subicura님의 블로그를 보고 Snazzy를 사용하고 있습니다. (다만 Emacs에서도 synazzy theme가 있지만, 색상이 과한 느낌이라 기존대로 Solarized Dark를 이용하고 있습니다) iTerm2와 직접적이지는 않지만, 터미널이 zsh로 바뀌었는김에 저는 oh-my-zsh를 사용하고 있습니다. 적용한 테마는 Powerlevel10k이고, 이 때 폰트는 MesloLGS NF입니다. 추가 폰트이므로 테마적용하면서 함께 설치할 필요가 있습니다. (같은 폰트를 이후에 Emacs에서도 사용할 예정입니다. 기존에는 Meslo를 사용했었습니다)
덧붙여 터미널내부의 색환경 설정을 위해 예전 설정과 같지만, zsh환경이므로 .zshrc에다 다음을 추가해둡니다.
export TERM=xterm-256color
2. Emacs의 설치/설정
2-1. 설치 및 기본 설정
언제부터인가, Brew에서의 기본 Emacs에서 GUI가 제공되지 않고 있는듯 합니다. 그로인해 현재는 Emacs-Plus 패키지 ( github page: https://github.com/d12frosted/homebrew-emacs-plus )를 사용하고 있고 역시 Brew를 통해 탭한다음에 사용할수 있습니다.
brew tap d12frosted/emacs-plus
brew install emacs-plus@27
추가. 댓글의 「@보복의시*catz*님」 말씀처럼, cask를 이용해도 됩니다. 예전에는 brew cask로 시작했는데, 3.1.7버전에서는 --cask를 이용하도록 되어있네요.
brew install --cask emacs
해당 패키지의 경우 역시 기본 Emacs배포판과 비슷한 emacsformacosx가 설치됩니다. 해당 패키지와 emacs-plus중에 무엇이 더 나은지에 대해서는 말씀드리기 힘드네요. 필자의 경우 예전에는 cask를 통해 설치한 이맥스를 쓰다가, 현재 새로운 맥북에서는 emacs-plus를 쓰고 있는데 가벼운 리프레쉬외에는 별다른 문제가 없이 잘 작동하고 있습니다.
어떤 배포판을 설치하시던지, 새로운 사용자의 경우에는 다음과 같은 몇가지 부분을 미리 추가해둘 필요가 있을 것 같습니다. 기본적으로 Emacs의 경우에는 실행시 .emacs를 읽어들여 설정을 진행합니다. 그래서 Emacs GUI에서 자체적으로 저장해두는 설정들의 대부분은 .emacs에 자체적으로 추가해줍니다. 이 부분은 ;; 코멘트화된 라인으로 따로 설명해두었으므로, 익숙하지 않은 사람들의 경우에는 따로 수정을 가하지 않는게 좋습니다.
이 외에 package저장소를 추가해두는게 좋은데 필자의 경우에는 다음과 같이 ~/.emacs파일에 추가해둡니다. 만약 "~/"에 .emacs파일이 없다면 직접 생성하셔도 무방합니다.
(require 'package)
(add-to-list 'package-archives
'("melpa" . "http://melpa.org/packages/") t)
(package-initialize)
(setq package-enable-at-startup nil)
2-2. "emacs -nw" alisas 및 emacs server 관련
현재는 emacs는 GUI를 디폴트로, em에는 alias를 설정해두어 "emacs -nw"를 수행하도록 합니다. -nw (no window)옵션을 사용할 경우 GUI없이 터미널 자체적으로 Emacs가 실행됩니다. 위에서 언급한것처럼, zsh를 사용하므로 .zshrc마지막에 다음을 추가해줍니다.
alias em='emacs -nw'
현재 필자는 emacsclient를 잘 사용하지 않으므로 M-x server-start를 사용하는 경우는 LaTex로 작업중 Skim과 상호작용을 할때 밖에 없습니다. 해당 부분은 나중에 LaTex환경설정에 관한 이야기를 할 기회가 되면 올리도록 하겠습니다. emacsclient를 사용하시는 분들은 server-start를 사용하시고 (혹은 .emacs에 (server-start)를 추가하시고) 다음과 같은 alias를 추가하실 수 있습니다. 필자의 경우, emacs/ec/em 세가지를 다뤄야 하고 서버를 사용하는 시점등을 생각하기가 번거로워서 현재는 사용하지 않고 있습니다.
alias ec='emacsclient'
2-3. 키 설정
iTerm2에서 설정한 키맵의 경우 터미널 내에서 이맥스를 실행할 경우에만 유효합니다. 필자의 경우, LaTex작업과 본격적 코딩작업의 경우 GUI를 활용하므로 다음을 추가로 설정해주어서 Mac의 Option키를 super로, Command 키를 Meta키로 대응시켜야 합니다.
(setq mac-option-modifier 'super)
(setq mac-command-modifier 'meta)
2-4. 폰트 및 테마 관련
2-4-1. 폰트
앞서 말씀드렸다시피, 필자는 원래 Meslo를 주로 사용하다가 현재는 MesloLGS NF를 사용합니다. 이는 .emacs에서 custom-set-faces로 수정해줄수 있습니다만, 일반적으로는 M-x customize-face에서 default를 넣고 들어간 곳에서 Font Family에 "MesloLGS NF"를 넣어주고 저장합니다. 그러면 .emacs파일의 customize-set-faces란이 자동으로 수정되어 있습니다.
2-4-2. Emacs GUI theme
앞서 설명드렸다시피 저는 sanityinc-solarized-dark를 GUI의 기본 테마로 사용합니다. Solarized-dark 테마에 대한 디테일은 해당 링크에서 확인하실수 있습니다. iTerm2에서 쓰는 Synazzy는, 강조색상들이 매우 밝은 편이라서 오랫동안 텍스트 작업을 하게 되는 Emacs에는 (저에게) 어울리지 않는다는 결론을 내렸습니다.
이 경우 GUI를 사용할때만 테마를 적용하고 싶으므로, when window-system 이라는 옵션을 적용하여 테마를 적용합니다.
(when window-system
(load-theme 'sanityinc-solarized-dark t)
)
Sanityinc-solarized-dark를 사용한지 매우 오래되었다보니 여러가지 시인성에 있어서 적응한 부분도 있습니다. 한가지 중요한 단점이, 코멘트 처리된 색상이 기본 폰트색깔과 비슷하기에 구분이 어렵습니다. 그래서 필자의 경우 다음과 같은 부분을 .emacs에 추가해줍니다.
(when window-system
(set-face-foreground 'font-lock-comment-face "dark red")
(put 'upcase-region 'disabled nil)
)
2-4-3. Emacs terminal theme
기본 테마가 시인성이 좋아서 그대로 사용합니다. 장기적으로 사용하기에 조금 눈이 피로할때가 있긴 한데, 어차피 오래 집중하는 글쓰기 및 코딩은 GUI에서 사용하고, 일반적으로 계산 조건 파싱등에 쓰이는 input파일 및 간단한 스크립팅을 터미널에서 사용하므로 특별한 테마설정은 해 주지 않습니다.
2-5. 기타 자잘한 설정들
필자의 .emacs파일에는 과거부터 써오던 흔적들이 남겨져 있다보니 조금 이런저런 설정들이 짜깁기 되어있습니다. 특히 org, LaTex + AUCTeX, 혹은 frame-window관련설정들이 그렇습니다만, 이런건 일반적이지 않은 부분들이니 새로 글타래를 열도록 하겠습니다. 그 외의 자잘하지만 유용한 설정들만 언급하도록 하겠습니다.
2-5-1. .h파일을 자동으로 C++ 모드로 가져오기:
(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))
2-5-2. ring-bell 무시하기
(setq ring-bell-function 'ignore)
2-5-3. word-wrapping
(setq word-wrap t)
(setq longlines-wrap-follows-window-size t)
2-5-4. reload setting
(defun reload-dotemacs()
"Reload .emacs"
(interactive)
(load-file "~/.emacs"))
2-5-5. Start-up screen 무시하기
.emacs에서 다음을 추가하면 됩니다.
(custom-set-variables
'(inhibit-startup-screen t))
최근에 사용하고 있던 emacs-plus@27 GUI의 경우 startup-screen자체에서 제일 마지막에 손쉽게 설정변경을 해주는 옵션이 생겼습니다 (다른 배포판은 확인해보지 않았습니다). 이를 선택하면 위 설정내용이 .emacs에 자동으로 삽입됩니다.
각주:
[1] Shell script의 기본은 달라지지 않았으나 zsh가 기존의 bash에서 무엇이 다른가 싶어서 몇가지 검색결과, 대부분 필자가 사용하는 수준에서는 달라지는게 없다는 결론을 내리게 되었습니다. 몇가지 편의성 기능들이 달라지고, 이들의 보여주는 수준이 더 유려합니다. 그러무로 굳이 옮기지 않을 이유가 없습니다. 혹시 기존의 bash script를 그대로 수행하기 원한다면 hashbang을 이용해서 다음과 같이 기술하면 될 듯 합니다.
#!/bin/bash
zsh와 bash의 자세한 차이점은 링크한 스택오버플로우 답변에 잘 나와있습니다. 혹은 linux기반으로 설명되어있는 링크한 블로그의 글 역시 도움이 됩니다.
에구 저는 VI + iTerm 유저라서리.. 아쉽네요.. 바로 못 써먹어서요 ~.~
방금 간단하게 검색해보니 다음을 추가하면 되겠네요.
(require 'ucs-normalize)
(set-file-name-coding-system 'utf-8-hfs)
반면에 다른 배포판들의 경우에는 디폴트 인코딩 시스템이 바뀐상태인듯 합니다. 말씀하신 cask의 경우는 brew info --cask emacs로 확인해보니 emacs for mac os x가 적용되어 있습니다 ( ). 저도 한때 쓰곤 했었습니다만, 아직까지 지금 쓰는 emacs-plus와 중요한 차이를 발견하지는 못한 듯 합니다. (다만 현재 emacs-plus의 GUI에서 리프레쉬가 가끔 발생하는데 이 점이 어떻게 바뀔지는 모르겠네요) 두 배포판 모두 기본 배포판에서 크게 커스터마이징이 되어 있지 않아서 좋은 듯 합니다.
"Modern" Emacs측면에서는 여러가지 논의가 지난 몇년간 있어왔고 Lisp에서 Python이나 다른 언어 베이스, 혹은 Java (말씀하신 emacs-ng)쪽도 이야기가 있는 것 같은데 다들 한 때 이슈가 되었다가 사그라 드는 듯 합니다. 방금 찾아보니 emacs-ng는 최근에도 흥한것 같네요. 좋은 추천 감사합니다. 저는 java쪽은 전혀 모르지만, 여러 배포판이 나와주는 생태계가 조성되는것은 좋은 것 같습니다.
그거와 별개로 개인적으로 이맥스를 오래 사용해오면서 생각하는 부분입니다만, 저처럼 한번 평범한 커스터마이즈를 한 다음에는 그냥 그대로 쓰는 사람입장에서는 기본 GUI의 편의성을 증대시킬 필요가 있어보입니다. 사실 이쪽의 자잘한 이유들이 몇몇 개인 워크플로우를 Emacs기반에서 다른 소프트웨어로 넘어가게 한 부분입니다. 예를들어 개인 연구 소노트들을 org-mode를 중심으로 작성하곤 있있는데, 간단한 몇가지 편의성 부족때문에 몇년전부터 Devonthink에서 사용하고 있습니다. 사실은 굳이 Devonthink가 아니라 그 전에 사용하던 MacJournal로도 되고 혹은 지금 많이들 쓰시는는 Joplin도 가능합니다.