User Tools

Site Tools


tips:emacstech:ch1

1.1 커맨드 | 이맥스에게 명령하다

이맥스의 많은 명령들은 이맥스 리습으로 쓰여진 함수다. 앞으로 이맥스 리습을 배우게 되면 자유롭게 자신만의 커맨드를 정의할수 있다.

해설

이맥스는 텍스트 에디터이기 때문에 유저로부터 입력을 기다리고 있다. 유저가 무언가 입력하면 그 키에 대응하는 커맨드가 실행된다.
예를 들어 C-n을 누르면 다음 행으로 포인터(커서)가 이동한다. 그때 next-line이란 커맨드가 실행된다.

커맨드의 다수는 이맥스 리습으로 쓰여진 함수

이 사실을 실제로 확인해 보자. <F1> k (describe-key)로 키에 대응하는 커맨드를 조사할수 있다.
“Describe-key (or click or menu item):“라는 프롬프트가 나오면 C-n을 입력한다. 그럼 *Help*라는 버퍼가 생기고 “next-line is an interactive compiled Lisp function in 파일명”라고 첫줄에 쓰여져 있다.
Lisp function이라고 쓰여져 있기 때문에 C-n의 정체는 이맥스 리습으로 쓰여진 함수(일련의 처리를 기술한 것)라고 알수 있다.
커맨드를 실행하는 것은 함수를 실행하는 것이다. 그리고 다수의 커맨드가 이맥스 리습으로 쓰여진 함수다.
이맥스 리습은 이맥스의 세계를 기술하고 있는 것이다.

커맨드명(함수명)을 지정하고 커맨드를 실행한다.

next-line은 매우 빈번하게 사용되는 커맨드기 때문에 실행하기 쉽게 키에 할당되어 있다. GUI환경에서 이른바 “키보드 shortcut”이지만 이맥스는 애초 키보드 환경이 당연하기 때문에 그런표현을 사용하지 않는다. 그러나 이맥스 기동직후의 상태에서 2000이상의 커맨드가 있기 때문에 어쨋든 키보드에 할당된 커맨드는 제한되어 있다. 그래서 커맨드명을 지정하고 커맨드를 실행하는 방법이 필요해진다.
M-x를 누르면 미니버퍼에 M-x라는 프롬프트가 나온다. 그곳에 커맨드를 입력하면 커맨드를 실행한다. 조금전의 next-line커맨드를 M-x부터 실행해보자. M-x nex까지 입력하고 TAB이나 C-i를 입력해보자.
nex부터 시작하는 커맨드는 전부 next- 부터 시작하기 때문에 t-가 보완된다. 보완기능은 이맥스의 조작에 있어 매우 중요하기 때문에 C-i를 누르는 습관을 가져보자. 이후 line이라고 입력하고 RET(Enter)를 입력한다. next-line 커맨드가 실행되고 다음 행으로 포인터가 진행할 것이다. 커맨드는 “M-x 커맨드명”으로 쓰는 관습이다. 이 책에서도 이 방식을 따른다.
짧은 커맨드라면 몰라도, 일일이 긴 커맨드명을 일일이 기억하는 것은 어렵다. 사람이기 때문에 좀처럼 사용하지 않는 커맨드는 잊어버린다. 필요한 때에 커맨드를 제시한다던지 커맨드명으로 검색해서 실행하는 방법에 대해서는 15장에서 해설한다.

1.2 S식 | 이맥스 리습의 구성요소를 알다

이맥스 리습의 구성요소는 모두 S식이다. 이맥스 리습은 보통 심볼구조를 하고 있다고 이해한다.

해설

이맥스 리습 프로그램은 S식의 집합이다. S식은 한뭉텅이의 식이다.
S식의 대표적인 것으로는
- 수식, 문자열, 심볼
- 콘스셀, 리스트

이 있다. 후술하겠지만 콘스셀이라는 것은 “수식, 문자열, 심볼”을 쌍으로 하는 것으로 리스트라는 것은 콘스셀을 엮은 것이다. ()의 가운데 요소를 적는다.
실제로는 S식은 리스트를 가르키는 것이 대부분이다. 그래서 괄호에 둘러싸인 것들이 S식이라고 생각해도 상관없다.
이맥스에서는 손으로 움직이는 것으로 S식을 간단하게 이해 할수 있다. *scratch*버퍼에서 C-M-f와 C-M-b를 누르면 전후의 S식으로 점프할 수 있다.
이하의 내용을 쳐 넣고 C-M-b로 돌아와 보자. 개행을 포함한 문자열과 리스트를 뛰어넘는다.

1 3.1415 "string"
"a
string
with newline"
symbol
(1 . "a")
(1
 2
 3
 (4))

리스트는 S식이지만 리스트의 알맹이는 역시 S식이다. 괄호안에 들어가서 C-M-f와 C-M-b를 누르면 그것을 알 수 있다.

((1 (2) (3 (4 5 6))) 7)

수식, 문자열, 심볼

이맥스 리습의 수식은 보통의 표기법으로 쓸 수 있다.
0과 99는 정수형이다. -268435456부터 268435455까지의 정수를 표현할수 있다. 0.1과 0.5는 부동소수점이다.

문자열은 “로 묶는다. “abc”는 abc라고 하는 내용의 문자열이다. 문자열내의 \은 특별한 의미를 가지고 있다. \n은 개행문자, \”은 “을, \\은 \을 나타낸다.
다른것도 여러가지 백슬래쉬 표기법이 있지만 설정에서 필요한 최소한의 지식은 그정도다.

심볼이라는 것은 일의적(一意)인 이름이다. abc, find-file, 1+, /는 무엇이든 심볼이다. 심볼로 식을 세트하는 것으로 심볼을 변수로 하는 것이 가능하다.
다만 t(참의 대표식)과 nil(거짓의 대표식)은 진위식을 표현하는 특별한 심볼이기 때문에 식을 세트하는 것이 불가능하다.

콘스셀과 리스트

콘스셀은 S식의 쌍이다. 요소간에 도트를 붙여, 괄호로 묶어서 표기한다. 예를들어 1과 3으로 만든 콘스셀은 ”(1 . 3)“이 된다. 역사적인 이유로 좌측은 car, 우측은 cdr이라고 말한다.
콘스셀은 이맥스 리습에 있어 기본적인 데이터 구조다. 콘스셀을 도시하면 두개조의 상자가 된다.

           +---+---+
 (1 . 3)   | 1 | 3 |
           +---+---+

car과 cdr로 콘스셀로의 참조를 하는 것도 물론 가능하다. 특히 cdr로 콘스셀을 붙여서 길게 이어진 데이터 구조를 말한다.
유한의 길이의 리스트의 마지막 cdr은 nil이다. 예를 들어 1,2,3으로된 리스트는 ”(1 . (2 . (3 . nil)))“이 된다. 리스트는 항상 사용되기 위해 (1 2 3)이란 생략기법을 사용한다.
리스트는 메인이 되는 데이터 구조다. 리습이라는 것은 LISt Processor의 약자로 리스트를 능숙하게 처리한다.

           +---+---+    +---+---+    +---+---+
(1 2 3)    | 1 |  -+--->| 2 |  -+--->| 3 |nil|
           +---+---+    +---+---+    +---+---+

cdr이 nil인 콘스셀은 1요소의 리스트다. 바꿔말하면 (1 . nil)과 (1)은 등가다.

1.3 평가 | 이맥스 리습 프로그램을 실행하다

이맥스 리습 프로그램은 S식을 평가하는 것으로 실행된다. 보통 사용하고 있는 커맨드의 구조를 알게 된다.

해설

이맥스 리습은 S식의 집합체라고 기술하였다. 프로그램으로 동작시키기 위해 S식을 평가한다. 평가하는 것을 목적으로 하는 S식을 폼이라고 한다.

수식, 문자열, 심볼, 리스트의 평가방법

수식과 문자열을 평가하면 그것 자신을 반환한다.
심볼을 평가하면 그 심볼에 할당되어진 변수의 식을 반환한다. 결국 심볼을 변수명으로 해석한다.
리스트의 평가방법은 리스트의 첫 요소에 따라 결정된다. 리스트의 첫 요소가 이름이고 심볼만 받아들인다. 남은 요소는 인수다. 이름이 함수명인 경우 그 리스트는 함수로 해석된다.
그 외의 경우는 스페셜 폼이던지 매크로로 해석된다. 두가지는 비슷한 것이기 때문에 매크로는 유저정의의 스페셜 폼으로 생각해도 상관없다.

함수의 평가방법

함수는 모든 인수가 평가된 후에 함수본체를 실행한다. 아래는 10-3+1을 이맥스 리습으로 계산하는 예이다. 사직연산은 함수다.

(+ (- 10 3) 1)
-> (+ 7 1)     (- 10 3)이 평가된다.
-> 8

스페셜 폼, 매크로의 평가방법

스페셜 폼과 매크로의 인수의 평가방법은 독자적으로 결정된다. setq는 변수(심볼)에 식을 대입하는 스페셜 폼으로 제 1인수는 평가하지 않고 제 2인수를 평가한다. 아래의 내용을 평가하면 a의 식은 7이 된다. 만약 setq가 함수면 심볼 a가 평가되고 a의 식이 넘겨져 버린다.

(setq a (+ 3 4))

리스트와 심볼을 그대로 넘기는 방법

리스트와 심볼의 평가를 억제하는 데는 '을 전치시킨다. 그것으로 인수의 리스트와 심볼을 데이터로 넘기는 것이 가능하다. set은 setq의 함수형으로 전술한 예와 같은 효과다. 이것으로 '을 떼면 변수 a가 격납되어 있는 심볼에 식이 대입된다.

(set 'a (+ 3 4))

커맨드와 S식의 관계

커맨드를 실행한다고 하는 것은 내부에서 ”(call-interactively '커맨드명)” 이라는 S식을 평가하는 것이다. 이맥스내에서 모든 행동은 내부에서 S식의 평가가 이루어 지고 있다.

보충

스페셜 폼과 매크로는 적다.

리스트를 평가하면 함수와 그 외의 것으로 나눌수 있지만 한눈에 봐선 분류하기 어렵다. 그러나 실제로는 대략 함수로 생각해도 상관없다. 왜냐면 이맥스 기동시에는 함수가 5500이상에 대해 스페셜폼이 약 30개 매크로가 100개 밖에 없다. 스페셜 폼은 적기때문에 하나씩 기억해 나가는 수 밖에 없다. if나 while등 기본적인 제어구조가 되는 것은 대체로 스페셜 폼이다. 일부 매크로로 정의되어 있는 제어구조도 있다. 매크로는 한개씩 기억해 나가기에는 너무 많지만 명령법에 경향이 있다. with-나 def가 포함된 것은 대체로 매크로다. 전자는 조건을 변경하는 폼을 평가하는 것이다. 후자는 새로운 함수나 데이터 구조등을 정의하는 것이다. 예를 들어, with-current-buffer 매크로는 현재 버퍼(편집 대상 버퍼)를 일시적으로 변경하는 폼을 평가한다. define-minor-mode 매크로는 마이너 모드를 정의한다.

1.4 함수 | 전치 표기법을 알다

전치 표기법은 리습의 독특한 함수호출 표기방법으로 유연성의 근원이다. 평가의 흐름이 명확해지는 장점이 있다.

해설

수학과 많은 프로그래밍언어에서 함수는 “함수명 (인수 인수 …)“이라는 표기를 사용하지만 리습에서는 ”(함수명 인수 인수…)“이라는 전치 표기법으로 표기한다. 사칙연산의 연산자도 함수가 된다. 다만 인수는 언제라도 취할수 있기때문에 같은 연산을 하는 경우는 연산자를 한번만 써도 된다.
예를 들어, “1+2+3”은 ”(+ 1 2 3)“이 된다. 통상 수학에서 사용되는 표기를 중치 표기법이라고 말한다.
함수도 연산자도 모두 전치 표기법을 사용하고 우선순위문제에 대해서 생각할 필요가 없어진다. 사칙연산의 우선순위는 상식이지만 C언어등에서 비트연산은 “비트 and”가 “비트 or”보다도 우선순위가 높다는 것을 알고 있을 필요가 있다.
표 1에 보듯이 전치 표기법을 사용하면 평가의 순서가 명확해 진다.

<표1>

중치 표기법 전치 표기법
1+2*3 (+ 1 (* 2 3))
1*2+3 (+ (* 1 2) 3)
7 | 8 & 9 (| 7 (& 8 9))

전치 표기법에 대해서 익숙해지는 수 밖에 없다. 그러나 함수 호출이 한개의 덩어리라고 간주할 수 있다고 알게 되면 전치 표기법의 이점이 보이게 된다. 전치 표기법이 리습의 유연성의 근원이다.
1-15에서 전치표기법의 또 다른 장점을 알게 될 것이라고 생각한다.

1.5 M-x ielm | 리습식(S식)을 대화적으로 평가한다.

지금까지의 절에서 이맥스 리습의 평가의 구조를 알아봤다. 이제 실제로 평가해 보자.

해설

이맥스 리습의 코드는 모두 식을 가지고 있다. 다시 말하면 이맥스 리습의 코드를 평가하면 무엇인가 결과가 반환된다. 여기에서 평가하는 두가지 방법을 소개한다.

ielm 커맨드로 대화적으로 이맥스 리습식을 평가한다.

M-x ielm으로 이맥스 리습식을 대화적으로 평가하는 것이 가능하다. ELISP>이라는 프롬프트가 나오기 때문에 Emacs Lisp식을 입력하라.
RET를 누르면 이맥스 리습식이 평가(실행) 된다. 식이 완결될때까지 평가되지 않기 때문에 복수행으로 나눠서 입력하는 것도 가능하다.
또, TAB이나 C-i를 누르면 함수명을 보완하는 것도 가능하다.

M-: 로 언제든지 어디서든 이맥스 리습식을 평가한다.

M-: 을 누르면 그 장소에서 이맥스 리습을 평가하는 것이 가능하다. 미니버퍼에 이맥스 식을 입력하면 결과가 나온다. 좀 전에 했던 계산을 위해 ielm을 시작하는 것이 귀찮은 경우는 이 방법을 추천한다. M-TAB또는 C-M-i로 보완하는 것도 가능하다.

보충

ielm 이라는 것은

ielm 이라는 것은 Interactive Emacs Lisp Mode의 줄임말이다. 쉘과 같은 대화적 인터페이스에서 입력된 이맥스 리습식의 평가결과를 표시한다.

*scratch* 버퍼에서 평가한다.

예전 부터 잘 알려진 이맥스 리습 평가방법으로 *scratch* 버퍼에 식의 뒤에서 C-j 를 누르는 방법이 있다. 그러나 입력된 식인지 입력결과인지 구별이 쉽지 않은 헛점이 있다.

1.6 .emacs | 이맥스 기동시에 자동으로 읽어들이는 파일을 작성한다

이맥스 기동시에 평가하기를 원하는 이맥스 리습을 초기화 파일에 기술한다. 그것에 따라 이맥스의 세계에 무수히 존재하는 이맥스 리습 프로그램을 사용할 수 있게 된다.

해설

느닷없이 까다로운 설명이 계속되었지만 그 목적은 “이맥스의 개선”에 있다. 이맥스를 개선하기 위해서는 여러가지 설정할 필요가 있다. 설정에는 이맥스 리습을 사용한다. 그를 위해 배경지식이 조금이라도 있다면 설정의 의미를 이해할 수 있고 개선이 쉬워진다. 이 절에서부터 실용적인 내용에 들어가 보자.
이맥스를 설정하는데는 전통적으로 ”~/.emacs”라는 초기화 화일에 이맥스 리습을 적는다. 홈디렉토리에 있는 ”.emacs“라는 파일이다. 그 파일은 이맥스 기동시에 읽혀진다.
현재는 ”~/.emacs.el“과 ”~/.emacs.d/init.el“도 초기화 파일로 사용할 수 있다. 이 파일들을 사용하는 이점은 바이트 컴파일로 기동을 고속화 하는 것이 가능하다. 초기화 파일은 뭐든지 한개만 읽혀지고 우선순위는 ”~/.emacs.el > ~/.emacs > ~/.emacs.d/init.el“이다.
초기화 파일을 분할하는 경우는 ”~/.emacs.d/init.el“을 초기화 파일로 하면 정리된다. 또한 3개의 초기화 파일안에 어떤 것을 사용해도 상관없다. 여기에서는 일관되게 .emacs로 표기한다.

보충

바이트 컴파일이라는 것은 이맥스 리습 소스파일을 내부형식으로 변환하는 것이다. 자세한 것은 byte-compile-file(1.8)을 참고하라.

1.7 require | 이맥스 리습 파일을 로드한다

1.8 M-x byte-compile-file | 이맥스 리습 파일을 바이트 컴파일 한다

1.9 auto-async-byte-compile.el | 자동바이트 컴파일을 한다

1.10 M-x list-load-path-shadows | load-path 우선순위문제를 해결한다

1.11 M-; | 커맨트를 처리한다

tips/emacstech/ch1.txt · Last modified: 2019/02/04 14:26 (external edit)