我编写了一个 Emacs Lisp 函数,它调用一个 shell 命令来处理给定的字符串并返回结果字符串。这是一个简化的示例,它只是调用tr
将文本转换为大写:
(defun test-shell-command (str)
"Apply tr to STR to convert lowercase letters to uppercase."
(let ((buffer (generate-new-buffer "*temp*")))
(with-current-buffer buffer
(insert str)
(call-process-region (point-min) (point-max) "tr" t t nil "'a-z'" "'A-Z'")
(buffer-string))))
该函数创建一个临时缓冲区,插入文本,调用
tr
,用结果替换文本,并返回结果。
上述函数按预期工作,但是,当我围绕该函数编写一个包装器以将命令应用于该区域时,将两个步骤添加到撤消历史记录中。这是另一个例子:
(defun test-shell-command-region (begin end)
"Apply tr to region from BEGIN to END."
(interactive "*r")
(insert (test-shell-command (delete-and-extract-region begin end))))
当我调用 时M-x test-shell-command-on-region
,该区域被替换为大写文本,但是当我按下C-_
( undo
) 时,撤消历史记录中的第一步是删除文本的状态。后退两步,恢复原文本。
我的问题是,如何防止将中间步骤添加到撤消历史记录中?我已经阅读了有关 undo 的 Emacs 文档,但据我所知,它似乎没有解决这个问题。
这是一个函数,它通过调用内置的 Emacs 函数来完成同样的事情upcase
,就像以前一样:在结果上
delete-and-extract-region
,结果被传递给
insert
:
(defun test-upcase-region (begin end)
"Apply upcase to region from BEGIN to END."
(interactive "*r")
(insert (upcase (delete-and-extract-region begin end))))
调用M-x test-upcase-region
时,正如预期的那样,撤消历史记录中只有一步。因此,调用似乎是
test-shell-command
创建撤消边界的情况。可以以某种方式避免吗?