Я работаю над захватом отформатированных нажатий клавиш в буфер, связанный с 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