2010-01-27 5 views
4

저는 Colemak 키보드 레이아웃을 사용하고 있으며 Vimp 레이아웃을 here에서 Vimpulse로 시도하려고합니다. 그러나 레이아웃은 명령 접두어 Vim 키 'c'와 'd'를 다른 것으로 다시 매핑하며 이러한 키는 표준 Viper 키 다시 매핑 명령으로 쉽게 다시 매핑 할 수없는 것처럼 보입니다. 그것들은 모두 바이퍼 키맵의 "viper-command-argument"에 매핑되며, 실제 키 기능은 바이퍼 소스의 다른 곳에서 정의 된 것처럼 보입니다.Emacs 바이퍼 모드에서 'c', 'd'등의 접두사 키를 다시 매핑 할 수 있습니까

바이퍼 소스의 로컬 복사본을 포킹하고 그 내부에있는 마술 접두어 키 값을 다시 정의하는 것보다 다른 방법으로 프리픽스 명령을 다시 바인딩하는 쉬운 방법이 있습니까?

답변

1

Evil-mode은 명령 접두어 키조차도 다시 매핑 할 수 있습니다. 대신 그걸 사용하겠습니다.

2

바이퍼 모드 명령 접두사 키는 두 세트의 간접 지정을 통해 설정됩니다. 모든 명령 키가 'viper-command-argument에 바인딩되어 있기 때문에 첫 번째 것을 찾았습니다. 다음으로 수행 할 작업은 변수 viper-exec-array을 조회하는 것입니다. 당신이 삭제 명령과 같은 키 행위는 다음과 같은 두 가지 필요가 확인하려면

(aset viper-exec-array ?c 'viper-exec-change) 
(aset viper-exec-array ?C 'viper-exec-Change) 
(aset viper-exec-array ?d 'viper-exec-delete) 
(aset viper-exec-array ?D 'viper-exec-Delete) 
(aset viper-exec-array ?y 'viper-exec-yank) 
(aset viper-exec-array ?Y 'viper-exec-Yank) 
(aset viper-exec-array ?r 'viper-exec-dummy) 
(aset viper-exec-array ?! 'viper-exec-bang) 
(aset viper-exec-array ?< 'viper-exec-shift) 
(aset viper-exec-array ?> 'viper-exec-shift) 
(aset viper-exec-array ?= 'viper-exec-equals) 

: 그래서 그것은 현재과 같이 설정

(aset viper-exec-array ?t 'viper-exec-delete) 
(define-key viper-vi-basic-map "t" 'viper-command-argument) 

을 (그리고 아마도 당신은 말을, 어딘가에 에서 운동을 리 바인드하려는 C 키 :

(define-key viper-vi-basic-map "c" 'viper-goto-char-forward) 

마지막으로 'viper-prefix-arg-com 루틴을 수정해야하는데 완전히 이해할 척하지 않습니다. 즉, ?c을 모두 ?t으로 바꾸면 t 바인딩이 예상대로 작동합니다. (또는 은 이 사용 된 것과 동일한 방법으로 ?t에 추가 할 수 있습니다. 나는 그것의 근원을 제공 하겠지만, 100 줄 길며, 여기에 포함 할만한 가치가 없다. (그것은 4 글자의 변화 다.) M-x 찾기 기능 viper-prefix-arg-com을 수행하여 출처를 확인할 수 있습니다.

간단히 말해서, 바이퍼 용으로 키의 도매 바인딩을 다시 만들고 싶다면 그것은 상당한 양의 작업이 될 것이므로 바이퍼 소스 코드에 익숙해 질 것입니다.

'viper-prefix-arg-com이 코딩 된 방식을 보면 다시 정의하지 않고 원하는대로 변경할 수 없습니다. 바이퍼 모드가 구현하는 다른 종류의 3 ~ 4 가지 종류의 vi 명령이 있습니다 (이 중 하나는 '명령 인수'입니다). 다른 것들은 희망적으로 리바 인하기가 더 쉽습니다 ...

+0

저는 GNU Emacs 23.1.50.1을 사용하고 있습니다. emacs -q를 사용하여 .emacs config를 무시하기 시작하면, "M-x viper-mode"를 수행하고 예제를 평가합니다. 이제 삭제 접두사로 작업하는 대신 바이퍼 모드에서 't'를 누르면 오류가 출력됩니다. '바이트 코드 : 변수 바인딩 깊이가 max-specpdl 크기를 초과합니다.' – rsaarelm

+0

@rsaarelm 그렇기 때문에 나는 알지 못했습니다. 당신은 또한''viper-prefix-arg-com'의 소스를 수정해야합니다. 내 대답을 업데이트했습니다. –

+0

솔루션은 "포크 바이퍼"영역으로 약간 이동하지만 적어도 재 정의해야하는 제한된 양의 코드 일뿐입니다. 사물에 초점을 맞추도록 도와 주셔서 감사합니다. – rsaarelm

관련 문제