Emacs

2022년 12월 10일 수정

이맥스(Emacs)는 커스터마이징이 가능한 유명한 에디터 중 하나다. 이름의 유래는 Editor MACroS 의 약자로 에디터 매크로 모음이라고 해석할 수 있다. 실제로 이맥스 자체는 C로 구현한 Emacs Core 엔진과 이를 이용해 작성된 수 많은 Emacs Lisp 코드들로 구성되어 있다.

그런데 편집기 라기 보다는 플랫폼이나 OS, 혹은 환경에 가까운 도구이기 때문에 설정이 굉장히 난해한 편이다. 처음 시도한다면 누군가 공개한 설정을 따라하거나 혹은 Spacemacs나 Doom Emacs 같은 설정 팩을 사용하는 것도 괜찮다.

설정 팁

열어둔 파일이 외부에서 변경되면 내용 자동으로 갱신하기

(auto-revert-mode)

이 모드가 바로 원하는 역할이다.

모든 버퍼에 자동으로 적용되기 원한다면 아래 코드를 설정에 넣어보자.

(global-auto-revert-mode)

시작 시 풀스크린 모드로 만들기

(add-hook 'window-setup-hook #'toggle-frame-fullscreen)

시작 시 실행되는 훅을 활용한 예제다.

노트

멈추는 현상(freezing) 디버깅 하기

모종의 사유로 인해 Emacs 가 멈췄을 경우 SIGUSR2 신호를 주면 back-trace를 얻을 수도 있다.

macOS에서는 터미널에서 아래 커맨드를 입력하면 된다.

pkill -SIGUSR2 Emacs

리눅스에서는 대소문자 정도만 좀 다를 것 같다.

위의 방법 외에도 debug-on-quit 값을 non-nil 로 세팅해둔 상태에서는 C-g (Exit) 키가 눌릴 때 마다 현재 동작 중인 코드가 break 걸린다. 이렇게 해서 back-trace를 얻을 수 있기도 하다.

이것도 안 통하면 대체로 C 코드로 작성된 코어 부분의 무한 루프 가능성이 크다. 이럴 때는 그냥 pkill로 프로세스를 죽여버리는 것이 나은 결과를 보일 때도 있다.

pkill Emacs

이 경우 정확한 트레이스를 얻기는 힘들지도 모르지만 크래시 상태에서 빠져나올 수도 있다.

터미널에서 트루컬러 이맥스 사용하기

iTerm2 같은 트루컬러를 지원하는 터미널에서 테마 색상을 제대로 지원하기 위해서 약간의 트윅이 필요하다. 참고로 이 트윅은 macOS에서 확인해봤다.

우선 xterm-24bit.terminfo 라는 파일을 만들고 아래 내용을 붙여 넣는다.

xterm-24bit|xterm with 24-bit direct color mode,
   use=xterm-256color,
   sitm=\E[3m,
   ritm=\E[23m,
   setb24=\E[48;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%dm,
   setf24=\E[38;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%dm,

그 다음 터미널에서 아래 커맨드를 입력한다.

tic -x -o ~/.terminfo xterm-24bit.terminfo

이제 xterm-24bit 라는 터미널 모드를 사용할 수 있다. 아래의 커맨드로 현재 의 터미널 타입을 바꿀 수 있다.

export TERM="xterm-24bit"

이후 emacs -nw 커맨드로 터미널에서 이맥스를 실행시켜서 확인해보자. 참고로 -nw 옵션은 이맥스를 터미널에서 돌릴 수 있게 해주는 옵션이다.

잘 동작한다면 위 내용을 .zshrc.bashrc 같은 초기화 스크립트에 넣는 식으로 적절히 설정해보자.

다만, 특정 터미널 도구에서 24bit 색상 모드는 문제가 발생하는 경우가 있다. 이럴 때는 트루컬러를 사용할 소프트웨어에만 위 터미널 모드를 적용하도록 하는 방법이 있습니다. 예를 들어 emacs 에 트루컬러 모드를 적용하기 위해 아래 alias 를 만들 수도 있다.

alias emacs="TERM=xterm-24bit /usr/local/bin/emacs"

이렇게 하면 이 alias가 적용된 셸에서 emacs 커맨드는 항상 트루컬러 모드로 동작하게 된다. 물론 emacs의 경로는 자신의 상황에 맞게 정확하게 입력해야 한다.

Tmux 안의 이맥스에서 트루컬러 사용하기

Tmux 안에서 기동시킬 경우 색상이 이상하게 표시될 수 있다. 이 경우 아마도 Tmux가 사용하는 screen-256 이라는 터미널 타입의 문제로 추측된다. 이 경우도 위와 비슷한 방법으로 해결할 수도 있다.

우선 tmux 설정에 아래 내용을 추가합니다.

set -ga terminal-overrides ",st-256color:Tc"

이후 tmux 를 재시작 하거나 위 설정을 따로 불러들이도록 한다.

다음으로 아래 내용을 screen-24bit.terminfo 라는 파일로 작성한다.

# From [[info:efaq#Colors%20on%20a%20TTY][Colors on a TTY]]
# Use colon separators.
screen-24bit|screen with 24-bit direct color mode,
  use=screen-256color,
  setb24=\E[48:2:%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%dm,
  setf24=\E[38:2:%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%dm,
# Use semicolon separators.
screen-24bits|screen with 24-bit direct color mode,
  use=screen-256color,
  setb24=\E[48;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%dm,
  setf24=\E[38;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%dm,

그리고 위에서 작성한 파일이 있는 디렉토리에서 아래 커맨드를 실행한다.

tic -x screen-24bit.terminfo

이제 screen-24bit 라는 터미널 타입이 생겼다. emacs 를 아래 커맨드로 실행시켜 보자.

TERM=screen-24bit emacs -nw

잘 된다면 이제 나머지는 원하는 대로 설정하는 것 뿐이다.

CRLF to LF

요즘은 별로 그럴 일은 없겠지만, 개행문자가 DOS 파일 타입(CRLF)과 UNIX 파일 타입(LF)은 차이가 있기 때문에 이를 변환하는 방법이 정말 간혹 필요하다.

이를 변환하려면 file coding system을 바꿔주면 된다.

M-x set-buffer-file-coding-system

이러면 타입을 물어오는데 LF를 쓰고 싶다면 utf-8-unix 를, CRLF를 쓰고 싶다면 utf-8-dos 를 선택해주면 된다.

셸에서 이맥스 스크립트 실행시키기

특정 Emacs Lisp의 특정 함수 하나를 에서 실행하고 싶은 경우

emacs -e 'function'

커맨드로 실행시킬 수 있는데, 에 따라 괄호를 쓰면 이스케이프 되는 경우도 있어서 인자가 없는 함수 하나를 실행시킬 경우에만 유용했다.

순수하게 Emacs Lisp 스크립트 파일만 실행시키고 싶다면

emacs --script FILE

이런 명령으로 실행시킬 수 있는데, 이 명령의 특징은 -q 옵션을 사용한 것과 비슷하게 모든 site 파일과 설정을 읽어 들이지 않은 매우 순수한 상태에서 동작한다는 점이다. 따라서 실행시키려는 스크립트에서 개인 설정 내용이 필요하다면 쓰기엔 힘든 커맨드다.

만약 개인 설정을 읽어들인 상태로 스크립트를 실행하고 싶다면

emacs --load FILE

이런 커맨드를 사용할 수 있다. 이 커맨드는 Emacs가 시작하면서 실행되기 때문에 테마 로딩을 제외한 거의 모든 환경이 로딩 된 상태로 돌아간다는 특징이 있지만, 인터페이스가 뜨기 때문에 커맨드로 보기엔 무리가 있는 것 같다.

--load 커맨드로 스크립트를 실행시키고 Emacs를 자동으로 종료시키고 싶다면 kill-emacs 함수를 적절히 이용하는 방법이 있긴 하다.

(progn
  (do-something)
  (do-blah-blah)
  (kill-emacs))

이런 식의 스크립트를 돌리면 스크립트가 다 실행된 후 Emacs가 종료된다.

퍼포먼스 프로파일

아래 명령으로 프로파일러를 시작할 수 있다.

M-x profiler-start

그리고 이후 아래 명령으로 리포트를 볼 수 있다.

M-x profiler-report

다 끝난 후 프로파일러 종료를 잊지 말자.

M-x profiler-stop

메시지 버퍼 지우기

*Messages* 버퍼는 콘솔 용도로 여러 메시지가 표시되는 버퍼다. 그런데 모종의 사유로, 예를 들어 개인적으로 개발 중인 코드가 출력하는 메시지를 좀 더 깔끔하게 보고 싶어서 이 버퍼의 내용을 지우고 싶을 때가 있을 것이다. 하지만 이 버퍼는 read-only라 수동으로 삭제도 안 된다. 어떻게 해야 할까?

답은 간단하다. 그냥 이 버퍼 자체를 지워버리면 된다. kill-buffer 함수를 호출하거나 Doom Emacs의 경우라면 SPC b k 단축키로 날려버릴 수 있다.

그리고 새로운 메시지가 생기면 자동으로 *Messages* 버퍼가 새로 생긴다.

외부 링크

기타(Etc)