savehistのテキストプロパティを削除する


7

パッケージkill-ringを使用して保存しsavehistます。savehistテキストプロパティをそのままにしてキルリングを保存します。

残念ながら、これは問題です。

私はかなり大きなemacs設定を持っており、多くの強調表示を使用しています。これが私の最初の要素ですkill-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))))

本質的に、テキストのプロパティは~/.emacs.d/savehist、ほぼ100倍に膨らみます。私は、約30MBのキルリングを調べています。これはいろいろな理由で悪いです。特に、emacsが非常に遅くなるからです。

現在のセッションのプロパティを削除せずに、保存savehistするkill-ring前にテキストプロパティを削除するようにするにはどうすればよいですか?

回答:


11

以下をinitファイルに追加してください:

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

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

使い方

substring-no-properties指定された文字列からテキストプロパティを削除します。kill-ring文字列のリストです。現在キルリングにある各文字列mapcarに適用するsubstring-no-propertiesために使用しています。mapcar呼び出しの結果(つまり、テキストプロパティのない文字列のリスト)は、の元の値を上書きするために使用されますkill-ring

savehist-modesavehist-additional-variablesEmacsを終了すると、ミニバッファーの履歴と追加の変数が保存されます。したがって、最後の行では、Emacsに終了時にキルリングを「非固有化」するように指示しています。デフォルトで関数が前に付加されるsavehistため、これは前に行われることに注意してください。これは、前に呼び出されるためです(Emacsを終了したときに実行される実際の関数です)。add-hook unpropertize-kill-ringsavehist-autosave


知っていsavehist-save-hookますか?
PythonNut 2014

1
@PythonNutはい、そうです。savehist-save手動で呼び出さない場合は、のsavehist-save-hook代わりに「非正規化」文字列の関数をに追加できますkill-emacs-hook。ただしsavehist-save、最近のキルリングエントリのテキストプロパティを失わずに、編集セッション中に呼び出すオプションを保持する場合kill-emacs-hookは、より良い選択です。
itsjeyd 2014

ありがとう、私はそれが解決策ではないことを確認したかっただけです。
PythonNut 14

6

簡単な解決策の1つは、を使用することsavehist-20.elです。

それはのバージョンでsavehist.elすべてのEmacsのバージョン(20+)とその作品。プロパティの履歴要素は自動的に取り除かれsavehist-additional-variables、値がプロパティ化された文字列である変数は保存されません。

言い換えれば、Emacsのバージョン(例:20)でも、保存されたファイルを読み取ることができます。


基本的にの要素はkill-ringすべてプロパティ化されているため、これは卸売りを捨てるように聞こえkill-ringます。
PythonNut、2014

はい。(それが必要ない場合は、コードの1行を微調整できます。)
Drew
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.