2014-01-20 7 views
1

우선, 나는 Emacs와 ELisp (그리고 일반적으로 Lisp에 관한 것)의 완전한 초보자라는 것을 인정하고, 나는 비틀 거렸다 내 .emacs 파일을 쓰려고 할 때 꽤 오랫동안 저주를 받았다. 여기 Emacs : Emacs23에서는 잘못된 타입의 인수 오류가 있지만, Emacs24에서는 그렇지 않다.

문제를 재현하기 위해 필요한 코드의 최소 예 (즉 이맥스 다음 만 함유 갖는)

(defun define-esc-key (keybind) 
    (define-key key-translation-map (kbd keybind) 'my-esc)) 
(define-esc-key "M-j") 

이 Emacs23 다음과 같은 오류가 발생한다 :

Lisp error: (wrong-type-argument integer-or-marker-p keybind) 
    read-kbd-macro(keybind) 
    #[(keys) "\301!\207" [keys read-kbd-macro] 2 2186954](keybind) 
    (kbd keybind) 
    (define-key key-translation-map (kbd keybind) (quote my-esc)) 
    define-esc-key("M-j") 

Emacs24에서 예상대로 작동합니다. define-esc-key 함수 본문에있는 keybind의 인스턴스를 "M-j"으로 바꾸면 이멕스 23에서도 작동합니다.

(그런데, 나쁜 제목 미안하지만, 난 그냥 더 자세한 설명 아무것도 생각하지 못했습니다.)이 NEWS 파일에서

+0

Esc 키는 일반적으로 키보드 단축키 시퀀스의 일련의 다른 키를 앞에 접두사 단축키로 사용됩니다

다른 방법으로는 값을 삽입 eval 및 역 인용 부호를 사용할 수 있습니다. 이스케이프 접두사 키를 사용하지 않으려 고합니다. 즉, 자신의 함수 'my-esc'를 시작하는 것뿐입니다. 이스케이프 키를'indent-new-comment-line'으로 바꾸길 원합니까? 그렇지 않다면 어떤 특정 기능을 눌렀을 때 이스케이프 키를 실행 하시겠습니까? – lawlist

+0

이스케이프 키의 유용성을 키보드 단축키 접두어로 사용하지 않으려는 경우 이스케이프 키가 한 가지만 수행하므로 다음과 같이 할 수 있습니다.'(global-set-key (kbd "") '들여 쓰기 - 새로운 코멘트 라인)'. 그러나 더 나은 접근법은 'elisp'을 조금 배우고이 스레드에서 'Stefan'이 작성한 약간 더 복잡한 코드를 이용하는 몇 가지 조건을 만드는 것입니다 : http://stackoverflow.com/questions/20026083/ 사용법 - 이스케이프 - 조건부 - 변경자 - 키 또는 이스케이프 키를 접두어 키처럼 정상적으로 유지하십시오. – lawlist

+0

@lawlist : 이스케이프 키에 대해 언급하는 이유가 확실하지 않지만 'Mj'("메타 j"?)의 이상한 리 바인딩에 대해 이야기하고 있다면, 나는 오랫동안 확신을 가지고있는 Vim 사용자이기 때문입니다. 스크립팅 기능과 "Evil"Vi 에뮬레이션 모드를 위해 Emacs로 전환 할 수 있습니다. 나는 Alt + j/k/l/m/o/I/O/...를 사용하여 vim을 실행하는 터미널에서 삽입 모드에서 (정상 모드로 전환하기 위해 하드를 사용하는 대신 이스케이프 키로 전환) 이것을 악마와 복제하십시오. – mwnx

답변

1

는 :

* Lisp Changes in Emacs 24.3 
... 
*** `kbd' is now a function rather than a macro. 

즉, 그 이전 이맥스 버전 , 귀하의 예제에서 변수를 사용하는 것과는 반대로 kbd에 대한 인수가 문자 그대로 통화에 있어야합니다.

(eval `(kbd ,keybind))