이맥스(Emacs) 패키지 관리

이맥스 설정

개요

이맥스가 실행되면 이맥스는 초기화 파일로부터 Lisp 프로그램들을 로드합니다. 초기화 파일은 아래 세 가지 중에 하나를 선택해서 사용하면 됩니다.
~/.emacs, ~/.emacs.el, or ~/.emacs.d/init.el

패키지

이맥스 24 이후부터 패키지 설치는 거의 ELPA를 사용합니다. 기존에 직접 패키지를 다운받아서 설치하던 방식에서 패키지 매니저를 통해 패키지들을 간편하게 설치 할 수 있게 된거죠.

여기서 ELPA는 이맥스 패키지들이 올라가있는 저장소입니다. 따로 설정을 해주지 않아도 이맥스 버전 24부터는 기본으로 ELPA 패키지 저장소가 설정되어있습니다.

패키지 저장소는 ELPA외에 다른 것들도 있는데 보통 MELPA를 많이 사용합니다. 저장소를 추가로 세팅하는 방법은 아래와 같습니다.

1
2
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))

패키지 설치

M-x list-package 명령어를 입력하면 아래와 같이 패키지 목록을 볼 수 있습니다. 여기에 있는 패키지 목록이 바로 ELPA에 등록된 패키지입니다. 만약 MELPA와 같은 저장소를 위와 같은 방법으로 추가했다면 해당 저장소에 있는 패키지도 함께 보여집니다.

list of packages

패키지 로딩

load-path 변수에는 이맥스가 설치된 패키지를 로드할 때 패키지를 검색하는 디렉토리 목록이 저장됩니다. M-x describe-variable 명령어를 통해 load-path 변수의 값을 볼 수 있습니다.

사용하려고 하는 패키지가 load-path에 포함되어 있지 않으면 로딩을 실패합니다.

패키지 커스터마이징

패키지를 설치 했으면 이제 내 손맛에 맞게 커스터마이징을 합니다. 커스터마이징이라 하면 단축키, 자동 로딩 등이 있겠죠. 자동 로딩은 설치한 패키지가 이맥스가 시작 될 때 자동으로 로딩되도록 해주는 것입니다. 설치한 패키지가 필요할 때 마다 매번 패키지를 로드하는건 너무 불편하겠죠? :)

유용한 함수

함수 단축키 설명
describe-function - elisp 함수의 설명을 보여줌
describe-key - 현재 맵핑된 단축키에 대한 설명을 보여줌
describe-mode - 현재 모드의 키바인딩 목록을 볼 수 있음
describe-variable - elisp 변수에 대한 설명을 보여줌

단축키

이맥스 커맨드는 Lisp 함수입니다. 보통 소문자와 하이픈으로된 이름을 가집니다. 이맥스는 이런 커맨드를 다양한 단축키로 제공합니다. 단축키가 잘 정의되어 있고 이를 잘 사용하면 엄청난 생산성을 가질 수 있습니다. 그리고 이는 곧 사람들이 이맥스를 사용하는 가장 큰 이유가됩니다.

따라서 단축키를 익히고 커스터마이징 하는건 이맥스 사용자에게 가장 중요한 일중에 하나입니다.

키맵(Keymaps)

이맥스의 단축키는 키맵을 통해 제공됩니다. 키맵은 전역 키맵(Global keymap) XXX 키맵으로 구성됩니다. 전역 키맵은 이맥스의 기본 모드(Fundamental mode)의 키맵을 정의합니다.

이맥스의 단축키는 키(keys)와 문자(characters)로 구성됩니다. 여기서 키는 컨트롤(Ctrl), 메타(Alt or Meta), 펑션키(, , …)를 말하고 문자는 알파벳과 특수문자들을 생각하면 됩니다.

또한 이맥스에는 메이저 모드와 마이너 모드가 있는데요. 각 모드는 자신만의 키맵을 정의해서 사용할 수 있습니다.

키맵 커스터마이징

글로벌 키맵(Global Keymap)

M-x global-set-key를 이용해 글로벌 키맵의 키를 재정의 할 수 있습니다.

1
(global-set-key [f9] 'gud-break)

로컬 키맵(Local Keymaps)

미니버퍼 맵

마크다운 모드

링크 : https://jblevins.org/projects/markdown-mode/
메뉴얼 : https://leanpub.com/markdown-mode

외부 모듈로 Markdown.pl, MultiMarkdown, Pandoc 중 하나를 설치해야한다.

프리뷰 모드

마크다운 문서를 웹브라우저를 통해 바로 보려면 markdown-preview 모드를 사용하면 된다. 다만 마크다운 문서는 기본적으로 html로 변환을 거쳐야 하기 때문에 이 작업을 해줄 프로그램이 필요하다. 마크다운 모드에서는 Markdown.pl, MultiMarkdown, Pandoc 중 하나를 사용한다고 한다.

Debian 계열의 리눅스에서는 MultiMarkdown을 아래와 같이 설치 할 수 있다.

sudo apt-get install libtext-multimarkdown-perl

모드

이맥스는 다양한 편집 모드를 가집니다. 모드는 메이저 모드와 마이너 모드로 나눠집니다.

메이저 모드(Major mode)

메이저 모드는 C 소스파일과 같이 특정한 파일 타입을 편집할 때나 쉘 버퍼와 같은 특정 타입의 버퍼에 대해 동작합니다. 메이저 모드는 한번에 하나의 모드만 동작할 수 있습니다.

모든 버퍼는 하나의 메이저 모드를 가집니다. 현재 메이저 모드는 아래 그림과 같이 이맥스 창 하단에서 확인 할 수 있습니다.

mode line

가장 기본적인 최소한의 메이저 모드는 펀드멘털 모드로 불립니다. 이 모드는 특정 모드에 한정된 재정의나 변수 설정을 갖지 않기 때문에 가장 기본적인 이맥스의 상태로 동작합니다.

대부분의 메이저 모드는 세개의 메이저 그룹으로 나눌 수 있습니다. 첫 번째 그룹은 플레인 텍스트나 마크업 텍스트를 가집니다. 여기에는 텍스트 모드, HTML 모드, SGML 모드, TeX 모드, 아웃라인 모드가 있습니다. 두 번째 그룹은 프로그래밍 언어들을 포함합니다. Lisp, C, Fortran 등등의 모드를 갖습니다. 세 번째 그룹은 파일의 형식과 관련이 없는 모드들을 갖습니다. Dired, Message, Shell 모드 등입니다.

메이저 모드는 보통 이맥스에 의해 파일이나 버퍼가 생성될 때 자동으로 설정됩니다. 모드를 바꾸고 싶을때는 M-x 뒤에 -mode를 붙여서 변경할 수 있습니다. (ex> `M-x lisp-mode). 모든 버퍼는 하나의 메이저 모드를 갖기 때문에 메이저모드를 다른걸로 바꿀 수는 있어도 끌 수는 없습니다.

각 버퍼의 로컬 변수인 major-mode는 메이저 모드의 커맨드를 이름으로 갖습니다. 예를 들어 M-x lisp-mode를 통해 Lisp 메이저 모드를 선택했다면 major-mode 변수에는 list-mode가 자동으로 설정됩니다.

major-mode의 기본 값은 정해진 메이저 모드가 없는 버퍼에 대해 설정되는 모드입니다. 보퐁 이 기본 값은 fundamental-mode입니다. 이 기본 값을 변경하고 싶으면 아래와 같이 하면 됩니다.

1
(setq-default major-mode `text-mode)

만약 major-mode의 기본값이 nil이면 메이저 모드는 이전 버퍼의 모드를 따라갑니다.

특정 메이저 모드는 보통 모드에 맞게 특정 키, 사용자 옵션, 변수 등을 변경합니다. 예를 들면 보통 프로그래밍 언어 모드에서는 을 해당 언어의 가이드에 맞추어 들여쓰기 해주도록 합니다. 그리고 버퍼 로컬 변수인 comment-start를 수정하기도 합니다. 이 변수는 언어에 따른 주석의 형태를 정의합니다.

*현재 설정된 메이저 모드에 대한 문서를 보려면 M-x describe-mode를 사용합니다. 모드에 대한 자세한 설명과 키 바인딩을 모두 확인할 수 있습니다.

기본 모드를 제외한 모든 메이저 모드는 모드가 활성화 될 때마다 실행되는 커스터마이징이 가능한 List 함수의 목록을 모드 훅(mode hook)으로 정의합니다.

아래는 c++-mode의 훅입니다. 훅의 이름은 모드명-hook입니다. 또한 모든 텍스트 기반의 메이저 모드는 text-mode-hook을, 많은 수의 프로그래밍 언어 모드는 prog-mode-hook을 각각의 메이저 모드가 갖는 훅을 실행 시키기 전에 실행합니다.

1
2
3
(add-hook 'c++-mode-hook
'(lambda ()
(c-set-style "linux")))

메이저 모드의 훅은 마이너 모드의 훅들을 활성화 시키기 위해 자주 사용됩니다. 아래의 코드는 text-mode에 진입할 때 flyspell-mode 마이너 모드를 활성화 시키고 있습니다.

1
(add-hook 'text-mode-hook 'flyspell-mode)

마이너 모드(Minor mode)

마이너 모드는 내가 원할때 켜고 끌 수 있습니다. 또한 특정한 타입의 파일이나 버퍼에 구분없이 동작 할 수 있습니다. 마이너 모드는 다른 메이저 모드나 마이너 모드에 대해 독립적입니다.

버퍼 로컬 마이너 모드는 활성화 된 버퍼에서만 동작합니다. 반면 글로벌 마이너 모드는 모든 버퍼에서 동작합니다.

자동완성

설치 : https://github.com/auto-complete/auto-complete
메뉴얼 : https://github.com/auto-complete/auto-complete/blob/master/doc/manual.md

참고자료

EmacsWiki

이맥스 영문 위키 페이지입니다. 이맥스 사용자에겐 여기가 보물 창고!