은 가정하자 나는첫 번째 키를 누르지 않고 emacs에서 두 가지 주요 단축키가 있습니까?
(global-set-key (kbd "C-d C-j") "Hello!")
내가 "C-d C-j C-j C-j"
를 입력하면 내가 얻을 것이다, 그래서이 가능 이맥스를 구성하는 것입니다 다음 바로 가기를 정의 "안녕하세요! 안녕하세요! 안녕하세요!" "C-d C-j C-d C-j C-d C-j"
을 입력하는 대신
은 가정하자 나는첫 번째 키를 누르지 않고 emacs에서 두 가지 주요 단축키가 있습니까?
(global-set-key (kbd "C-d C-j") "Hello!")
내가 "C-d C-j C-j C-j"
를 입력하면 내가 얻을 것이다, 그래서이 가능 이맥스를 구성하는 것입니다 다음 바로 가기를 정의 "안녕하세요! 안녕하세요! 안녕하세요!" "C-d C-j C-d C-j C-d C-j"
을 입력하는 대신
보다 더 적은 수의 키 누름입니다. 그러나이 기능은 명령 자체에서 구현할 수 있습니다. 이것은 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를 입력 할 수 있습니다. 이 같은
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! "라고 말하면되지만 원하는 문자열에 대해 간단한 시퀀스를 정의하는 것이 더 짧습니다.
모든 명령에서 작동하는 일반적인 것을 찾고 계신다면 어떻게 작동하는지보실 수 있습니다. 새 명령을 시작하거나 이전 명령을 반복하려면 emacs가 어떻게 알 수 있습니까? 더 좋은 예는 "C-c h"입니다. 그 다음에 "h"를 입력하면, 이맥스가 명령을 반복하거나 h를 삽입해야합니까?
즉, emacs에는 이미 범용 인수 인이 메커니즘이 있습니다.
이 키 조합을 시도해보십시오C-u 3 C-d C-j
그것은 내가 모든 명령에 대한 것을 않도록 당신이 이맥스를 구성 할 수 있다고 생각하지 않습니다 C-D C-J C-J C-J의 C-J
내 장난감 사례가 너무 장난감이었습니다. JKLI를 내비게이션 키로 다시 매핑하려고합니다. 그러면 C-J가 커서를 왼쪽으로 이동하고 C-L은 오른쪽으로, C-I는 위로, C-K는 아래로 이동합니다. 이 동작을 덮어 쓰고 싶다면'd'를 누르면'C-J'가 왼쪽을,'C-L'은 오른쪽을 지울 것입니다. – TheEzEzz
시도 뭔가 :
(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
나는 keypress를 잃지 않기 위해 while 루프를 끝내는 마지막 이벤트를 뒤로 밀어야한다고 가정한다. Daniel Brockman의 답변을 참조하십시오. 그렇지 않으면이 답변의 선명함을 좋아합니다. – tripleee
예, 맞았습니다. 수정 해 주셔서 감사합니다. –
에서 가져옵니다. 라이브러리를 사용하려면 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-cmds 및 wide-n을 비롯한 여러 라이브러리에서 동일한 기술을 사용합니다.
(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"))))
완벽하게 작동합니다. 고맙습니다! – TheEzEzz
이맥스의'repeat' 패키지를 참고하십시오. –
@event_jr Nice !! 팁 고마워. –