我试图绑定一个键,将一个字符插入当前缓冲区。
(global-set-key (kbd "<some-key>")
(lambda ()
(interactive)
(insert-char ?\c)))
这样可以正常工作,但是当我多次调用它时,请拨打undo
,只撤消最后一个字符。
如何让Emacs撤消所有连续插入--Emacs使用self-insert-command
进行插入的方式?
答案 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