본문 바로가기

Editor/Emacs

Emacs 의 주모드 (한글)

모든 이맥스의 주모드에는 코드를 추가할 수 있도록 하는 "훅(hook)"이 있으며, 모드 훅 (mode-hooks)이라고 한다. 
모든 이맥스 내부의 주모드에는 mode-name-hook 이라는 모드 훅이 있으며, mode-name 은 모드나 함수명을 의미한다. 예를 들어 C모드는 c-mode-hook을, 쉘 모드는 shell-mode-hook 을 갖는다.

훅이란 무엇인가? 이것은 모드가 실행될 때 사용되는 LIsP 코드의 일부를 담고 있는 변수이다. 모드를 실행하면 일반적으로 다양한 작업을 하는 LISP 함수가 실행된다. (예를 들어 특별한 명령을 위한 키바인딩을 설정하거나 버퍼나 지역 변수 등을 생성하는 일 등) 모드를 실행하는 함수가 마지막으로 하는 일은 모드 훅의 실행이다. 

앞에서 LISP 코드를 LISP 변수값으로도 사용하는 것을 보았다. 이것은 훅을 생성할 때 편리하다. lambda는 함수를 정의하기 위해 사용하는 defun과 매우 유사하며, 이름이 없는 함수 (LISP 용어로는 "무명함수(anonymous function)")를 정의하는 점이 다르다.
lambda의 형식은 다음과 같다.

(lambda (args)
code)

args는 함수의 인자이며, code는 함수의 내용에 해당한다. lambda 함수를 변수값으로 지정하려면 함수의 실행을 막기 위해 "인용"의 형태를 사용할 필요가 있다. 즉 다음과 같은 형태로 사용한다.
(setq var-name
'(lambda ()
code))

모드 훅에 대한 코드를 작성하려면 다음과 같은 형태를 이용한다.

(setq mode-name-hook
'(lambda ()
code for mode hook))

그러나 커스터마이징하고자 하는 모드에 이미 정의된 훅이 있을 수 있다.
setq 형태를 사용하면 기존에 정의된 훅이 무엇이든지 덮어쓴다. 이것을 피하려면 대신 add-hook 함수를 사용한다.

(add-hook 'mode-name-hook
'(lambda ()
code for mode hook))