2011-09-26 1 views

답변

11

보다 더 적은 수의 키 누름입니다. 그러나이 기능은 명령 자체에서 구현할 수 있습니다. 이것은 C-x e에 대한 작업입니다.

(defmacro with-easy-repeat (&rest body) 
    "Execute BODY and repeat while the user presses the last key." 
    (declare (indent 0)) 
    `(let* ((repeat-key (and (> (length (this-single-command-keys)) 1) 
          last-input-event)) 
      (repeat-key-str (format-kbd-macro (vector repeat-key) nil))) 
    ,@body 
    (while repeat-key 
     (message "(Type %s to repeat)" repeat-key-str) 
     (let ((event (read-event))) 
     (clear-this-command-keys t) 
     (if (equal event repeat-key) 
      (progn ,@body 
        (setq last-input-event nil)) 
      (setq repeat-key nil) 
      (push last-input-event unread-command-events)))))) 

여기에 사용하는 방법은 다음과 같습니다 여기 난 그냥 쉽게 자신의 명령에이 기능을 추가 할 수 있습니다 (GNU 이맥스 23.1.1에서 kmacro-call-macro의 표준 정의에 의해 인도)을 쓴 매크로입니다 그것은 :

(defun hello-world() 
    (interactive) 
    (with-easy-repeat 
    (insert "Hello, World!\n"))) 

(global-set-key (kbd "C-c x y z") 'hello-world) 

이제 Hello, World! 세 번 삽입 참조의 xyzzz를 입력 할 수 있습니다. 이 같은

+0

완벽하게 작동합니다. 고맙습니다! – TheEzEzz

+4

이맥스의'repeat' 패키지를 참고하십시오. –

+0

@event_jr Nice !! 팁 고마워. –

1

No. "ctrl-d ctrl-j"는 "Hello!"문자열에 바인딩 된 것입니다. Emacs는 시퀀스 전체를 주어진 문자열에 바인딩합니다. 여기에 주제에 대한 좋은 정보가있어! 한편

http://xahlee.org/emacs/keyboard_shortcuts.html

, 당신 이! "안녕하세요"의 단지 세 개의 인스턴스를 원한다면, 당신은 안녕하세요 안녕하세요 "로 그 순서 C-d C-j C-d C-j C-d C-j를 정의 할 수 있습니다! Hello! "라고 말하면되지만 원하는 문자열에 대해 간단한 시퀀스를 정의하는 것이 더 짧습니다.

+0

을 원하는 모든입니다 제가 결합 C-d''에 기능을 결합하면 "안녕하세요!" 'C-j'. 그리고 추가 시간마다'C-j'을 눌러 "Hello!"를 얻습니다. 또한 'd' 키를 ​​놓을 때들을 수있는 방법이 필요하기 때문에 "Hello"바인딩을 해제 할 수 있습니다. 'C-j'에서. 그럴 수 있습니까? – TheEzEzz

+0

그렇게하려고한다면 왜 C-j를 "Hello!"에 바인딩하지 않는 것이 좋을까요? ? –

+0

'C-s C-j'을 누르면 뭔가 다른 일이 생기기를 원하기 때문입니다. – TheEzEzz

4

모든 명령에서 작동하는 일반적인 것을 찾고 계신다면 어떻게 작동하는지보실 수 있습니다. 새 명령을 시작하거나 이전 명령을 반복하려면 emacs가 어떻게 알 수 있습니까? 더 좋은 예는 "C-c h"입니다. 그 다음에 "h"를 입력하면, 이맥스가 명령을 반복하거나 h를 삽입해야합니까?

즉, emacs에는 이미 범용 인수 인이 메커니즘이 있습니다.

이 키 조합을 시도해보십시오

C-u 3 C-d C-j 

그것은 내가 모든 명령에 대한 것을 않도록 당신이 이맥스를 구성 할 수 있다고 생각하지 않습니다 C-D C-J C-J C-J의 C-J

+0

내 장난감 사례가 너무 장난감이었습니다. JKLI를 내비게이션 키로 다시 매핑하려고합니다. 그러면 C-J가 커서를 왼쪽으로 이동하고 C-L은 오른쪽으로, C-I는 위로, C-K는 아래로 이동합니다. 이 동작을 덮어 쓰고 싶다면'd'를 누르면'C-J'가 왼쪽을,'C-L'은 오른쪽을 지울 것입니다. – TheEzEzz

2

시도 뭔가 :

(global-set-key (kbd "C-c C-j") (lambda() 
            (interactive) 
            (insert "Hello!") 
            (message "Type j to print Hello!") 
            (while (equal (read-event) ?j) 
            (insert "Hello!")) 
            (push last-input-event unread-command-events))) 

아이디어 내가이 모든 시간을 사용 kmacro-call-macro

+0

나는 keypress를 잃지 않기 위해 while 루프를 끝내는 마지막 이벤트를 뒤로 밀어야한다고 가정한다. Daniel Brockman의 답변을 참조하십시오. 그렇지 않으면이 답변의 선명함을 좋아합니다. – tripleee

+0

예, 맞았습니다. 수정 해 주셔서 감사합니다. –

0

에서 가져옵니다. 라이브러리를 사용하려면 repeat.el (GNU Emacs의 일부) 라이브러리가 필요합니다.

 
    (defun make-repeatable (command) 
     "Repeat COMMAND." 
     (let ((repeat-message-function 'ignore)) 
     (setq last-repeatable-command command) 
     (repeat nil))) 

    (defun my-hello() 
     "Single `hello'." 
     (interactive) 
     (insert "HELLO!")) 

    (defun my-hello-repeat() 
     (interactive) 
     (require 'repeat) 
     (make-repeatable 'my-hello)) 

이제 my-hello-repeat 바인딩 :

(글로벌 설정 키 (KBD "") '내-안녕하세요 반복)

지금은 그냥 인사 을 반복하는 키를 누른 상태에서 !.

Bookmark+, thing-cmdswide-n을 비롯한 여러 라이브러리에서 동일한 기술을 사용합니다.

0

smartrep

(require 'smartrep) 

(defvar ctl-d-map (make-keymap)) ;; create C-d map 
(define-key global-map "\C-d" ctl-d-map) 


(smartrep-define-key 
    global-map "C-d" 
    '(("C-j" . (insert "hello")))) 
관련 문제