有很多方法可以折叠Emacs中的代码,我已经决定使用轮廓次要模式......它很棒!
然而,当我关闭并重新打开文件时,我真的希望我的折叠能够持久化。以我喜欢的方式在文件中设置折叠是非常令人沮丧的,只是在重新启动Emacs时丢失了。
有没有人找到一种方法来保持文件的折叠状态持久?
答案 0 :(得分:6)
编辑:现在我明白了这个问题......
如下所示的代码如何?它似乎对我有用,虽然我还没弄明白如何避免每次都提示输入文件局部变量。
(defvar omm-state nil
"file local variable storing outline overlays")
(defun omm-state-mode (&optional arg)
"poor man's minor mode to re-apply the outline overlays "
(interactive)
(omm-re-enable-outline-state)
(add-hook 'before-save-hook 'omm-state-save))
(defun omm-get-all-overlays ()
"return a list of outline information for all the current buffer"
(save-excursion
(let ((all-overlays (overlays-in (point-min) (point-max))))
(mapcar (lambda (o)
(list (overlay-start o) (overlay-end o) (overlay-get o 'invisible)))
(reverse all-overlays)))))
(defun omm-re-enable-outline-state (&optional arg)
"turn on outline-minor-mode and re-apply the outline information"
(outline-minor-mode 1)
(when (listp omm-state)
(mapcar (lambda (p)
(apply 'outline-flag-region p))
omm-state)))
(defun omm-state-save ()
"save the outline state in a file local variable
Note: this just replaces the existing value, you need to start
it off by adding something like this to your file:
# Local Variables:
# omm-state:()
# mode:omm-state
# End:
"
(ignore-errors
(save-excursion
(goto-char (point-max))
(when (search-backward "omm-state:" nil t)
(goto-char (match-end 0))
(kill-sexp)
(princ (omm-get-all-overlays) (current-buffer)))))
nil)
此解决方案要求您使用以下内容“播种”文件:
# Local Variables:
# omm-state:()
# mode:omm-state
# End:
答案 1 :(得分:3)
我意识到这是一个很老的帖子,但是FWIW我创建了一个辅助模式,补充了hs-minor-mode,outline-mode等等。我也非常希望我的折叠在我关闭并重新打开时保持不变文件&#34 ;. :)
该软件包目前处于MELPA状态,称为持久覆盖。
它也可直接在github上使用:https://github.com/mneilly/Emacs-Persistent-Overlays