2015-02-08 2 views
0

Во многих случаях emacs не выполняет макросы kbd точно так, как должно быть. НапримерКак выполнить макросы клавиатуры точно?

(execute-kbd-macro (read-kbd-macro "C-x C-f")) 

Вместо того, чтобы закончить выполнение этого макроса с открытым минибуфером Find file: ... Emacs просто открывает первый доступный файл или буфер Dired (в зависимости от ситуации). Как выполнить такие виды макросов kbd без таких недоразумений?

Обновление 2. Это просто пример таких макросов клавиатуры, которые ведут себя иначе, чем исходное поведение (т. Е. C-x C-f нажата). Ниже приведен еще один пример с grep.

Обновление. Как упоминалось в @lawlist, я могу использовать

(key-binding (kbd "C-x C-f")) 

для последовательности ключей трансформации для имени команды. Но он работает только тогда, когда есть команда. В более сложном случае, например,

(execute-kbd-macro (read-kbd-macro "C-u M-x grep RET")) 

этот метод «грубой силы» не работает (я хочу продолжить редактирование шаблона для grep но Emacs принудительно завершает взаимодействие).

+0

Я думаю, что это связано нить может ответить на ваш вопрос ?: http://emacs.stackexchange.com/a/7495/ 2287 – lawlist

+0

Спасибо, но в самом простом случае. Кажется, мне приходится вручную преобразовывать последовательность клавиш в эквивалент команды в каждом конкретном случае. – artscan

+0

Я не вижу, какие макросы имеют к этому отношение?Вы не просто работаете здесь? 'Cx Cf' не является макросом, он по умолчанию вызывает функцию' find-file' – Squidly

ответ

0

Функция kbd-macro-query может помочь в этой ситуации

(execute-kbd-macro (read-kbd-macro "C-x C-f C-u C-x q")) 

Но есть проблема: повышение уровня команды цикла (вы можете увидеть внешний вид в квадратных скобках в режимном). В случае find-file примера это не имеет значения, но

(execute-kbd-macro (read-kbd-macro "M-x helm-do-grep RET C-u C-x q")) 

дает неправильное поведение. Я разработал интересное решение

(defun eab/kbd-macro-query() 
    (interactive) 
    (let ((executing-kbd-macro defining-kbd-macro)) 
    (run-with-timer 0.1 nil 'abort-recursive-edit) 
    (recursive-edit))) 

(global-set-key (kbd "C-x Q") 'eab/kbd-macro-query) 

(let ((minibuffer-message-timeout 0)) 
    (execute-kbd-macro (read-kbd-macro "M-x helm-do-grep RET C-x Q"))) 

и он отлично работает.

(let ((minibuffer-message-timeout 0)) 
    (execute-kbd-macro (read-kbd-macro "C-u M-x grep RET C-x Q"))) 

также работает как должно быть.

Но теперь есть еще одна проблема, с ido-find-file (С-х С-е в ido-mode)

(let ((minibuffer-message-timeout 0)) 
    (execute-kbd-macro (read-kbd-macro "C-x C-f C-x Q"))) 

Существует что-то не так с ido-text и [Нет] матча.

Сумма. Основная идея этого метода - перехват макроса kbd с использованием recursive-edit. (kbd-macro-query с non-nil arg использует его). Существует некоторая проблема с ido-mode но вообще хорошо работает даже со сложными KBD последовательностями как

(let ((minibuffer-message-timeout 0)) 
    (execute-kbd-macro (read-kbd-macro "C-u M-x helm-do-grep RET C-x Q"))) 
Смежные вопросы