wsug
1
如题,我现在是把org-mode当成一个浏览器页面来用了。
在所有浏览器的左上角都会有前进后退按钮,类似文本编辑器里面的undo,只不过撤销的是整个页面,而不是几个字符,但如果org文件的内容每次都是完全改变而不是只改变几个字符,这时的undo就不是几个字符了,是撤销整个buffer的内容,这时的undo和浏览器的后退按钮也就比较接近了
这时问题来了,org文件的内容是始终展开的,阅读过程中做了折叠,当undo后退回上一页面时内容再次全部展开,刚做的折叠的顺序状态没有了。
org-mode文件包含大量内容时内容被完全改变(或清空)这时按撤销回到上一页面,可不可以保持上一页面内容的展开和折叠顺序状态?
不知道org-mode能不能做到这点,如果不能的话我就改为不在频繁的改变org文件的内容
举例说明问题:把下面的文本复制到一个org文件中,将其折叠后在点击标题栏上的按钮,在undo回来,这时折叠的状态没有了
#+STARTUP:folded
* [[elisp:(erase-buffer)][点击清空当前org文件内容]]
先把这里内容折叠,在点击上面按钮,然后在undo撤销回到这里,能否保持折叠的状态?
wsug
3
搞定了,如图,现在把web后端返回的内容输出到了minibuffer,而不改变当前buffer
ipv6也用上了,现在的不足之处是web后端返回的中文内容输出在minibuffer都是乱码,只好先用英文
2 个赞
wsug
4
这个问题应该是有办法解决的
今天惊喜的发现用(hs-minor-mode)
来展开折叠代码时清空页面内容,在撤销回到上一页时。代码的展开折叠状态是保持的。
发现这个情况后我就在org-mode里启用了hs-minor-mode
,又以文学编程形式写了一段代码块测试,用hs-minor-mode折叠里面的代码,发现没有问题。不管我怎么(erase-buffer)
改变内容后undo,代码展开折叠状态是保持的,就是org-mode本身的展开折叠不行。
另外我看了vsc等编辑器,代码展开折叠的状态并不能在页面内容被清空的情况下保持,但是emacs
可以。
建议你重新组织一下你的提问。我感觉 2、3 楼可删掉。
去掉不必要的文字描述,不要把你当前做的、还没发布的东西卷进来,因为别人读了更混乱。
最好把问题放到阳春的环境下,这样每个人即容易看懂,又容易复现:
⋊> emacs -Q --eval "\
(progn
(switch-to-buffer \"*.org\")
(setq org-hide-emphasis-markers t)
(org-mode)
(insert \"Reproduce steps:
1. 折叠以下代码:
#+BEGIN_SRC c
int main(int argc, char *argv[])
{
return 0;
}
#+END_SRC
2. [[elisp:(erase-buffer)][点击清空当前 buffer 内容]]
3. Undo 回复删除内容\"))"
wsug
6
感谢提供问题复现代码,原先的2楼确实多余,删除,原3楼也属于这个问题的实际应用场景,先留着
wsug
7
这个问题困扰我几年了,今天终于在AI的提示下,暂时解决了。代码
(defun orgrxh-fold-state ()
"undo content save org-mode fold state"
(interactive)
(if (equal major-mode 'org-mode)
(progn
(save-excursion
(goto-line 2)
(let ((found nil))
(while (and (not found) (<= (line-number-at-pos) 9) (not (eobp)))
(if (looking-at "^#\\+startup: content");;
(setq found t)
(forward-line 1)));; next row
(if found
(org-content)
)))
) ))
(advice-add 'undo :after #'orgrxh-fold-state)
这并没有记住文件展开折叠的状态, 只是在undo中写了hook, 当undo执行返回上一页操作时检查页面中是否有 #+startup: content, 在把org文件恢复到指定的展开级别.
效果演示:

按chatGPT的说法,hs-minor-mode没有这个问题,是因为使用text-property设置文本的 invisible 属性, Emacs的undo系统会把 text property 的变动也一并记录, 清空buffer后undo不仅恢复文本,也恢复了invisible折叠状态.
org-mode的折叠通过overlay实现,不保存折叠状态, 除非把org的折叠逻辑改为text-property实现, 但非常复杂.