É possível enviar a saída de um filtro de processo para o *Messages*
buffer e suprimir que a saída de mensagem apareça na área de eco, para que eu possa usar simultaneamente os comandos interativos sem ter que minibuffer-prompt
ser apagado pela saída do filtro de subpress em andamento?
(defun rsync-process-filter (proc string)
(when (not (or
(string-match "files...\r" string)
(string-match "files to consider\n" string)))
(message "%s" string)))
EDIT (3 de janeiro de 2015): A seguir, há um link para uma pergunta semelhante; no entanto, ainda não consegui fazê-lo funcionar com uma cadeia de processos em que a cadeia exata é desconhecida - o título do segmento é: Emacs - Desativar algumas mensagens Minibuffer :
minibuffer
process
echo-area
lista de leis
fonte
fonte
*Messages*
buffer - os projetos relacionados à sincronização são um deles. Ainda existem algumas coisas que eu não tentei ( porque pensei que poderia haver uma solução interna ), como tornar o*Messages*
buffer temporariamente gravávelinhibit-read-only
e usarinsert
atpoint-max
- não sei se isso será exibido em a área de eco também. Vou trabalhar nisso novamente esta noite. . .M-x report-emacs-bug
e solicite isso como um recurso?(let ((inhibit-read-only t)) (with-current-buffer (get-buffer-create "*Messages*") (goto-char (point-max)) (insert string)))
e publiquei uma resposta preliminar, que será elegível para aceitação após o término do período de espera obrigatório na pergunta do usuário. Eu entrou com um pedido de recurso comreport-emacs-bug
: debbugs.gnu.org/cgi/bugreport.cgi?bug=19495(messages-buffer)
para obter o buffer , se você(point-max)
seguir esse método e observe que nem sempre será o início de uma nova linha (por exemplo, useC-g
).Respostas:
Você pode suprimir a exibição no minibuffer configurando
minibuffer-message-timeout
para 0.Por exemplo, eu uso algo assim em alguns lugares em que quero alternar para um modo menor enquanto estiver em um prompt de minibuffer (como ido find-file) sem ser interrompido por uma mensagem 'mode enabled':
fonte
(let ((minibuffer-message-timeout 0)) (message "%s" string))
ainda é exibida na área de eco / minibuffer ao digitar funções interativas comoexecute-extended-command
ouswitch-to-buffer-other-window
- ou seja, as conclusões imediatas e sugeridas são apagadas pelas mensagens de saída do processo.Primeiro rascunho preliminar (3 de janeiro de 2015): Rascunho inicial revisado com base no comentário útil de @phils sobre o uso da função
messages-buffer
para localizar ou criar o buffer apropriado (e colocá-lo nomessages-buffer-mode
); e, adicionou uma verificação para saber sepoint-max
está no início da linha (se não estiver, insira uma nova linha antes de inserir a sequência de mensagens).EDIT (4 de janeiro de 2015): Existem situações em que a sequência inserida pode não necessariamente terminar em uma nova linha, e a função
message
não possui uma verificação para garantir que está no início de uma nova linha, por isso cuidamos disso nesta função. Assim, a qualquer momento em quemessage
a linha é inserida, a linha começa no lado esquerdo do buffer.fonte
Analisando a documentação
message
, parece que deve ser possível alcançar o que você deseja chamando a mensagem com umnil
argumento imediatamente após chamarmessage
o conteúdo desejado. A partir da doutrina demessage
Portanto, modificar sua função para algo como o seguinte deve funcionar
Eu testei fazendo o seguinte
E parece que funciona
fonte
*Messages*
buffer e depois chamando o comando interativoexecute-extended-command
, mostra o seguinte: o prompt interativo (ou seja,M-x
e quaisquer conclusões parciais) e a saída do processo - ou seja, os dois retornam e adiante na velocidade da luz, mas a oscilação entre os dois é discernível. Parece ser esse o caso, porque o processo específico em questão está constantemente emitindo novas mensagens e essa nova mensagem está sendo exibida por uma fração de segundo na área de eco.