Existe-t-il un moyen de désactiver l'avertissement «le tampon est en lecture seule»?

9

Je ne trouve pas cet avertissement particulièrement utile et assez distrayant car il cache le texte actuel dans la zone d'écho pendant un bref instant. Cela semble également inutile, car je remarquerai quand même que je ne peux pas écrire dans des zones en lecture seule. Y a-t'il une manière de le désactiver?

Lenar Hoyt
la source

Réponses:

9

Oui, vous pouvez désactiver ces messages en définissant command-error-functionune fonction qui ignore les buffer-read-onlysignaux.

(defun my-command-error-function (data context caller)
  "Ignore the buffer-read-only signal; pass the rest to the default handler."
  (when (not (eq (car data) 'buffer-read-only))
    (command-error-default-function data context caller)))

(setq command-error-function #'my-command-error-function)

(Testé avec GNU Emacs 24.5.1.)

Constantine
la source
Par curiosité, le dépassement de la command-error-functionvaleur n'affectera-t-il pas toutes les erreurs, et pas seulement les erreurs "tampon en lecture seule"? Je ne peux pas comprendre exactement ce que tous ces changements auront sur le code source.
Kaushal Modi
1
Oui, ce serait le cas. C'est exactement pourquoi j'ai le (when ...)formulaire dans l'extrait de code: de cette façon, les signaux dont nous ne nous soucions pas sont passés au gestionnaire par défaut et buffer-read-onlysont ignorés.
Constantine
Ah OK, j'ai complètement raté cet appel à command-error-default-function.
Kaushal Modi
1
Doux, je cherchais un moyen facile de se débarrasser de ces ordures "Le texte est en lecture seule" uniquement dans le mini-tampon et cela fait l'affaire.
whacka
1
@mcb: Pour autant que je sache, il n'est pas possible de séparer la zone d'écho et le mini-tampon. Je crois que la réponse par philslaquelle vous avez lié est correcte, c'est-à-dire que nous aurions besoin d'un nouveau code C pour cela.
Constantine
3

Source de l'erreur «tampon en lecture seule»

Je crois que la source de cette erreur: se Buffer is read-only: <#BUFFER-NAME>trouve dans le code source C.

La solution serait donc de modifier le code source et de construire emacs localement en commentant cette ligne spécifique .

Pour référence, voici l'extrait de code qui génère cette erreur:

if (!NILP (BVAR (current_buffer, read_only))
    && NILP (Vinhibit_read_only)
    && NILP (Fget_text_property (pos, Qinhibit_read_only, Qnil)))
  xsignal1 (Qbuffer_read_only, Fcurrent_buffer ());
return Qnil;

.. et commenter cette xsignalligne devrait faire l'affaire.


Approche suggérée

Il existe un moyen beaucoup plus simple d'éviter cette nuisance pendant la durée de votre travail dans un tampon en lecture seule. Vous ne pouvez temporairement PAS le rendre en lecture seule.

  • Faire M-x read-only-mode(lié par défaut à C-x C-q) fait basculer tout tampon entre le mode lecture seule et le mode modifiable.

Donc, si vous obtenez beaucoup de ces erreurs, rendez simplement le tampon temporairement modifiable en appuyant sur C-x C-q.


Un avertissement: faire le piratage de la source C pourrait être une source majeure de confusion à l'avenir. Donc je ne le ferais pas.

Kaushal Modi
la source
1
Autant que je sache, (defun barf-if-buffer-read-only () nil)a le même effet que de commenter l' xsignal1appel et de reconstruire Emacs. :-)
Constantine
@Constantine TIL que nous pouvons remplacer les fonctions C dans elisp. Merci!
Kaushal Modi
Concernant la modification des choses à l'aide d'elisp: cela me rappelle cette vieille question sur nil: emacs.stackexchange.com/questions/2935/how-can-i-bring-back-nil
Constantine