Как я могу выполнить функцию lisp, нажимая префиксную клавишу Ch, а затем позволить Emacs продолжить обычную обработку Ch? - PullRequest
0 голосов
/ 30 декабря 2011

Я хочу выполнить функцию lisp, нажимая клавишу префикса C-h, а затем позволить Emacs продолжить обычную обработку C-h. Как мне это сделать? Спасибо!

Ответы [ 2 ]

1 голос
/ 02 января 2012
(defvar smart-ime--state 'normal)
(defvar smart-ime--debug nil)
(defvar smart-ime--ena-prefix-override-keymap nil)
(defvar smart-ime--prefix-override-keymap (make-sparse-keymap))
(defvar smart-ime--keymaps-initialized nil)
(defvar smart-ime--keymap-alist
  `(
    (smart-ime--ena-prefix-override-keymap . ,smart-ime--prefix-override-keymap)
    )
  )

(defun smart-ime--init-keymaps ()
  (define-key smart-ime--prefix-override-keymap [(control x)] 'smart-ime--prefix-override-handler)
  (define-key smart-ime--prefix-override-keymap [(control c)] 'smart-ime--prefix-override-handler)
  (define-key smart-ime--prefix-override-keymap [(control h)] 'smart-ime--prefix-override-handler)
)

(defun smart-ime--prefix-override-handler (arg)
  (interactive "P")
  (smart-ime--prefix-override-replay arg))

;; the most important part    
(defun smart-ime--prefix-override-replay (arg)
  (let* ((keys (this-command-keys))
         (i (length keys))
         (key (aref keys (1- i))))

    (ime-save-and-set-status 0)
    (add-hook 'post-command-hook 'smart-ime--post-command-handler)
    (setq smart-ime--state 'prefix)
    (setq smart-ime--ena-prefix-override-keymap nil)

    ;; Don't record this command
    (setq this-command last-command)
    ;; Restore the prefix arg
    (setq prefix-arg arg)
    (reset-this-command-lengths)
    ;; Push the key back on the event queue
    (setq unread-command-events (cons key unread-command-events))))


(defun smart-ime--post-command-handler-1 ()
  (cond ((eq smart-ime--state 'prefix)
         (setq smart-ime--state 'sequence))


        ((eq smart-ime--state 'sequence)
         (ime-restore-status)
         (setq smart-ime--ena-prefix-override-keymap t)
         (setq smart-ime--state 'normal)

         (remove-hook 'post-command-hook 'smart-ime--post-command-handler)))

        (t
         (error "error state")))


(defun smart-ime--post-command-handler ()
  (when smart-ime-mode
    (condition-case nil
        (smart-ime--post-command-handler-1)
      (error nil))))


(define-minor-mode smart-ime-mode
  "Toggle Smart IME mode."
  :init-value nil
  :lighter " SmartIME"
  :global t

  (unless smart-ime--keymaps-initialized
    (smart-ime--init-keymaps)
    (setq smart-ime--keymaps-initialized t))

  (unless smart-ime-mode
    (remove-hook 'post-command-hook 'smart-ime--post-command-handler))


  (if (not smart-ime-mode)
      (setq emulation-mode-map-alists (delq 'smart-ime--keymap-alist emulation-mode-map-alists))
    (add-to-ordered-list 'emulation-mode-map-alists 'smart-ime--keymap-alist 400)
    (setq smart-ime--ena-prefix-override-keymap t))

  )

;;; Announce

(provide 'smart-ime)
1 голос
/ 30 декабря 2011

Оценка

(key-binding [(control h)])

Я обнаружил, что предел команды равен help-command.Вы можете использовать «вокруг» defadvice для запуска вашего кода.См. руководство .

...