将文本命令插入到使用undo进行分组的Emacs中

时间:2015-03-04 23:07:42

标签: emacs insert elisp

我试图绑定一个键,将一个字符插入当前缓冲区。

(global-set-key (kbd "<some-key>")
  (lambda ()
    (interactive)
    (insert-char ?\c)))

这样可以正常工作,但是当我多次调用它时,请拨打undo,只撤消最后一个字符。

如何让Emacs撤消所有连续插入--Emacs使用self-insert-command进行插入的方式?

1 个答案:

答案 0 :(得分:1)

undo适用于buffer-undo-list,通常它会将列表中的条目处理到第一个nil元素(忽略第一个条目,如果它是nil)。有关详细信息,请参阅docstring。

如果您在每次调用buffer-undo-list后查看insert-char的值,您会看到其他nil和利弊已被添加到其中。

所以,如果你希望你的函数将插入分组到buffer-undo-list中的一组连续条目中,那么你必须让它在它调用之前删除列表开头的nil { {1}},但也许只有在最后一次调用函数时添加了insert-char。 (nil及其道德等价物,在内部用内部全局变量跟踪列表中的最后self-insert-command

我将只留下你自己的函数中的合并插入的后一部分(提示:在插入全局变量后使用nil保存指向当前撤消列表的指针,{{1在插入之前将该全局与撤消列表进行比较。

您的示例已修改为始终将其插入与撤消列表中的任何先前条目合并(并更正为正确使用setq):

eq