Dải thuộc tính văn bản trong savehist


7

Tôi lưu gói kill-ringbằng cách sử dụng savehist. savehistlưu vòng kill với các thuộc tính văn bản còn nguyên vẹn.

Thật không may, đây là một vấn đề.

Tôi có một cấu hình emacs khá lớn và tôi sử dụng nhiều điểm nhấn. Đây là yếu tố đầu tiên của tôikill-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))))

Về bản chất, các thuộc tính văn bản làm tôi ~/.emacs.d/savehisttăng gần 100%. Tôi đang xem xét ~ 30 MB vòng giết. Điều này là xấu cho tất cả các loại lý do. Không ít bởi vì nó làm cho emacs rất chậm.

Làm cách nào tôi có thể yêu savehistcầu tách các thuộc tính văn bản khỏi kill-ringtrước khi lưu mà không xóa các thuộc tính cho phiên hiện tại?

Câu trả lời:


11

Thêm phần sau vào tệp init của bạn:

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

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

Làm thế nào nó hoạt động

substring-no-propertiesloại bỏ bất kỳ thuộc tính văn bản từ một chuỗi nhất định. kill-ringlà một danh sách các chuỗi; chúng tôi đang sử dụng mapcarđể áp dụng substring-no-propertiescho từng chuỗi hiện đang trong vòng khử. Kết quả của mapcarcuộc gọi (nghĩa là một danh sách các chuỗi không có thuộc tính văn bản nào) được sử dụng để ghi đè giá trị ban đầu của kill-ring.

savehist-modelưu lịch sử xe buýt nhỏ và bất kỳ biến số bổ sung savehist-additional-variablesnào khi bạn thoát Emacs. Vì vậy, trong dòng cuối cùng, chúng tôi chỉ đơn giản nói với Emacs "không kích hoạt" vòng diệt khi thoát. Lưu ý rằng điều này xảy ra trước khi savehistlàm điều mình vì add-hook prepends chức năng theo mặc định, vì vậy unpropertize-kill-ringsẽ được gọi trước savehist-autosave(đó là chức năng thực tế đó được thực hiện khi bạn thoát khỏi Emacs).


Bạn có biết savehist-save-hookkhông?
PythonNut

1
@PythonNut Có tôi đây. Nếu bạn không bao giờ gọi savehist-savethủ công, bạn có thể thêm chức năng cho các chuỗi "không cải thiện" savehist-save-hookthay vì kill-emacs-hook. Nhưng nếu bạn muốn duy trì tùy chọn gọi điện savehist-savetrong một phiên chỉnh sửa mà không làm mất các thuộc tính văn bản của các mục nhập vòng giết gần đây, thì đó kill-emacs-hooklà một lựa chọn tốt hơn.
itjeyd

Cảm ơn bạn, tôi chỉ muốn chắc chắn rằng đó không phải là một giải pháp.
PythonNut

6

Một giải pháp đơn giản là sử dụng savehist-20.el.

Đây là phiên bản savehist.elhoạt động với tất cả các phiên bản Emacs (20+). Nó tự động loại bỏ các thành phần lịch sử của các thuộc tính và nó không lưu các biến trong savehist-additional-variablesđó các giá trị là các chuỗi được hợp lệ hóa.

Nói cách khác, bạn có thể đọc tệp mà nó lưu ngay cả trong phiên bản Emacs (ví dụ 20) mà barfs trên các chuỗi thích hợp.


Về cơ bản tất cả các yếu tố của kill-ringđược điều chỉnh, vì vậy có vẻ như điều này sẽ bỏ đi việc kill-ringbán buôn.
PythonNut

Đúng. (Nếu bạn không muốn điều đó thì bạn có thể tinh chỉnh một dòng mã.)
Drew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.