Используйте пустую область эха для отображения информации


10

Область эха в большинстве случаев пуста, что заставляет меня думать, что я могу использовать ее для отображения некоторой информации. Например, org-clockотображает текущую задачу, оставшееся время и общее прошедшее время на модельной линии. Эта информация на самом деле не читается там (моделина может быть довольно короткой), повторяется на каждой моделине (потому что она применима ко всему сеансу emacs), и это не настолько полезно, что я готов пожертвовать некоторым драгоценным пространством моделин для нее , С другой стороны, он может появиться в эхо-области, когда здесь больше нечего отображать.

Есть ли канонический способ достижения этого? Я думал о взломе функции вставки в minibuffer-inactive-mode-hook(но она не работает надежно, например, сообщение исчезает, как только область эха используется снова), или спам не зарегистрированных сообщений (но это будет беспорядок с другими использования эхо-зона и минибуфер).

Бедная версия этого будет использовать таймеры простоя, но область эха может быть пустой, а emacs бездействует (например, при вводе некоторого текста).


1
Отображаемая область эха является содержимым `* Echo Area 0 *` или `* Echo Area 1 *`, и это «нормальные» буферы. Должна быть предусмотрена возможность исправления Emacs таким образом, чтобы обеспечить, возможно, запуск перехвата всякий раз, когда эти буферы «очищаются» (или отображаются и пусты), чтобы эта функциональность могла быть реализована эффективно и надежно.
Стефан

Это не совсем то, что вы имеете в виду, но Бастьен Герри сделал несколько интересных вещей для сохранения состояния экрана, особенно с отображением строки режима в заголовке кадра: bzg.fr/emacs-strip-tease.html
Dieter.Wilhelm

Ответы:


4

В комментарии к этому вопросу упоминается, что пакет с именем symon использует такую ​​функцию.

Это достигается спамом незарегистрированных сообщений, когда минибуфер неактивен, и прекращением повторного отображения при каждом запуске команды. Образец для этого довольно короткий, и после нескольких минут использования я не заметил никаких проблем с этим: использование сообщений и минибуфера по-прежнему имеет приоритет над сообщениями.

Ключевые компоненты:

  • функция отображения, запускаемая по таймеру простоя (вызывает сообщение с message-log-maxустановленным значением nil, чтобы отображаемая строка не попала в *Messages*буфер)
  • функция повторного отображения, запускается по таймеру
  • функция для остановки дисплея, запустить в pre-command-hook

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

Для тех, кто заинтересован, я извлек соответствующий код в стандартный пакет, доступный на github .


1

Ответ, ИМО, нет . Зона эха для эфемерных сообщений . И многие вещи явно стирают все, что могло быть там отражено. Таким образом, понимание того, что вы запрашиваете любым разумным способом, проблематично, ИМО.

В общем, используйте альтернативу. Вот некоторые:

  1. Используйте другой буфер (например, небольшой кадр или окно, которое вы оставляете открытым для этой цели). Это просто сделать, вы можете перемещать его, редактировать, стирать или делать с ним что угодно.

  2. Используйте часть или всю строку режима (которую вы уже рассмотрели, по-видимому).

  3. Используйте строку заголовка.

  4. Используйте заголовок кадра.

Если бы это был я, я бы выбрал № 1. (Но я действительно не хочу / не нуждаюсь в таком постоянном отображении информации о состоянии. Я бы скорее определил команду, которая показывает мне информацию (даже историю / журнал) по требованию.)


Обновлено после ваших комментариев:

Вы уже сказали в своем вопросе: « сообщение исчезает, как только область эха используется снова ». Так что это звучит так, как будто вы используете такое эфемерное пространство, поскольку эхо-область не соответствует вашим потребностям. Ваши ответы на комментарии, кажется, противоречат этому.

Если вы действительно хотите использовать область эха, то используйте minibuffer-inactive-mode-hook, как вы упомянули, или используйте таймер для вызова messageили для вставки сообщения времени в область эха другим способом. Однако вы уже отметили проблемы с этим. Эти проблемы (перезапись, стирание) вытекают из ( предполагаемой ) эфемерной природы области эха .

В общем, вы хотите использовать область, предназначенную для эфемерных сообщений, но не хотите, чтобы ваши сообщения исчезали, как только эта область будет использоваться снова.

(Кстати - по поводу вашего упоминания о том, что информация о строке режима повторяется в каждой строке режима: это не обязательно должно быть так. Вы можете сделать строку режима определенной для конкретного буфера и т. Д. IOW, вы можете выбрать одну строку режима, чтобы всегда (или периодически) показывать свои часы или что-то еще.)


Спасибо вам за ваши предложения! Во-первых, я не совсем понимаю, почему это проблематично? Я хотел бы, чтобы вещи, которые шли в атмо области эха, перекрывали любое другое использование области эха, поэтому удаление - это нормально. А дополнительная информация должна отображаться только тогда, когда область эха пуста, поэтому нечего стирать. Разве это не похоже на разумную спецификацию? Что касается №1, проблема в том, что я не хочу тратить пространство на экране. Зона эха всегда есть, даже когда она пуста. Я перечислил некоторые проблемы с № 2, и № 3 и № 4 разделяют многие из этих проблем.
Т. Веррон

О том, почему я хочу отображать информацию на постоянной основе, возьмем, к примеру, org-clockпример из вопроса: я хочу, чтобы таймер отсчитывал время, чтобы напомнить мне о том, что я должен делать, и что я должен делать это прямо сейчас , так как как можно чаще.
Т. Веррон

«сообщение исчезает, как только эхо-область используется снова» Хорошо, это было неясно. Я имел в виду, что если я использую minibuffer-inactive-mode-hookи выхожу из минибуфера, появится сообщение. Затем, если какая-то другая команда печатает что-либо в эхо-области, добавляется это новое сообщение, и эфемерное сообщение не возвращается (потому что минибуфер на этот раз не подключился).
Т. Веррон

Что касается моделин, то основная проблема в том, что там мало свободного места (у меня часто много окон, разбитых по горизонтали, поэтому очень короткие модели).
Т. Веррон

Снова - « В общем, вы хотите использовать область, предназначенную для эфемерных сообщений, но вы не хотите, чтобы ваши сообщения исчезали, как только эта область используется снова. » Используйте таймер с messageили post-command-hook, если хотите. Но основная проблема исчезновения / перезаписи иногда поднимает голову, потому что вы пытаетесь использовать временную область отображения для чего-то, что вы не хотите, чтобы оно было временным.
Дрю
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.