Elisp -向缓冲区撤消列表添加多个插入(保存撤消信息)



更新:我原来的问题得到了回答,但我想知道更一般的方法-我如何定义多个操作,这些操作将用单个C-/.

我试图写一个函数,将自动插入TODO评论到我的代码。我希望这个函数有一个"撤销选项"。

我想出了如何在buffer-undo-list中添加一个标记:

(setq buffer-undo-list (cons (point) 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)
  )

就是不要碰buffer-undo-list。它是作为insert的一部分自动更新的,所以它应该"只是工作",而不需要你做任何特别的事情。

它的工作方式是,而不是发明新的格式的撤销实体,结合各种修改,撤销日志是零星的边界,当你撤销,两个边界之间的所有条目被撤销"一步"。通常在每次read-eval-print循环迭代之后添加边界,因此在99%的情况下,它"正常工作"。

我知道这是一个老问题,但我只是偶然发现了这个问题,似乎把(undo-auto-amalgamate)放在我的命令的开头,并在最后明确的(undo-boundary)做到了这一点。

最新更新