更新:我的原始问题得到了解答,但我想知道更一般的方法 - 如何定义多个操作,这些操作将使用单个C - /撤消。
我正在尝试编写一个能够自动在我的代码中插入TODO注释的函数。我希望这个函数有一个“撤消选项”。
我想出了如何在buffer-undo-list中添加标记:
(setq buffer-undo-list (cons (point) buffer-undo-list))
这允许我将该点返回到执行此函数的位置(如果我决定撤消)。
我的问题是:如何在buffer-undo-list中添加多个插入?我的意思是我的函数中有多个(插入str)语句,但是我想用一个C- /(如果我决定撤消)将它们全部撤消。
我试图从具有此属性的其他函数中精确复制,但这没有用。下面的代码就是我现在的代码:
(defun insert-todo ()
"Appednd 'TODO username: date - ' at the end of line and set point
to where this string ends"
(interactive)
(setq buffer-undo-list (cons (point) buffer-undo-list)) ;; save the point for undo
(save-excursion
(end-of-line)
(setq eol (point))
(let ((buffer-undo-list t)) ;; do not record following commands for undo
(insert " " comment-start (save-excursion comment-end))
(insert (format " TODO %s: " (getenv "USER")) (format-time-string "%d.%m.%Y") " - ")
(setq buffer-undo-list (cons (cons eol (point)) buffer-undo-list))))
(end-of-line)
)
答案 0 :(得分:3)
请勿触摸buffer-undo-list
。它会自动更新为insert
的一部分,所以它应该“正常工作”而不会做任何特别的事情。
它的工作方式是,不是发明组合各种修改的撤消内容的新格式,而是撤消日志中的边界,当你撤消时,两个边界之间的所有条目都“一步”撤消。通常在读取 - 评估 - 打印循环的每次迭代之后添加边界,因此在99%的情况下,它“正常工作”。
答案 1 :(得分:0)
我知道这是一个老问题,但我只是偶然发现了这个问题,似乎将$field_key = "field_5039a99716d1d";
$field = get_field_object($field_key);
放在我的命令的开头,并在最后放置一个明确的(undo-auto-amalgamate)
就可以了。