No Emacs, há alguns casos em que eu gostaria de impedir a exibição de mensagens no minibuffer, principalmente relacionadas a "Início / Fim do buffer" e "O texto é somente leitura".
Existe alguma maneira de impedir que essas mensagens apareçam no minibuffer?
Além disso, há algum motivo significativo para não querer desativá-los? No valor nominal, posso olhar com a mesma facilidade o número da linha e o status de gravação do buffer na modelagem.
Respostas:
No Emacs 25, você pode suprimir as mensagens do minibuffer vinculando-se
inhibit-message
a um valor não nulo:fonte
message1
chama a função Cmessage3
, que respeite essa variável.(let ((inhibit-message t)) (message make-progress-reporter))
message
retorna a sequência de mensagens, então talvez você esteja vendo a sequência retornada ao avaliar o código. Se você avaliar esse código em uma combinação de teclas, nenhuma mensagem será impressa (exceto no buffer de Mensagens ).Você pode tipo de fazer isso a partir do código Lisp. Por que "mais ou menos"? Como MESSAGE é uma primitiva, definida em C, em vez de uma função Lisp, e, de acordo com o manual de referência do Emacs Lisp , as chamadas para primitivas do código C ignoram os conselhos.
Portanto, para realmente executar um trabalho adequado de implementação da funcionalidade desejada, você precisará redefinir a primitiva MESSAGE como uma função Lisp; depois de fazer isso, você poderá aconselhá-lo com o código que obtém a sequência que MESSAGE ecoaria no minibuffer, comparando-o com uma lista de mensagens que você não deseja ver e, em seguida, chama ou não chama MESSAGE, dependendo no resultado. Em teoria, isso poderia ser realizado por exemplo
(defvar *message-prim* (symbol-function 'message))
, e então(defun message (format &rest args) ... (funcall *message-prim* format args))
- mas SYMBOL-FUNCTION, dado um argumento primitivo, retorna algo que não é realmente exigível, então o FUNCALL sinaliza uma condição de VOID-FUNCTION.No entanto, mesmo se isso funcionasse, ainda não funcionaria, porque a redefinição de uma primitiva apenas garante que a redefinição será usada quando a função for chamada a partir do código Lisp; chamadas no código C ainda podem usar a definição primitiva . (É possível que o código C chame o Emacs Lisp, e esses casos terão a redefinição; também é possível que o código C chame o código C, e esses casos terão a definição original.)
Estou vagamente pensando em corrigir o código C e recompilando o Emacs para fornecer a funcionalidade adequada de supressão de mensagens; Eu realmente não preciso dessa funcionalidade, mas pode ser um exercício interessante, especialmente porque eu não sou um hacker C. Enquanto isso, aqui está algo que eu criei que, quando solto em um arquivo, incluído em um de seus arquivos init e personalizado ao seu gosto, suprimirá as mensagens originárias do código Lisp que correspondem exatamente às strings que você lista para supressão. Enquanto a supressão estiver ativada, essas mensagens nunca aparecerão no minibuffer; você tem a opção de suprimi-los também do
*Messages*
buffer.Eu testei isso para trabalhar com mensagens que são realmente geradas a partir do código Lisp, por exemplo, a reclamação "Você não especificou uma função" ecoada por DESCRIBE-FUNCTION quando você fornece um argumento de string vazio. Infelizmente, as mensagens que você menciona que desejam suprimir, como "Início do buffer", "Fim do buffer" e "O texto é somente leitura", parecem todas originárias do código C, o que significa que você não poderá suprima-os por este método.
Se algum dia eu chegar ao patch de origem (provavelmente) será contra o Emacs 24.3 , e atualizarei esta resposta com informações sobre como usá-lo.
fonte
No Emacs 25 e provavelmente em algumas versões anteriores, a maneira mais limpa de fazer isso é a seguinte:
Primeiro defina:
Então, se você deseja suprimir todas as mensagens produzidas por
some-function
você:Por exemplo, suprimo a mensagem "Processo Ispell morto" produzido pela função
ispell-kill-ispell
(inispell.el.gz
) escrevendo:Se você precisar reativar as mensagens, execute:
Algumas coisas a serem observadas:
1) Todas as mensagens produzidas por
some-function
serão suprimidas, assim como todas as mensagens produzidas por qualquer função lisp que a função chamar.2) As mensagens produzidas pelo código C não serão suprimidas, mas provavelmente é tudo o melhor.
3) Você precisa ter certeza de que
-*- lexical-binding: t -*-
está contido na primeira linha do seu.el
arquivo.Mas como você descobre qual função é chamada
message
? Você pode verificar o código como alguém sugeriu, mas é mais fácil deixar o Emacs fazer o trabalho por você.Se você definir:
e então faça:
você receberá um backtrace adicionado à mensagem. A partir disso, você pode ver facilmente onde a mensagem foi gerada.
Você pode reverter isso com:
Uma abordagem alternativa seria aconselhar a
message
função e testar se você deseja imprimir a mensagem ou não. Isso é simples se a mensagem em questão for uma sequência fixa. Por exemplo, para suprimir o "processo Ispell morto", você pode definir:e então faça:
Essa abordagem logo fica muito confusa se a mensagem for complicada.
fonte
Aparentemente, você está pedindo uma maneira de inibir seletivamente certas mensagens. A resposta para isso é que você precisaria redefinir ou aconselhar o código que emite essas mensagens específicas .
Para impedir todas as mensagens, por exemplo, durante o período de algum código, você pode usar
flet
oucl-flet
redefinir a funçãomessage
localmente para (função)ignore
. Ou use a técnica usada emedt-electric-helpify
: salve a definição original demessage
,fset
paraignore
retorná-fset
la ao padrão original (embora seja melhor usarunwind-protect
se você fizer isso).fonte
grep
ouA
em Dired. Procure o texto da mensagem de erro nos arquivos de origem do Emacs Lisp (e possivelmente também nos arquivos do Emacs C, se você os tiver disponíveis). HTH.Isso funciona para suprimir "Início do buffer" e "Fim do buffer" e não requer o emacs 25.
Inspirado em https://lists.gnu.org/archive/html/help-gnu-emacs/2015-12/msg00189.html, mas usa "defadvice" para obter mais compatibilidade.
fonte