Как мне перехватить событие `M-0 <f4>` и записать его в буфер в этом формате в Emacs? - PullRequest
3 голосов
/ 11 ноября 2011

Я работаю над захватом отформатированных нажатий клавиш в буфер, связанный с VimGolf второстепенным режимом , над которым я работаю уже несколько дней.

У меня есть функция захвата почти точно там, где я хочу, за исключением того, что она не может захватить команду kmacro-end-or-call-macro, вызванную <f4>, или команду calc-dispatch, запущенную C-x *. Я не уверен, что еще может быть упущено, так как мое тестирование выявило только эти аномалии.

В случае, если вы не хотите кликнуть на github , вот эта функция в ее нынешнем виде:

(defun vimgolf-capture-keystroke ()
  (with-current-buffer (get-buffer-create vimgolf-keystrokes-buffer-name)
    (end-of-buffer)
    (if (not (or executing-kbd-macro prefix-arg))
        (progn
          (insert (key-description (this-command-keys)))
          (insert " ")))))

(defun vimgolf-capture-keystrokes ()
  (add-hook 'post-command-hook 'vimgolf-capture-keystroke))

(defun vimgolf-stop-capture-keystrokes ()
  (remove-hook 'post-command-hook 'vimgolf-capture-keystroke))

Единственная связь, которую я вижу между двумя проблемными функциями, о которых я знаю, заключается в том, что они оба выполняют другие команды до завершения команды, которую они фактически выполняют.

Я могу зафиксировать начало команд, но не конец, преобразовав указанные выше функции захвата в:

(defun vimgolf-capture-keystrokes ()
  (add-hook 'pre-command-hook 'vimgolf-capture-keystroke))

(defun vimgolf-stop-capture-keystrokes ()
  (remove-hook 'pre-command-hook 'vimgolf-capture-keystroke))

Даже когда я отключаю executing-kbd-macro из ограничения на добавление в буфер, он все равно не фиксирует это событие. Я попытался изучить фактический вектор, который исходит от post-command-hook, и во всех случаях это именно то, что я ожидал, но для <f4> он отображает пустой вектор.

Так как мне получить эти ключи в буфер захвата?


Для удобства я тестировал это с помощью Challenge ID 4d2fb20e63b08b08b0000075.

Точные клавиши, которые я нажимаю, <f3> C-e M-4 M-b M-d C-b M-2 <C-S-backspace> M-2 C-y C-f <f4> M-0 <f4> C-o M-< C-x * : M-1 v r C-u y

То, как эти ключи попадают в мой буфер захвата с помощью функции в том виде, в каком она сейчас стоит, - <f3> C-e M-4 M-b M-d C-b M-2 <C-S-backspace> M-2 C-y C-f <f4> C-o M-< : M-1 v r C-u y

Ответы [ 2 ]

4 голосов
/ 11 ноября 2011

Я вспомнил пакет, который может сделать это - я только что попробовал его, и он захватывает эти конкретные ключи. Еще одна приятная вещь для ваших целей заключается в том, что она ограничивает захваченные ключи текущим буфером. Кроме того, вы можете указать некоторые команды, которые не будут регистрироваться, что было бы удобно для исключения команд, специфичных для vimgolf. (Кроме того, если вы используете отдельный «контрольный буфер» для vimgolf-mode, например ediff-mode, вы не получите никаких специфических для vimgolf нажатий клавиш, загрязняющих журнал команд для буфера вызовов.)

Вышеупомянутое ограничение пакета (в настоящее время) заключается в том, что он не будет захватывать нажатия клавиш, введенные в минибуфер (например, для M-x sort-lines RET), но его можно расширить, также захватывая ключи, когда (minibufferp).

Пакет работает, подключая pre-command-hook вместо post-command-hook, который вы используете в настоящее время.

1 голос
/ 12 ноября 2011

FWIW, если вы хотите, вы можете обойтись без угловых скобок в описаниях клавиш - они никогда не нужны (бесполезны - только шум).Библиотека naked.el позволяет вам сделать это.Описание здесь .

...