"이맥스는 사용자와 함께 진화하는 에디터다"

- 야이미친



<이맥스 개종 가이드>


1편

2편

3편



아 슬슬 힘들어진다


이번 화는 이제 본격적으로 프로그래밍에 도움이 되는 얘기를 하겠습니다..


일단 이맥스에는 메이저모드랑 마이너모드라는게 있음


어떤 파일을 열었을 때 그 순간 이맥스는 단 하나의 메이저 모드를 가질 수가 있음


그리고 여러개의 마이너 모드를 가질 수가 있음


이게 뭔 얘기냐하면,


.hs 라는 파일을 열 때 하스켈 모드가 켜지도록 설정하면,


.hs 확장자 파일을 여는 순간 하스켈 모드가 켜지고 하스켈 모드에 엮여진 모든 마이너모드들이 켜짐


이렇게 마이너 모드들을 메이저 모드에 엮는걸 hook 을 건다고 하는데,


이맥스의 편리함의 핵심임




이맥스에서 보통 자동완성은 auto-complete 랑 company 라는게 있고,


스펠링 체크는 flycheck 이랑 flymake 라는게 있음


얘네는 llvm 처럼 자동완성, 신테스 체킹을 해주는 엔진들이고


그 앞에 llvm-clang 처럼 언어별 데이터를 제공해주는 front-end 를 달아줘야 됨


Elisp 용 프론트엔드들은 이미 있으니까 상관이 없고,


제가 C++을 주로 해봤기 때문에 C++을 기준으로 설명을 하겠습니다.




일단 C++ 에서는 여러개의 front-end 엔진들이 있는데,


대표적으로 Irony랑 rtags 가 있습니다.


irony 가 가장 많이 쓰이는 것 같은데,


제일 강력한건 rtags 임


irony의 경우 윈도우에  돌아가고 rtags는 현재 윈도우로 포팅 작업을 진행하고 있음



irony랑 rtags는 language-server 라고 해서,


이맥스의 패키지와 데이터를 주고 받는 별개의 프로세스들을 갖고 있습니다.


irony는 irony-server 가 있고, rtags는 rc, rdm 이라고 부릅니다.


이 데이터들을 flycheck 한테 제공하기 위해서는


flycheck-irony, flycheck-rtags 라는 패키지를 다운받아야 하고,


company한테 제공하려면


company-irony, company-rtags 를 다운받으면 됩니다.


그 다음에 세팅을 해줘야 됨




듣기로는 엄청 복잡한 것 같은데 생각보다 간단함


절차적으로 나열하면,


M-x package-install RET company RET


M-x package-install RET flycheck RET


M-x package-install RET irony RET


M-x package-install RET company-irony RET


M-x package-install RET flycheck-irony RET


M-x install-irony-server (이 명령어가 맞나.. 좀 다를 수도 있음. 이거는 irony 처음 받을 때 실행해줘야 하는 명령어임)


그 다음에 설정 코드 작성


딱 이 정도


맨 위에 두 줄은 정말 처음에 해주는거고,


그 뒤부터는 새로운 언어를 위한 환경을 구축해줘야 될 때 나머지처럼 프론트엔드만 다운 받으면 됨




저 이상한 use-package 라는건 나중에 설명할테니 그건 무시하고 나머지 코드를 보시면,


(add-hook 'c-mode-common-hook 'irony-mode)


이렇게 돼있음


이게 뭐냐하면 c-mode-common-hook 에다가 새로운 hook 을 달겠다는건데,


그 훅은 irony-mode 라는 함수임


c-common-mode 가 발동되면, c-mode-common-hook의 훅들이 실행되고,


c-mode-common-hook 에는 irony-mode 가 달려 있으니까 irony-mode 함수가 실행됨


irony-mode 함수는 irony 마이너 모드를 시작하는 함수인데,


쉽게 말하면 irony 서버를 띄우고 irony를 사용하는 모드임


c-common-mode-hook은 뭐냐하면 C 계열 언어들의 hook인데,


c-mode, c++-mode, objc-mode 이 중에 하나라도 켜지면 c-common-mode-hook 이 실행됨


당연히 c-mode-hook, c++-mode-hook 도 다 따로 있음




a



저번에 말했지만 add-to-list 는 리스트에 새로운 원소를 추가하는거고,


auto-mode-alist는 어떤 파일을 열 때 어떤 모드를 시작할지를 결정해주는 리스트임


저기다가 내가 C++의 각종 확장자들을 추가해주는 코드임


당연히 각 모드별로 이맥스에서 기본적으로 설정해놓은 확장자들도 있는데,


C++은 확장자도 많다보니 저런 코드를 쓰게 됐음 ㅎㅎ;;


저 확장자를 가진 파일을 여는 순간 C++-mode 가 실행되고 c++-mode-hook 이 실행되고 c-mode-common-hook 이 실행됨






이거는 다른 예시인데,


이맥스는 기본적으로 마크다운 모드를 제공하고 있지 않아서 markdown-mode 를 패키지 매니저로 받아야됨


저 밑에 :mode 라고 나와있는 부분이 보면 README.md 라는 파일, .md, .markdown 이라는 확장자를 가진 파일을 열면 markdown-mode를 실행하라는 코드임





C++ 에 관해서 몇가지 더 얘기를 하자면,


irony가 괜찮은데, 쓰다보면 rtags가 쓰기 훨씬 좋고 rtags 가 기능이 워낙 많아서 개사기임


근데 C++ 의 컴파일 커맨드 같은걸 설정하기가 굉장히 까다로워서,


이 경우에는 cmake-ide 라는 패키지를 사용할 것을 강력히 추천함


당연히 cmake 로 모든걸 해야된다는 단점이 있음... autotools 랑 make는 지원하는 패키지들이 읎다


Electric pair 라는 패키지를 사용하면 중괄호나 소괄호 이런거 자동으로 해결해주고,


(add-hook 'c-mode-common-hook

          '(lambda ()

             (setq c-default-style "bsd"

  tab-width 4

  indent-tabs-mode nil 

  indent-level 4

  c-basic-offset 4)))


이렇게 하면 4칸 인덴트, 탭 없이 스페이스 인덴트,


BSD 스타일의 인덴테이션을 설정할 수 있습니다.


srefactor 라는 패키지를 사용하면


간단한 리펙토링도 제공하고,


클래스 브라우저 제공해주는 패키지도 있는데 개인적으로는 안 써봤음



하여튼 정말 많은 것들이 있으니 잘 찾아봅시다.




아 맞다 그리고 Elisp 를 포함한 Lisp 계열 언어를 사용할 때는,


Rainbow-delimiters 모드와 Smartparens 또는 paredit 을 꼭 사용합시다...





다음 편에 계속