¿Hay un gancho que se ejecute para todos los búferes de solo lectura


7

Quiero habilitar show-trailing-whitespacepara archivos editables y deshabilitar show-trailing-whitespacepara archivos de solo lectura. He intentado

(defun my/read-only-whitespace ()
  (setq-local show-trailing-whitespace (not buffer-read-only)))

(setq-default show-trailing-whitespace t)
(add-hook 'read-only-mode-hook #'my/read-only-whitespace)

Pero esto solo parece funcionar si lo habilito read-only-modemanualmente. Cuando abro un búfer que se convierte en solo lectura automáticamente (por ejemplo, un archivo de solo lectura), el gancho no se ejecuta.

¿Hay un gancho que se ejecute para todos los buffers de solo lectura?

Respuestas:


6

Si desea que esto actúe en cualquier búfer, no solo un búfer de visita de archivos, entonces find-file-hookno es apropiado. (Usted dijo " todos los buffers ", pero también habló de " archivos " editables / no editables ).

Si desea que funcione en todos los buffers, esta es una solución:

(defun my-show-trailing-ws ()
  "Show trailing whitespace in the current buffer, unless it is read-only."
  (setq-local show-trailing-whitespace (not buffer-read-only)))

(add-hook 'post-command-hook 'my-show-trailing-ws)

Puede ajustar eso en un comando de modo menor, si lo desea.

Otra posibilidad es usar un temporizador inactivo, pero post-command-hookparece estar bien para lo que estás buscando.

Que yo sepa, no hay gancho que corresponda a un cambio en buffer-read-only. Sin embargo, si usa Emacs 26 o posterior, puede usar la función add-variable-watcherpara encender / apagar mostrando espacios en blanco finales cada vez que buffer-read-onlyse cambia la variable .

(add-variable-watcher 'buffer-read-only 'foo) ; Add watcher `foo'

(defun foo (symbol newval operation where) ; 100% untested...
   "Show trailing whitespace in the current buffer, unless it is read-only."
   (when (and (eq symbol 'buffer-read-only)
              (memq operation '(set let))
              (eq where (current-buffer)))
     (setq-local show-trailing-whitespace (not newval))))

Parece un poco exagerado ejecutar esta función después de cada comando. ¿No es su manera más simple?
Moyamo

@Moyamo Pruébalo, luego decide si crees que hace que emacs sea lento. Mi apuesta es que no notará ninguna desaceleración o un mayor uso de la CPU debido a este código. Si está preocupado, asegúrese de que my-show-trailing-wsesté compilado.
Harald Hanche-Olsen

La solución de vigilancia variable para Emacs 26 funciona bien.
GDP2

1

Puede usar find-file-hooky verificar el estado de solo lectura del búfer:

(defun my/read-only-whitespace ()
  (when buffer-read-only
    (setq-local show-trailing-whitespace (not buffer-read-only))))
(add-hook 'find-file-hook 'my/read-only-whitespace)

Como dijo @Drew, esto no funcionará para buffers especiales como los buffers de agenda de la organización.
Moyamo

1
Tiene razón en eso. Sin embargo, no estaba claro para mí que quisieras esa generalidad. (Quizás tampoco fue claro para ti ...)
Harald Hanche-Olsen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.