Elisp - 将多个插入添加到buffer-undo-list(保存撤消信息)

时间:2013-06-09 14:37:21

标签: emacs elisp

更新:我的原始问题得到了解答,但我想知道更一般的方法 - 如何定义多个操作,这些操作将使用单个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)
  )

2 个答案:

答案 0 :(得分:3)

请勿触摸buffer-undo-list。它会自动更新为insert的一部分,所以它应该“正常工作”而不会做任何特别的事情。

它的工作方式是,不是发明组合各种修改的撤消内容的新格式,而是撤消日志中的边界,当你撤消时,两个边界之间的所有条目都“一步”撤消。通常在读取 - 评估 - 打印循环的每次迭代之后添加边界,因此在99%的情况下,它“正常工作”。

答案 1 :(得分:0)

我知道这是一个老问题,但我只是偶然发现了这个问题,似乎将$field_key = "field_5039a99716d1d"; $field = get_field_object($field_key); 放在我的命令的开头,并在最后放置一个明确的(undo-auto-amalgamate)就可以了。