Emacs이랑 친해지기

Posted on Jan 1, 2017

“이맥스를 어떻게 배우면 좋은지 모르겠다. 여러번 도전해봤지만 항상 별로였다.”

..어느날 한 동료가 물어봤다. (그렇다 나는 일터에서도 이맥스를 켜놓고 계속 쓴다.)

솔직히 기본적으로 매일 Org-mode으로 계획, 일정 등등 정리하고 계속 개인적으로 정리하면서 쓰고, 파이썬, Go, Clojure 같은거 할때도 편집하고 테스트하기도 편하니까 선호하는 편인거 같다. (자바랑 스칼라은 물론 그냥 IntelliJ 쓴다.)

여튼 그날 간단히 짝프로그래밍하듯이 같이 앉아서 몇가지 이야기를 하고, 내 설정 파일 1 이나 어떻게 접근하는게 좋은지에 대해서 잠깐 이야기를 했었다. 그걸 블로깅으로 써보고 싶다.

어떤 편집기를 쓰건, 어떤 언어를 쓰건 개인의 자유고 각각의 장단점이 있다고 생각한다. 그리고 Atom, Vim 같은 에디터 모두 확장하며, 충분히 자신의 필요에 알맞게 강력하고 편리하게 쓸 수 있고, 오히려 이맥스보다 어떤 부분들은 더 현대적인 점도 많은거 같다. 2

![평범한 이맥스 유져]({{ site.url }}/assets/2017-Jan/emacs_user.jpg)

  • TOC {:toc}

이맥스가 결국 emacslisp 실행기라는걸 인정하는게 훨씬 낫다.

실망스럽겠지만, 이맥스를 쓰려면, 그냥 리습을 어느 정도 어떤 문법과 semantic으로 동작하고, 그게 어떻게 이맥스를 구성하는지를 이해하고 약간은 사용할줄 알아야한다.

솔직히 나는 elisp의 많은 동작이나 세세한 몇몇의 차잇점들은 잘 모르겠다. 그런데 딱히 사용하는데 아직까진 큰 지장은 느끼지 못했던거 같다. (내가 직접 이맥스 확장 패키지를 만들거나 하지는 않았으니까.)

그리고 결국 emacslisp을 어느 정도는 익히는게 도움이 된다. 물론 어느 정도 이맥스에 익숙해진 다음에 공부해볼것을 권한다.

  • https://emacs-doctor.com/learn-emacs-lisp-in-15-minutes.html: 이맥스에 붙여넣어서 한줄씩 따라하면서 실행하면되는 형식이다.
  • https://www.gnu.org/software/emacs/manual/html_node/eintr/: 이맥스리습의 공식 문서인데, 처음의 몇몇 챕터를 대충 읽으면서 리습 언어에 대해 처음이라면 괜찮을수도 있다. 다만, 모든걸 한번에 이해할거라고 생각하진말고, 한번에 이해가 안되더라도 그냥 넘어가고, 나중에 다시 이해가 쌓이고 다시 읽어가면서 이해해도 괜찮다. (..한마디로, 이해하기 개떡 같다고 때려치진말자.)

..어차피 이맥스에서 모든 단축키나 메뉴의 기능들은 대응하는 elisp 함수들일뿐이고, 설정값들은 모두 elisp 변수들이다.

현재 실행중인 리습시스템 자체가 이맥스 프로세스라고 생각하는게 속편하다. 근데 왜 굳이 이따구로 만들어놓은걸 쓰냐고?

리습시스템이어서 좋은점: 자기 설명적인 시스템, discoverability.

현재 동작하고 있는 시스템이어서, Smalltalk, Python, 커먼리습, Clojure REPL처럼 이맥스 편집기 자체에 대해서 찾아보고, 어떻게 동작하는지 테스트해보고, 어떤 값을 갖는지 살펴보고 바꾸고 해보기 편하다.

어떤 마법의 설정값을 지정하고 편집기를 다시 시작하고, 도무지 매뉴얼이나 소스코드를 찾아보지 않는 이상 어떤 설정이나 기능이 있는지 알 수 없는 다른 소프트웨어들과 다르게, 이맥스는 어떤 기능을 갖고 있고, 어떤 기능이 어떤 설명이나 어떤 단축키, 혹은 어떤 설정변수와 연결을 갖는지 바로바로 편집기 안에서 찾아볼 수 있다. 3

처음부터 단축키는 외우지말자.

처음에 시작할때, 몇가지 정말 중요한 것들, 그러니까 이맥스를 종료하기 이나 파일열기, 저장하기, 혹은 창분할, 다른 분할창으로 포커스 이동 같은 키들은 꼭 익혀두고 시작하는게 속편하다. 그리고 무엇보다, M-x ...<RET> 이 뭔지는 알고 시작해야한다.

하지만 나머지 다른 키들, 그러니까 Yank, Paste, Kill ring, Macro 같은것들은 처음부터 익히지 않아도 좋은거 같다. 다음의 것들만 조금 익혀놓고, 이맥스를 탐험할 준비가 어느 정도 갖추면 좋겠다. 4

ELPA, 수많은 확장들…

이맥스에서 릴리즈24부터였었나(불확실;) ELPA이 공식 이맥스에 포함되고, 리눅스 배포판들의 패키징시스템이나 Homebrew처럼 원격 공식저장소 바로 패키지를 선택하고 설치할 수 있는 기능이 생겼다.

https://www.emacswiki.org/emacs/InstallingPackages 여기를 읽어보면 사용법을 알 수 있다.

그런데 문제는, 너무 많은 패키지가 있어서 뭐부터 설치해야할지 모르겠다는점이다. ㅎㅎ

솔직히 처음부터 패키지 설치와 설정을 권하고 싶지 않다. 예를 들어 같은 기능을 하는 패키지들이 여러가지 별개의 방식으로 존재하기도 하고, 설정이나 그런것들도 그렇고. 5

처음에는 그냥 기본적인 편집기로서 설정을 충실하게 해놓고, 그 다음에 자신의 필요에 따라서 패키지를 골라보기를 권한다.

그리고 구글에서 “dot-emacs” 정도로 검색해보면 수많은 다른 사람들의 설정을 찾아 볼 수 있다. https://dotfiles.github.io/ 여기도 마찬가지고.

다만 역시나 처음부터 너무 많은 설정을 맞추려고 하지는 않았으면 좋겠다. 금방 지치기 쉬우니까.

(뜬금없이) GNU프로젝트.

어쨌든 GNU 프로젝트니까, 대부분의 경우 문서화가 엄청 잘되있다.

  • C-h i 눌러서 Info pages 을 이맥스 안에서 바로 살펴볼 수 있다.

    • 리눅스 배포판이라면 패키지 선택에 따라 다르겠지만, 보통 이맥스 매뉴얼과 튜토리얼 관련 문서들도 함께 설치하면, GNU Info pages으로 이맥스 매뉴얼들을 바로 읽어볼 수 있다.
    • Info pages 읽는것에 익숙해져도 꽤 편안하다. <TAB>이랑 엔터키만 잘 눌러서 읽어나가면 되니까.
  • 웹에서 검색해서 문서들 찾아봐도 좋고,

  • EmacsWiki도 좋은 문서들이 많다.

    • 한국어 문서랑 영문 문서랑 항목들 차이가 많으니까, 영문에 익숙하고 그쪽에서 찾아보는게 낫다.

부록: 튜토리얼에서 알려주진 않는 생존법

  • 단축키 표기법을 익숙하게 읽자.

  • (이미 말했듯이) 단축키를 익혀도 좋지만, 몰라도 좋다.

    • 다만 그 기능 을 구현하는 elisp 함수의 이름이라도 제대로 기억하거나, 그 키워드 는 확실하게 기억해두면 언제든지 원할때 찾을 수 있다.
    • 예를 들어, C-h k C-x 1을 쳐보자, 해당 chords(C-x 1)의 설명과 실제로 그 코드가 실행하는 elisp 함수를 알 수 있다. (delete-other-windows)
      • 심지어, F10키를 눌러서, 메뉴 어디에서 찾을 수 있는지도. :-)
      • 반대로 C-h f delete-other-windows <RET>으로 함수를 기준으로 찾아들어가도, 어떤 키에 이 함수가 바인딩 되어있는지 알수있다.
    • ..결국 이맥스에서 사용하는 용어(예: 버퍼buffer, region 등등에만 익숙하고, 함수나 변수, 단축키를 찾아가는 방법을 익혀놓으면 일일이 외우지 않아도 언제든지 찾아볼 수 있다.)
  • C-h t: 커서 움직이기, 편집하기, 저장-불러오기. 지루하고, 꼭 진행하지 않아도 좋지만, 그래도 한번 익혀놓으면 대강 어떤 방식으로 편집하고, 컨벤션 같은걸 감을 잡을 수 있으니까 읽고 따라해보는걸 추천.

  • C-h ?: 어디서부터 시작할지도 모르겠을때. 사실 도움말이랑 이맥스 설정변수, 함수, 어떤 키가 어떻게 동작하는지 궁금할때 이걸 열어보면 좋다. (사실 나중되면 C-h a 같은걸로 특정한 키워드의 변수나 함수를 바로 찾아보게 되지만, 처음에 어떤 그런 기능들이 있는지 살펴보기 좋다.)

  • C-x o, C-x 1, C-x 0: Window 이라고 이맥스에서 표현하는 분할한 pane으로 포커스를 이동하거나 현재 pane만 남기고 감추거나, 현재 pane을 감추는 키들을 익숙하게 쓰는게 좋다. (도움말을 찾아서 읽으려고 해도, 이 방식이 익숙해지지 않으면 읽기 불편하다.)

부록: 내가 쓰는 이맥스 패키지들 소개

내가 사용하는 패키지들을 소개하고, 어떻게 이맥스를 실제 작업흐름에 적용해 쓰는지 소개하고 싶었다. 개인적으로 훨씬 더 나은 패키지도 있을거고 설정이나 사용법은 취향에 따라 더 달라질 수 있을거 같다. 다만 처음 이맥스를 접하는 사람에게 이런것들이 이맥스에서 가능하다는걸 소개하는 의도로 해보겠다.

  • Projectile
    • Atom 에디터에서 제공하는 프로젝트 폴더 기능을 구현해준다.
    • 프로젝트 폴더는 Git등의 저장소로 감지되거나, 프로젝트 최상위 디렉토리에 .projectile 빈 파일을 만들어놓으면 그 디렉토리부터 이하를 하나의 프로젝트로 인식하고 동작한다.
    • 파일 빨리 열기나 프로젝트내 파일 이동, Git 연동 같은 부분들이 너무 편하다.
  • Magit
    • Git 커맨드를 직접 치지 않아도 된다.
    • ..솔직히 Git 커맨드들 잘모르지만, 대부분의 git 작업을 정말 단순하게 할 수 있게 도와준다.
  • Helm
    • 소스코드에서 키워드나 참조에 따라 자동완성이 아니라, 이맥스 안에서 윈도 이름이나 파일 이름 자동완성등을 개선해주는 “프레임웍”.
      • ..이런 성격의 패키지들이 몇개 있다. 그런데 나는 helm이 제일 편했다.
    • helm-ag: https://github.com/ggreer/the_silver_searcher
      • 소스코드를 빨리 내용 검색하는 the-silver-searcher 이랑 helm이랑 연동해준다.
      • Projectile이랑도 연동이 되어 있어서 편함.
    • helm-projectile: projectile 쓰니까 깔아봤음.
  • Elpy
    • 단순히 M-x python-mode이나 M-x run-python은 이맥스에 기본 내장.
    • 그런거 말고 rope을 이용한 리팩토링, jedi 백엔드를 통한 자동완성(autocomplete, company등이랑 연동되서), flycheck 연동으로 PEP8이나 실시간 문법검사, virtualenv 연동 등등등 진짜 파이썬 개발하면서 파이썬 생태계의 쉘도구들을 잘 엮어서 정말 괜찮은 개발환경으로 만들어준다.

여기서 소개하지는 않았지만, Go-language이나 Ruby, 혹은 Clojure, CommonLisp을 작업할때 나는 꽤 즐겁게 이맥스에서 편집하고 편안하고 생산적으로 작업할 수 있었다.

자신의 언어나 이맥스 작업흐름을 찾아보고 싶다면, https://www.youtube.com/에서 “emacs screencast” 혹은 이맥스와 자신의 주요 사용 언어나 환경을 키워드로 검색해 살펴보기를 추천한다.

“모드”

이맥스는 여러가지 형식의 파일들을, 혹은 파일이 아닌 _버퍼_들을 각각의 _모드(modes)_을 통해서 구현함. 6

그리고, 설정에 따라서 한 버퍼에 대해서 한 _Major mode_와 _Minor modes_으로 구분해볼 수 있을거 같다.

예를 들어, 현재 내가 편집하는 파일이 파이썬 소스라면, 주요모드는 파이썬 모드일것이다. 하지만, 괄호나 여러가지 주요 기능들을 거기에 더 추가하고 싶어서 설정한 나머지 기능들은 minor-modes으로 그 버퍼에 적용되어있다.

자세한 내용은 역시 공식 매뉴얼을 ㄱㄱ

다만, 현재 버퍼에 적용된 모드들과 기능들을 보고 싶다면, C-h m으로. 각각의 적용된 모드들에 대해서 정리되어 있어서 보기 더 편하다.

걱정하지않기.

"Don't Panic! It's mostly harmless."

솔직히 익히는데 상대적으로 시간도 많이 걸리고, 예쁘지도, 뭔가 투박해보이고 거추장스러워 보이는 에디터다.

하지만, Vim을 익히고 사용해본 사람은 쉽게 이해할만한 부분이라고 생각하는점은, 익히고 익숙해지고 또 그 이후에 내게 맞춰서 편집기를 설정하고 하는만큼 편안하고 강력해진다는걸 말하고 싶다.

그리고 그래도 딱히 추천하고 싶은 생각은 없다. 괴상한 취미가 없다면. 아톰이나 좋은 에디터는 충분히 많으니까. :-)

그래도 해보고 싶다면, 겁내지 말고 차근차근 하나씩 설정해보고, 필요한 패키지들을 검색해보고 설치하고 설정해보면서 내게 잘 맞는 방법을 찾아보라고 말하고 싶다. 괜찮다. …대부분은 크게 해가 되지 않는다. 7



  1. https://github.com/ageldama/configs/blob/master/emacs/init2.el 딱히 깔끔하게 정리해놓고, 주석도 착실하게 달아놓지 않아서 지저분하다. 처음 설정할 때, use-package.el 같은걸 특정한 위치에 git clone 을 직접해줘야 하는거 등 세팅할때도 설명이 더 필요하다. ↩︎

  2. 사실 나는 Vim, Emacs 둘 다 쓰고, 그냥 터미널에서 뭔가 고치거나 그때 그때에 따라서 이맥스에 설정된거 거치지 않고, 그냥 Vim에서 빨리 고칠 수 있을만한건 거기에서 편집하고 쓰는거 같다. 그리고 Atom도 설치해놓고, 다른 소스 같은거 읽을때 주로 사용하는거 같다. ↩︎

  3. 사실 이맥스를 익히는건, 내 생각엔 단축키나 편집키를 외우는것보다 동작하는 방식과 그걸 실시간으로 내가 찾아볼 수 있는 방법을 익히는쪽에 더 가깝고, 그편이 훨씬 재미있고 유용하다고 생각한다. ↩︎

  4. (알고 있겠지만) Emacs을 위한 Vi 혹은 Vim 편집기의 편집키들을 그대로 사용할 수 있는 패키지들이 많이 있다. 이맥스 편집기능들이나 편집키들을 굳이 많이 외우지 않아도, 짧고 익숙한 Vi/Vim 방식을 써도 좋다.

    • viper-mode은 아예 이맥스 기본 배포판에 포함되어있지만 개인적으로는 별로다.
    • 나는 evil-mode을 사용한다. 어차피 이맥스랑 Vim 모두 익숙하고, 평소에는 이맥스 키바인딩으로 괜찮은데, 반복적인 편집이나 Vim으로 편집하는게 더 빠를거 같을때는 Evil-mode을 켜고 작업한다.
     ↩︎
  5. 예를 들어,

     ↩︎
  6. M-x tetris<RET> 테트리스 게임이나 magit, eshell 같은 기능들도 모두 버퍼이고, 이 버퍼의 해당 모드들으로 elisp을 통해 구현해놓은 기능들이다. 꼭 어떤 문법의 프로그램 소스코드만이 모드라고 하기는 어려운거 같다. ↩︎

  7. 실제로 MS윈도 환경에서 이맥스가 잘 동작하게 하려면 리눅스나 맥OS에서보다 더 설정에 신경을 써야하고 짜증난다. 그리고 내가 주로 사용하는 언어가 자바라면 그냥 이클립스나 IntelliJ을 쓰는게 더 편할때도 많은거 같다. 그리고 비주얼스튜디오이거나. 그럼에도 마우스를 쓰기 귀찮아 죽겠거나, 이미 익숙해질대로 익숙해져서 이맥스와 Vim, 쉘프롬프트가 좋다면 어쩔수없다. 그리고 파이썬, 대부분의 리습계열 언어들, 루비, go, rust, erlang, elixir 등등의 오픈소스이거나 한 언어들은 오히려 편한 IDE으로서 동작하는 편집기가 흔치는 않은거 같다. (개인적으로) …하지만 가장 중요한건 개인적인 생각이라는점이고, 자기가 편하다고 느끼고 쓸만하다고 생각하는걸 써야하는거 같다. ..다만 현재 자기가 쓰는것에서 뭔가 더 찾아보고 싶거나, 심심하거나 하다면 익혀보길 추천한다. ↩︎