Eliminar propiedades de texto en savehist

7

Guardo el kill-ringuso del savehistpaquete. savehistguarda el anillo de matar con propiedades de texto intactas.

Lamentablemente, esto es un problema.

Tengo una configuración de emacs bastante grande, y utilizo mucho resaltado. Aquí está el primer elemento de mikill-ring

#("avehist-printable value)\n         (prin1 `(setq ,symbol ',value) (current-buffer))\n          (insert ?\\n))))))\n    ;; If autosaving, avoid writing if nothing has changed since the\n    ;; last write." 0 23   (fontified t wrap-prefix     #("     " 0 5        (fontified t)))   23 24   (fontified t face     (rainbow-delimiters-depth-8-face)     wrap-prefix     #("      " 0 5        (fontified t)))   24 25   (fontified t wrap-prefix     #("     " 0 5        (fontified t)))   25 32   (fontified t wrap-prefix     #("       " 0 7        (fontified t)))   32 33   (fontified t face     (rainbow-delimiters-depth-8-face)     wrap-prefix     #("          " 0 7        (fontified t)))   33 40   (fontified t wrap-prefix     #("         " 0 7        (fontified t)))   40 41   (fontified t face     (rainbow-delimiters-depth-9-face)     wrap-prefix     #("          " 0 7        (fontified t)))   41 61   (fontified t wrap-prefix     #("         " 0 7        (fontified t)))   61 62   (fontified t face     (rainbow-delimiters-depth-9-face)     wrap-prefix     #("          " 0 7        (fontified t)))   62 63   (fontified t wrap-prefix     #("         " 0 7        (fontified t)))   63 64   (fontified t face     (rainbow-delimiters-depth-9-face)     wrap-prefix     #("          " 0 7        (fontified t)))   64 78   (fontified t wrap-prefix     #("         " 0 7        (fontified t)))   78 79   (fontified t face     (rainbow-delimiters-depth-9-face)     wrap-prefix     #("          " 0 7        (fontified t)))   79 80   (fontified t face     (rainbow-delimiters-depth-8-face)     wrap-prefix     #("          " 0 7        (fontified t)))   80 81   (fontified t wrap-prefix     #("         " 0 7        (fontified t)))   81 88   (fontified t wrap-prefix     #("         " 0 7        (fontified t)))   88 89   (fontified t face     (rainbow-delimiters-depth-8-face)     wrap-prefix     #("          " 0 7        (fontified t)))   89 99   (fontified t wrap-prefix     #("         " 0 7        (fontified t)))   99 100   (fontified t face     (rainbow-delimiters-depth-8-face)     wrap-prefix     #("         " 0 7        (fontified t)))   100 101   (fontified t face     (rainbow-delimiters-depth-7-face)     wrap-prefix     #("        " 0 7        (fontified t)))   101 102   (fontified t face     (rainbow-delimiters-depth-6-face)     wrap-prefix     #("        " 0 7        (fontified t)))   102 103   (fontified t face     (rainbow-delimiters-depth-5-face)     wrap-prefix     #("        " 0 7        (fontified t)))   103 104   (fontified t face     (rainbow-delimiters-depth-4-face)     wrap-prefix     #("        " 0 7        (fontified t)))   104 105   (fontified t face     (rainbow-delimiters-depth-3-face)     wrap-prefix     #("        " 0 7        (fontified t)))   105 106   (fontified t wrap-prefix     #("       " 0 7        (fontified t)))   106 110   (fontified t wrap-prefix     #("    ;; " 0 4        (fontified t)        4 7        (fontified t face font-lock-comment-delimiter-face)))   110 113   (fontified t face font-lock-comment-delimiter-face wrap-prefix     #("    ;; " 0 4        (fontified t)        4 7        (fontified t face font-lock-comment-delimiter-face)))   113 175   (fontified t face font-lock-comment-face wrap-prefix     #("    ;; " 0 4        (fontified t)        4 7        (fontified t face font-lock-comment-delimiter-face)))   175 179   (fontified t wrap-prefix     #("    ;; " 0 4        (fontified t)        4 7        (fontified t face font-lock-comment-delimiter-face)))   179 182   (fontified t face font-lock-comment-delimiter-face wrap-prefix     #("    ;; " 0 4        (fontified t)        4 7        (fontified t face font-lock-comment-delimiter-face)))   182 193   (fontified t face font-lock-comment-face wrap-prefix     #("    ;; " 0 4        (fontified t)        4 7        (fontified t face font-lock-comment-delimiter-face))))

En esencia, las propiedades de texto aumentan ~/.emacs.d/savehisten casi un factor de 100. Estoy viendo ~ 30MB de anillo de matar. Esto es malo por todo tipo de razones. No menos importante porque hace que emacs sea muy lento.

¿Cómo puedo decir savehistque kill-ringelimine las propiedades de texto de antes de guardar, sin eliminar las propiedades de la sesión actual?

PythonNut
fuente

Respuestas:

11

Agregue lo siguiente a su archivo init:

(defun unpropertize-kill-ring ()
  (setq kill-ring (mapcar 'substring-no-properties kill-ring)))

(add-hook 'kill-emacs-hook 'unpropertize-kill-ring)

Cómo funciona

substring-no-propertieselimina cualquier propiedad de texto de una cadena dada. kill-ringes una lista de cadenas; estamos utilizando mapcarpara aplicar substring-no-propertiesa cada cadena que se encuentra actualmente en el anillo de matar. El resultado de la mapcarllamada (es decir, una lista de cadenas sin propiedades de texto) se utiliza para anular el valor original de kill-ring.

savehist-modeguarda el historial del minibúfer y cualquier variable adicional savehist-additional-variablesal salir de Emacs. Entonces, en la última línea, simplemente le decimos a Emacs que "despropieda" el anillo de matar al salir. Tenga en cuenta que esto sucede antes savehisthace lo suyo porque add-hook antepone las funciones de forma predeterminada, por unpropertize-kill-ringlo que se llamará antes savehist-autosave(que es la función real que se ejecuta al salir de Emacs).

itsjeyd
fuente
¿Estás al tanto savehist-save-hook?
PythonNut
1
@PythonNut Sí, lo estoy. Si nunca llama savehist-savemanualmente, puede agregar la función para "despropertizar" cadenas en savehist-save-hooklugar de kill-emacs-hook. Pero si desea conservar la opción de llamar savehist-savedurante una sesión de edición sin perder las propiedades de texto de las entradas recientes de kill ring, kill-emacs-hookes una mejor opción.
itsjeyd
Gracias, solo quería asegurarme de que no fuera una solución.
PythonNut
6

Una solución simple es usar savehist-20.el.

Es una versión savehist.elque funciona con todas las versiones de Emacs (20+). Despoja automáticamente los elementos del historial de las propiedades, y no guarda variables en savehist-additional-variablescuyos valores son cadenas de propiedad.

En otras palabras, puede leer el archivo que guarda incluso en una versión de Emacs (por ejemplo, 20) que irrita las cadenas de propiedad.

Dibujó
fuente
Básicamente, todos los elementos kill-ringson propiedad, por lo que parece que esto eliminaría la kill-ringventa al por mayor.
PythonNut
Si. (Si no quiere eso, puede modificar una línea del código).
Drew