외부 에디터로 EmacsW32를 등록하여 사용할 때, 파일마다 별도의 emacs 창이 뜨는 것을 방지하기 위하여 emacsclient (혹은 emacsclientw)를 통하여 emacs를 실행하게 된다.
이 경우 파일을 편집한 후, 해당 버퍼를 닫으려고 할 때, 다음과 같은 메세지를 보게 된다.
Buffer 'xxxxx' still has client; kill it?
이 메세지가 나타나는 이유는 명령 프롬프트를 통해 emacsclient를 실행해보면 알 수 있는데, 명령 프롬프트 상에서 다음과 같이 emacsclient를 실행해보자.
emacsclient myfile
emacs를 통해 파일이 열리지만, 프로그램이 계속 실행중이며 프롬프트가 돌아오지 않는다. 해당 버퍼가 닫히고 나서야 비로소 프롬프트가 돌아온다.
emacsclient --help라고 입력하면, 실행 옵션 중에 다음과 같은 옵션이 있다.
-n, --no-wait Don't wait for the server to return
이 옵션을 사용하여 아래와 같이 실행했을 때는 파일이 열리는 동시에 프롬프트가 돌아오는 것을 확인할 수 있다.
emacsclient -n myfile
따라서 위의 메세지를 방지하기 위해서는 외부 에디터로 emacs를 등록할 시에는 아래와 같이 -n 옵션을 적용하여 등록하도록 하자.
* 주의사항 *
특수한 경우에는 이 옵션을 사용하지 말아야 할 수도 있다. 예를 들어 에디터를 실행한 곳에서 편집이 끝나기를 기다려야 하는 경우.
또 다른 방법
.emacs 파일에 다음 초기화 구문을 추가해주는 방법이 있다.
(eval-after-load "server" '(defalias 'server-kill-buffer-query-function '(lambda () t)))
server-kill-buffer-query-function은 위의 물어보는 팝업을 표시하는 역할을 하는 함수인데,
아래와 같은 구문을 실행하면 이 함수를 빈 lambda(익명) 함수로 재정의한다.
(defalias 'server-kill-buffer-query-function '(lambda () t))
하지만 이 구문 그대로 .emacs 파일에 추가할 경우, 원래의 server-kill-buffer-query-function 함수를 정의하는
server.el 파일이 .emacs 보다 뒤에 실행되어서 의도했던 결과가 나오지 않는다.
(eval-after-load "server" ...) 구문을 사용하면 ... 부분이 server.el이 실행된 이후에 실행되도록 할 수 있다.
따라서 최종적으로 아래 초기화 구문을 사용하여 우리가 원하는 결과를 얻을 수 있다.
(eval-after-load "server" '(defalias 'server-kill-buffer-query-function '(lambda () t)))
단, 이 방법을 사용하면 팝업은 안 뜨지만 emacsclient를 실행한 client측은 파일이 닫힐 때까지 대기 상태로 남아있게 된다.
<테스트 환경>
OS : Windows 7 (32bit)
Emacs 버전 : EmacsW32 1.58-091103 patched (Emacs-23-CvsP091103-EmacsW32-1.58.exe)