"이맥스는 사용자와 함께 진화하는 에디터다"
- 야이미친
<이맥스 개종 가이드>
아 슬슬 힘들어진다
이번 화는 이제 본격적으로 프로그래밍에 도움이 되는 얘기를 하겠습니다..
일단 이맥스에는 메이저모드랑 마이너모드라는게 있음
어떤 파일을 열었을 때 그 순간 이맥스는 단 하나의 메이저 모드를 가질 수가 있음
그리고 여러개의 마이너 모드를 가질 수가 있음
이게 뭔 얘기냐하면,
.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
그 다음에 설정 코드 작성
딱 이 정도
맨 위에 두 줄은 정말 처음에 해주는거고,
그 뒤부터는 새로운 언어를 위한 환경을 구축해줘야 될 때 나머지처럼 프론트엔드만 다운 받으면 됨
저 이상한 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 을 꼭 사용합시다...
다음 편에 계속
댓글 1