Tira propriedades de texto no savehist

7

Eu salvo o kill-ringusando o savehistpacote. savehistsalva o anel de morte com propriedades de texto intactas.

Infelizmente, isso é um problema.

Eu tenho uma configuração bastante grande do emacs e uso muitos destaques. Aqui está o primeiro elemento do meukill-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))))

Em essência, as propriedades do texto aumentam ~/.emacs.d/savehistquase o meu fator por 100. Estou vendo ~ 30 MB de kill ring. Isso é ruim por todos os tipos de razões. Não menos importante, porque torna o emacs muito lento.

Como posso savehistremover as propriedades do texto kill-ringantes de salvar, sem excluir as propriedades da sessão atual?

PythonNut
fonte

Respostas:

11

Adicione o seguinte ao seu arquivo init:

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

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

Como funciona

substring-no-propertiesremove todas as propriedades de texto de uma determinada sequência. kill-ringé uma lista de strings; estamos usando mapcarpara aplicar substring-no-propertiesa cada string que está atualmente no ringue. O resultado da mapcarchamada (ou seja, uma lista de cadeias sem propriedades de texto) é usado para substituir o valor original de kill-ring.

savehist-modesalva o histórico do minibuffer e quaisquer variáveis ​​adicionais savehist-additional-variablesquando você sai do Emacs. Então, na última linha, simplesmente dizemos ao Emacs para "despropertizar" o anel de morte ao sair. Observe que isso acontece antes savehist, porque add-hook precede funções por padrão, portanto unpropertize-kill-ringserá chamado antes savehist-autosave(que é a função real que é executada quando você sai do Emacs).

itsjeyd
fonte
Você está ciente savehist-save-hook?
precisa saber é o seguinte
11
@PythonNut Sim, eu sou. Se você nunca ligar savehist-savemanualmente, poderá adicionar a função para "despropertização" de strings em savehist-save-hookvez de kill-emacs-hook. Mas se você quiser preservar a opção de ligar savehist-savedurante uma sessão de edição sem perder as propriedades de texto das entradas recentes do anel de interrupção, kill-emacs-hooké uma escolha melhor.
itsjeyd
Obrigado, eu só queria ter certeza de que não era uma solução.
precisa saber é o seguinte
6

Uma solução simples é usar savehist-20.el.

É uma versão savehist.elque funciona com todas as versões do Emacs (20+). Ele remove automaticamente os elementos históricos das propriedades e não salva variáveis ​​em savehist-additional-variablescujos valores são seqüências de caracteres apropriadas.

Em outras palavras, você pode ler o arquivo que ele salva, mesmo em uma versão do Emacs (por exemplo, 20), que vomita em seqüências de caracteres apropriadas.

Desenhou
fonte
Basicamente, todos os elementos de kill-ringsão propriedade, por isso parece que isso jogaria fora o kill-ringatacado.
precisa saber é o seguinte
Sim. (Se você não quer isso, então você pode ajustar uma linha de código.)
de Drew