이맥스(Emacs) Org 모드 - 1. 시작하기

Preview of Org mode

들어가며

Org 모드는 이맥스를 이용해 문서를 작성하거나 일정관리를 할 수 있도록 도와주는 모드입니다. 위의 그림과 같이 생각을 구조적으로 정리하고 타임스탬프를 이용해 일정을 관리할 수 있습니다.

또한 이렇게 작성된 문서는 다양한 형태의 포맷으로 변환이 가능합니다.

Org 모드의 기능은 아주 많기 때문에 이번 포스팅에서는 Org 모드의 가장 기본이 되는 요소들에 대해 먼저 알아보고 이어지는 포스팅을 통해 점차 Org 모드의 세부 기능에 대해 알아보도록 하겠습니다.

이 포스팅에 있는 내용은 대부분 Org 모드 공식 페이지의 메뉴얼과 가이드를 가지고 정리한 것으로, 자세한 내용은 공식 홈페이지를 참고하시면 됩니다.

이맥스의 Org 모드가 갖는 장점

1. 문서작성

이맥스 자체는 텍스트 편집기이기 때문에 사람이 보기 좋게 서식을 갖추어 바로 보기는 어렵습니다. 하지만 이렇게 서식을 신경쓰지 않아도 되기 때문에 문서의 외형보다는 __내용__에 집중해서 문서를 작성할 수 있도록 해줍니다.

게다가 이렇게 Org 모드를 통해 작성한 문서는 HTML, PDF, LaTeX, Markdown, OpenDocument 등 다양한 형식으로 변환이 가능하기 때문에 결국 서식에 있어서도 워드프로세서에 비해 훨씬 확장성이 크다 할 수 있습니다.

데이터와 모양(서식)을 분리한게 마치 HTML과 CSS 관계랑 비슷하죠? 또한 문서 자체가 텍스트 이기 때문에 용량도 작고 OS나 특정 워드프로세서와 같은 소프트웨어 종속적이지 않다는 장점도 가집니다.

2. 일정관리

일정 관리에 있어서도 Org 모드는 할 일 목록(ToDO), 타임스탬프, 링크, 아젠다 뷰, 달력 등을 이용해 손쉽게 일정을 관리 할 수 있는 다양한 기능을 제공합니다. 이런 기능들은 이맥스 특유의 단축키 시스템과 결합되어 사용자에게 엄청난 생산성을 가져다 줍니다.

시작하기

Org 모드는 확장자가 .org인 파일을 열면 자동으로 활성화 되는 메이저 모드입니다. 직접 Org 모드를 활성화 시키고 싶으면 M-x org-mode<RET> 키를 입력하면 됩니다.

만약 Org 모드가 설치되어 있지 않다면 아래와 같이 org 모드를 설치합니다.

M-x package-install RET org RET

헤드라인(Headlines)

Org 모드의 시작은 헤드라인과 함께 합니다. 헤드라인은 위의 스크린 샷에서 *로 시작하는 줄입니다. 헤드라인은 단락과도 비슷합니다. 들여쓰기와 *의 개수는 단락의 레벨을 나타냅니다. 헤드라인을 이용해서 __트리 구조__로 문서를 작성할 수 있습니다. M-RET를 통해 헤드라인을 추가할 수 있으며, 헤드라인이 있는 줄에서 M-방향키를 입력하면 레벨과 위치를 조절 할 수 있습니다.

1
2
3
4
5
6
7
8
* Top level headline
** Second level
*** 3rd level
some text
*** 3rd level
more text

* Another top level headline

할 일 목록(TODO Items)

헤드라인은 모두 할 일이 될 수 있습니다. 할 일이 되기 위해서는 헤드라인이 __TODO__로 시작하면 됩니다. 헤드라인에서 S-<LEFT> 또는 S-<RIGHT>를 입력하면 헤드라인 -> TODO -> DONE 세 가지 상태로 쉽게 전환할 수 있습니다.

플레인 리스트(Plain lists)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
** Lord of the Rings
My favorite scenes are (in this order)
1. The attack of the Rohirrim
2. Eowyn's fight with the witch king
+ this was already my favorite scene in the book
+ I really like Miranda Otto.
3. Peter Jackson being shot by Legolas
- on DVD only
He makes a really funny face when it happens.
But in the end, no individual scenes matter but the film as a whole.
Important actors in this film are:
- Elijah Wood :: He plays Frodo
- Sean Astin :: He plays Sam, Frodo's friend. I still remember
him very well from his role as Mikey Walsh in The Goonies.

헤드라인이 단락과 같은 역할을 한다면 플레인 리스트는 단락에서 리스트를 표현하는데 사용됩니다. 또한 플레인 리스트는 이후 설명할 체크박스(Checkboxes)에도 사용됩니다.

플레인 리스트는 크게 순서가 있는 리스트, 순서가 없는 리스트, 디스크립션 리스트로 나눌 수 있습니다.

  • 순서가 없는 리스트
    -+, *로 시작합니다. 여기서 *는 위치에 따라 헤드라인이 되기도 하고 플레인 리스트가 되기도 하기 때문에 혼동을 줄이기 위해 -+를 사용하는게 좋습니다.

  • 순서가 있는 리스트
    1. 이나 1) 처럼 숫자에 .이나 )를 붙여서 표현합니다. 만약 20과 같은 숫자로 시작하고 싶다면 [@20]과 같이 사용하면 됩니다.

  • 디스크립션 리스트
    디스크립션 리스트는 정의를 표현하기 위해 사용며 순서가 없는 리스트에 ::를 이용해서 표현합니다… 사전을 생각하면 쉬운데, ::를 기준으로 왼쪽에는 단어, 오른쪽에는 설명을 적는다고 생각하면 쉬울 것 같습니다.

플레인 리스트에서 S-<LEFT> 또는 S-<RIGHT> 키를 입력하면 리스트의 형태가 바뀌고 M-<RET>를 입력하면 새로운 플레인 리스트 아이템을 추가할 수 있습니다.

체크박스(Checkboxes)

플레인 리스트 안에 있는 아이템은 체크박스를 가질 수 있습니다. 체크박스를 사용하는건 간단합니다. 아이템의 맨 앞에 [ ]를 삽입하면 됩니다. 단축키로는 M-S-<RET>를 사용합니다.

체크박스에 체크를 하거나 체크를 해제하는건 C-c C-c 단축키를 사용합니다.

또한 체크박스가 있는 아이템의 부모는 진행 사항을 알 수 있습니다. 부모 아이템의 마지막 줄에 [/]을 넣으면 [2/4]와 같은 형태로, [%]를 넣으면 [50%]와 같은 형식으로 진행 사항을 보여줍니다.

아래는 체크박스의 예입니다.

1
2
3
4
5
6
7
8
* TODO Organize party [2/4]
- [-] call people [1/3]
- [ ] Peter
- [X] Sarah
- [ ] Sam
- [X] order food
- [ ] think about what music to play
- [X] talk to the neighbors

접기/펼치기(Folding and Expanding)

헤드라인이나 플레인 리스트는 <TAB>키를 통해 접기와 펼치기가 가능합니다.

마무리

이번 포스팅에서는 간단히 Org 모드에 대한 설명과 기본 구성요소에 대해 정리 알아 보았습니다. 다음 포스팅에서는 Org 모드를 이용한 일정관리에 대해 조금 더 자세히 알아보도록 하겠습니다.

참고자료

Org 모드 공식 페이지

Org 모드의 기능에 대한 모든 설명을 볼 수 있습니다.

이맥스(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

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