Entfernen Sie die Texteigenschaften in savehist

7

Ich speichere das kill-ringmit dem savehistPaket. savehistSpeichert den Kill Ring mit intakten Texteigenschaften.

Dies ist leider ein Problem.

Ich habe eine ziemlich große Emacs-Konfiguration und verwende viel Hervorheben. Hier ist das erste Element von mirkill-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))))

Im Wesentlichen ~/.emacs.d/savehistblähen sich die Texteigenschaften um fast den Faktor 100 auf. Ich betrachte ~ 30 MB Kill Ring. Das ist aus allen möglichen Gründen schlecht. Nicht zuletzt, weil es Emacs sehr langsam macht.

Wie kann ich feststellen savehist, dass Texteigenschaften kill-ringvor dem Speichern entfernt werden sollen, ohne die Eigenschaften für die aktuelle Sitzung zu löschen?

PythonNut
quelle

Antworten:

11

Fügen Sie Ihrer Init-Datei Folgendes hinzu:

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

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

Wie es funktioniert

substring-no-propertiesEntfernt alle Texteigenschaften aus einer bestimmten Zeichenfolge. kill-ringist eine Liste von Zeichenfolgen; Wir verwenden mapcar, um substring-no-propertiesauf jede Zeichenfolge anzuwenden , die sich derzeit im Kill-Ring befindet. Das Ergebnis des mapcarAufrufs (dh eine Liste von Zeichenfolgen ohne Texteigenschaften) wird verwendet, um den ursprünglichen Wert von zu überschreiben kill-ring.

savehist-modeSpeichert den Minibuffer-Verlauf und alle zusätzlichen Variablen, savehist-additional-variableswenn Sie Emacs beenden. In der letzten Zeile sagen wir Emacs einfach, dass er den Kill-Ring beim Beenden "entpropertisieren" soll. Beachten Sie, dass dies geschieht, bevor es savehistfunktioniert, da Funktionen standardmäßig add-hook vorangestellt werden und daher unpropertize-kill-ringvorher aufgerufen werden savehist-autosave(dies ist die eigentliche Funktion, die ausgeführt wird, wenn Sie Emacs beenden).

itsjeyd
quelle
Ist dir das bewusst savehist-save-hook?
PythonNut
1
@ PythonNut Ja, das bin ich. Wenn Sie nie savehist-savemanuell aufrufen , können Sie savehist-save-hookanstelle von die Funktion zum "Aufheben der Propertierung" hinzufügen kill-emacs-hook. Wenn Sie jedoch die Option beibehalten möchten, savehist-savewährend einer Bearbeitungssitzung aufzurufen, ohne die Texteigenschaften der letzten Kill-Ring-Einträge zu verlieren, kill-emacs-hookist dies die bessere Wahl.
Itsjeyd
Danke, ich wollte nur sicherstellen, dass das keine Lösung ist.
PythonNut
6

Eine einfache Lösung ist die Verwendung savehist-20.el.

Es ist eine Version davon savehist.el, die mit allen Emacs-Versionen (20+) funktioniert. Es entfernt automatisch Verlaufselemente von Eigenschaften und speichert keine Variablen, in savehist-additional-variablesderen Werten sich Zeichenfolgen befinden.

Mit anderen Worten, Sie können die gespeicherte Datei auch in einer Emacs-Version (z. B. 20) lesen, die auf Eigenschaften von Zeichenfolgen steht.

Drew
quelle
Grundsätzlich sind alle Elemente von kill-ringEigentum, so dass es so klingt, als würde dies den kill-ringGroßhandel wegwerfen .
PythonNut
Ja. (Wenn Sie das nicht wollen, können Sie eine Zeile des Codes optimieren.)
Drew