2011년 5월 20일 금요일

[Emacs] autopair 사용 시 term-mode 문제

Emacs에서 term-mode(M-x term) 혹은 multi-term-mode를 사용 할 때 엔터키를 누르면 미니버퍼에 오류가 찍히면서 엔터키가 먹히지 않는 경우가 발생했다.

이 문제는 autopair를 사용할 때만 발생하는 것으로 생각된다. 혹은 그 외에 RET(엔터키)를 별도의 기능으로 바인딩 하는 모든 모드에 대해서도 발생할 수도 있다. autopair일 경우의 해결 방법은 가장 마지막에 제시하고 있다.

아래 삽질기를 정리해 본다.

문제점


term-mode 시 RET가 동작하지 않는다. 미니버퍼에 invalid characterp, return 이런 식의 오류메시지가 찍힌다. RET 혹은 여기에 바인드 된 무언가가 nil 상태일거 같다는 느낌이 들었다.

대안


다행히도 C-j키를 이용하면 RET키를 대체할 수 있었다. 임시방편으로 활용 가능하긴 하다.

원인 분석


term-mode에서 C-h k를 이용해 RET키에 바인딩 된 함수를 확인: autopair의 특정 함수가 바인드 되어 있는 것을 확인하였다.

결과적으로 autopair가 범인임을 확신할 수 있었다.

문제 해결 시도


term-mode에서 C-h k를 이용해 C-j에 바인딩 된 함수를 확인: term-send-raw가 바인딩 되어 있다.

결론적으로 RET키에 term-send-raw를 바인딩 시키면 문제가 해결되리라 믿고 define-key함수를 이용해 term-mode-map에 RET키를 term-send-raw 를 바인딩 하려 시도했다.

하지만 코드에서 오류가 발생하였다. 뭔가 허용되지 않은 듯한 짓을 하는 기분이 들었다.

문제 해결


아래 코드 한... 아니 두 줄로 해결할 수 있었다.
(add-hook 'term-mode-hook
          #'(lambda () (setq autopair-dont-activate t)))

출처: http://emacs-fu.blogspot.com/2010_06_01_archive.html

댓글 없음 :