Сочетание клавиш в emacs без нажатия на первую клавишу? - PullRequest
8 голосов
/ 26 сентября 2011

Предположим, я определил следующий ярлык

(global-set-key (kbd "C-d C-j") "Hello!")

Можно ли настроить emacs так, чтобы, если я наберу "C-d C-j C-j C-j", я получил "Hello! Hello! Hello!" вместо того, чтобы печатать "C-d C-j C-d C-j C-d C-j"?

Ответы [ 6 ]

11 голосов
/ 26 сентября 2011

Я не думаю, что вы можете настроить Emacs так, чтобы он делал это для всех команд.Однако вы можете реализовать эту функцию в самих командах.Это то, что сделано для Cx e . Вот макрос, который я только что написал (руководствуясь стандартным определением kmacro-call-macro в GNU Emacs 23.1.1) , который упрощает добавление этой функциональности к вашим собственным командам:

(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))))))

Вот как вы его используете:

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

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

Теперь вы можете ввести Cc xyzzz , чтобы вставить Hello, World! три раза.

4 голосов
/ 26 сентября 2011

Если вы ищете что-то общее, работающее со всеми командами, я не могу понять, как это будет работать - как emacs узнает, если вы запускаете новую команду или хотите повторить предыдущую. Лучшим примером будет «C-c h», если после этого вы наберете «h», следует ли emacs повторить команду или вставить a h?

Тем не менее, в emacs уже есть механизм для этого - универсальный аргумент.

Попробуйте эту последовательность клавиш:

C-u 3 C-d C-j

Это даже меньше нажатий клавиш, чем C-d C-j C-j C-j C-j

2 голосов
/ 26 сентября 2011

Попробуйте что-то вроде этого:

(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

1 голос
/ 26 сентября 2011

Нет. sequence"ctrl-d ctrl-j" - это то, что связано со строкой "Hello!"Emacs связывает последовательность в целом с заданной строкой.Вот немного полезной информации по теме:

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

С другой стороны, если вы хотели всего три экземпляра "Hello!", Вы может определить эту последовательность C-d C-j C-d C-j C-d C-j как "Hello! Hello! Hello!", но было бы короче просто определить более простую последовательность для нужной вам строки.

0 голосов
/ 16 октября 2014

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"))))
0 голосов
/ 07 октября 2011

Я использую это все время.Вам понадобится библиотека 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:

(global-set-key (kbd "")'my-hello-repeat)

Теперь просто нажмите и удерживайте клавишу home , чтобы повторить ПРИВЕТ! .

Я использую эту же технику в несколькихбиблиотеки, включая Bookmark + , thing-cmds и wide-n .

...