Сообщение минибуфера Emacs при вводе C-x

#emacs #elisp

#emacs #elisp

Вопрос:

Что ж. Когда я набираю несколько первых ключей серии ключей, emacs записывает эти ключи в минибуфер через некоторый интервал времени. Вот так: ввод C-x 4 текста станет C-x 4- видимым в минибуфере.

Вопрос в том, можно ли это изменить? Я думал о том, чтобы сделать что-то вроде объединения части key-help (генерируемой C-h при вводе некоторых ключей) с этой строкой. Может ли интервал ожидания этого сообщения также быть сокращен? Является ли это подпрограммой?

Отредактировано, новый вопрос

Когда я завершаю работу с emacs C-x C-c и изменяю буферы, появляется сообщение с вопросом, хочу ли я их сохранить. Как я могу узнать, что это сообщение здесь?Я попытался заглянуть (minibuffer-prompt) (minibuffer-contents) (buffer-substring (point-min) (point-max)) , выбрав (select-window (minibuffer-window)) . Ничто не дает мне результатов.

Ответ №1:

Да, пользовательский параметр echo-keystrokes определяет, сколько времени пройдет до отображения префиксного ключа в минибуфере. Из (emacs) Echo Area Customization :

Пользовательский параметр: повторные нажатия клавиш
 Эта переменная определяет, сколько времени должно пройти до
эха символов команды. Его значением должно быть целое число или
число с плавающей запятой, которое определяет количество секунд ожидания перед
повторением. Если пользователь вводит префиксный ключ (например, `C-x'), а затем
задерживается на столько секунд, прежде чем продолжить, префиксный ключ
повторяется в области эха. (Как только в последовательности клавиш начинается эхо,
все последующие символы в той же последовательности клавиш
немедленно повторяются.)

 Если значение равно нулю, то ввод команды не повторяется.

Комментарии:

1. Ну, я тоже нашел это. Его нельзя использовать для определения эха, но в любом случае неплохо настроить на меньшее значение. Голосую за вас.

2. Нарисовал как у Дрю Адамса? Спасибо, чувак, этот ответ сработал для меня, проголосовав.

Ответ №2:

Вы можете управлять временем этого справочного сообщения, задав suggest-key-bindings большее / меньшее число.

 (setq suggest-key-bindings 5) ; wait 5 seconds
  

Простого способа настроить поведение не существует, вам придется отредактировать код C execute-extended-command или использовать его замену, которая также предоставляет справку. Одной из возможностей для замены является anything-complete библиотека, в которой есть замена для execute-extended-command (примечание: я ее не пробовал). Он создается поверх пакета anything , что отличается от стандартного Emacs.

Комментарии:

1. suggest-key-bindings это не совсем то, о чем я спрашиваю. Пример: у нас включена какая-то функция C-c C-k , и мы просто вводим C-c . Через короткое время мы видим C-c- в минибуфере. Это не предложение , которое говорит о M-x forward-char том, к чему оно привязано C-f . Было бы неплохо узнать, какая функция создает текст, который я хочу. Я попробую поиграть с fset, сохранив subr в другом символе.

2. @desudesudesu Понял, я неправильно понял. К сожалению, командный цикл для чтения во входных событиях еще менее доступен, чем suggest-key-bindings , поэтому ответ заключается в том, что на самом деле невозможно делать то, что вы хотите, без изменения кода C.

3. Жаль. Тем не менее, я написал нужные функции даже без него, используя таймеры . Как я могу увидеть, что кто-то использует минибуфер в keylist-function ? Вы можете видеть, что закомментированные вещи не работают (кроме последних двух строк, они работают).

4. FWIW, wrt execute-extended-command и предлагающие привязки клавиш (которые, как я понимаю, на самом деле не то, что вам было нужно), см. Код icicle-execute-extended-command-1 .

Ответ №3:

Я написал рабочую версию того, что я хотел реализовать.

Чтобы использовать (require 'keylist) , скопируйте одну или две последние строки в .emacs и раскомментируйте их.

Как вы можете видеть в этом коде, я использовал это

 (not cursor-in-echo-area)
(not (minibufferp))
(not (= 13 (aref (this-command-keys-vector) 0)))
  

чтобы узнать, используется ли мой минибуфер или область эхо.
Разница между ними в том, что минибуфер используется для чтения, а область эха используется для сообщения чего-либо.
При вводе C-x C-c курсор помещается в область эхо-сигнала, и значение cursor-in-echo-area изменяется.

Последняя строка (= 13 (aref (this-command-keys-vector) 0)) самая забавная. Он используется для перехвата таких вещей, как query-replace . При выполнении замен (this-command-keys-vector) показывает, что RET нажата первая клавиша, затем клавиши по вашему выбору (y, n). Поскольку у меня нет последовательностей ключей, начинающихся с RET , я согласен с этим.

Комментарии:

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

2. @MichaelHoffman обновил мою вставку everfall до последней отредактированной версии. Я отказался от его использования, поскольку он работает медленно, из-за чего мой процессор скачет на 30-50% при выполнении. Я запускаю его только при запуске нового режима. Убедитесь, что вы вызываете M-x keylist с любым аргументом. Без него оно отключается. Итак, C-u M-x keylist