Можно ли отправить вывод из фильтра процесса в *Messages*
буфер и подавить вывод этого сообщения, появляясь в эхо-области, так что я могу одновременно использовать интерактивные команды, не minibuffer-prompt
стираясь при текущем выводе фильтра субпресса?
(defun rsync-process-filter (proc string)
(when (not (or
(string-match "files...\r" string)
(string-match "files to consider\n" string)))
(message "%s" string)))
РЕДАКТИРОВАТЬ (3 января 2015 г.): Ниже приведена ссылка на похожий вопрос, однако я пока не смог заставить его работать со строкой процесса, в которой точная строка неизвестна - заголовок темы: Emacs - Отключить некоторые сообщения минибуфера :
minibuffer
process
echo-area
lawlist
источник
источник
*Messages*
буфер - один из них связан с синхронизацией. Есть еще пара вещей, которые я не пробовал ( потому что я думал, что, возможно, было встроенное решение ), например, сделать*Messages*
буфер временно доступным для записиinhibit-read-only
и использоватьinsert
atpoint-max
- я не знаю, появится ли это в эхо-зона, а также. Я буду работать над этим снова этим вечером. , ,M-x report-emacs-bug
и запросить это как функцию?(let ((inhibit-read-only t)) (with-current-buffer (get-buffer-create "*Messages*") (goto-char (point-max)) (insert string)))
и разместил черновой ответ, который будет приемлем для принятия после истечения обязательного периода ожидания по собственному вопросу пользователя. Я отправил запрос на добавлениеreport-emacs-bug
: debbugs.gnu.org/cgi/bugreport.cgi?bug=19495(messages-buffer)
для получения буфера , если вы придерживаетесь этого метода и обратите внимание, что(point-max)
это не всегда будет началом новой строки (например, использованиеC-g
).Ответы:
Вы можете подавить отображение в минибуфере, установив
minibuffer-message-timeout
на 0.Например, я использую что-то подобное в нескольких местах, где я хочу переключать второстепенный режим, когда в приглашении минибуфера (например, ido find-file) без прерывания сообщением «mode enabled»:
источник
(let ((minibuffer-message-timeout 0)) (message "%s" string))
интерактивных функций, таких какexecute-extended-command
илиswitch-to-buffer-other-window
- т. Е. Подсказки и предлагаемые завершения стираются в выходных сообщениях процесса, текущая печать выходных данных процесса все еще отображается в эхо-области / минибуфере .Первый предварительный черновик (3 января 2015 г.): пересмотрен первоначальный черновик на основе полезного комментария @phils относительно использования функции
messages-buffer
для поиска или создания соответствующего буфера (и помещения его вmessages-buffer-mode
); и добавил проверку того,point-max
находится ли в начале строки (если нет, то вставьте новую строку перед вставкой строки сообщения).РЕДАКТИРОВАНИЕ (4 января 2015 г.): существуют ситуации, когда вставленная строка не обязательно заканчивается новой строкой, и функция
message
не имеет проверки, чтобы убедиться, что она находится в начале новой строки, поэтому мы позаботимся об этом. в этой функции. Таким образом, в любой момент, когдаmessage
вставляется новая строка, указанная строка будет начинаться слева от буфера.источник
Переход через строку документацию на
message
него , кажется , это должно быть возможно добиться того, что вы хотите, вызвав сообщение сnil
аргументом сразу после вызоваmessage
с нужным содержанием. Из документацииmessage
Поэтому изменение вашей функции на что-то вроде следующего должно работать
Я проверил это, выполнив следующее
И это похоже на работу
источник
*Messages*
буфер, а затем вызывающим интерактивную командуexecute-extended-command
, показывает следующее: интерактивное приглашение (т. Е.M-x
И любые частичные завершения) и выходные данные процесса - т. Е. Два переключаются назад и вперед со скоростью света, но мерцание между ними заметно. Похоже, что это так, потому что конкретный рассматриваемый процесс постоянно выплевывает новые сообщения, и это новое сообщение отображается в течение доли секунды в эхо-области.