1

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

我正在尝试编写一个函数,它会自动将 TODO 注释插入我的代码中。我希望这个功能有一个“撤消选项”。

我想出了如何向缓冲区撤消列表添加标记:

(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)
  )
4

2 回答 2

3

只是不要碰buffer-undo-list。它会自动更新,insert因此它应该“正常工作”而无需您做任何特别的事情。

它的工作方式是,不是发明结合各种修改的新格式的撤消实体,撤消​​日志散布着边界,当您撤消时,两个边界之间的所有条目都“一步”撤消。通常在 read-eval-print 循环的每次迭代之后添加一个边界,因此在 99% 的情况下,它“正常工作”。

于 2013-06-09T16:13:57.537 回答
0

我知道这是一个老问题,但我只是偶然发现了这个问题,似乎(undo-auto-amalgamate)在我的命令开头加上一个明确(undo-boundary)的结尾就可以了。

于 2016-08-03T05:31:54.300 回答