Emacs: mensagens sem áudio (“área de eco”)

5

Eu faço muita automatização no Emacs, empilhando comandos que eu conheço usando manualmente . Esse é um método que eu recomendo, porque não é preciso muito esforço: você usa o Emacs como normalmente faria e, de vez em quando, aparece na sua cabeça: "Ei, estou sempre usando esses comandos em seqüência, por que don ' Eu apenas os fundo? " Tudo mais simples, já que você conhece os comandos, por nome ou atalho.

Um problema, porém, é que quando você empilha comandos, você obtém muitas mensagens piscando na "área de eco" (o mesmo lugar que o minibuffer). Essas mensagens não fazem sentido, pois tudo o que está acontecendo abaixo (as funções invocadas) é (deve ser) transparente para o usuário.

Então, você poderia silenciá-lo e, em seguida, ativar o som dele? Dê uma olhada abaixo:

(defun invisible-pretty-mail ()
  "Automatize 'pretty-mail'."
  (interactive)
  ; (mute-echo-area)
  (rmail-edit-current-message)
  (pretty-mail) ; lots of replace-string, replace-regexp, etc. here
                ; that will flood messages
  (rmail-cease-edit)
  ; (unmute-echo-area)
  )

Editar em resposta à resposta :

do sds

Eu estou muito ciente dessas notas que você se refere, pois elas são muito comuns no sistema de ajuda do Emacs.

Embora seu conselho não seja incorreto em geral, vamos examinar essa situação em particular com mais detalhes: 1) Existe uma função Elisp em .emacs . 2) Ele usa comandos que a pessoa que configurou a função está muito familiarizada, por isso é muito legível e sustentável. 3) A função funciona exatamente como pretendido, com 4) a desvantagem one de que ela ecoa muitas mensagens.

Agora, nessa situação, você realmente sugeriria uma reescrita completa dessa função (e muitas outras), usando comandos completamente diferentes, comandos que podem ou não existir, como uma possível maneira de reduzindo mensagens, que nem saberemos que acontecerão?

Editar : Um exemplo (que funciona), depois da ajuda que recebi de Drew .

(defun test-suppress-msgs ()
  (interactive)
  (let ((log-size message-log-max))
    (setq message-log-max nil)
    (message "This message is suppressed.")
    (setq message-log-max log-size)
    (message "This is echoed, and logged.") ))
    
por Emanuel Berg 06.03.2013 / 23:07

2 respostas

6

A vinculação de message-log-max a nil suprime as mensagens pela duração da ligação (dinâmica).

A vinculação de echo-keystrokes a 0 suprime o eco das teclas pressionadas.

A partir do Emacs 25.1, você também pode vincular (ou definir) a variável inhibit-message a não- nil , para evitar a maioria das mensagens de área de eco (mas não impedir que essas mensagens sejam registradas no buffer *Messages* ).

    
por 21.07.2013 / 19:13
2

Eu não vejo nada que possa fazer o que você quer no código-fonte do Emacs.

Observe que o seu método "empilhando comandos que conheço usando manualmente" não é necessariamente TRT. Alguns comandos Emacs são obsoletos como parte do código lisp, por exemplo,

C-x b runs the command switch-to-buffer
...
WARNING: This is NOT the way to work on another buffer temporarily
within a Lisp program!

e

previous-line is an interactive compiled Lisp function in 'simple.el'.
...
It is bound to C-p, <up>.
...
If you are thinking of using this in a Lisp program, consider using
'forward-line' with a negative argument instead.  It is usually easier
to use and more reliable (no dependence on goal column, etc.).

Ou seja, ao escrever código Lisp, é melhor usar primitivos em vez de comandos interativos, isso também deve reduzir o fluxo de mensagens com o qual você está preocupado.

Editar:

Mais importante, isso tornará suas funções mais robustas - elas dependerão menos de várias configurações, e elas terão menos chances de quebrar de repente quando você decidir experimentar uma nova opção de usuário.

Eu entendo que isso não é o que você está perguntando, e digo imediatamente, IMO, não há como suprimir as mensagens.

    
por 07.03.2013 / 14:13