我编写了一个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))))
Run Code Online (Sandbox Code Playgroud)
此函数创建临时缓冲区,插入文本,调用
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))))
Run Code Online (Sandbox Code Playgroud)
当我调用时M-x test-shell-command-on-region,区域将替换为大写文本,但是当我按C-_(undo)时,撤消历史记录中的第一步是删除文本的状态.退回两步,恢复原始文本.
我的问题是,如何防止中间步骤被添加到撤消历史记录中?我已经阅读了有关撤消的Emacs文档,但就我所知,它似乎并没有解决这个问题.
这是一个函数,它通过调用内置的Emacs函数完成同样的事情upcase,就像之前一样:在
delete-and-extract-region结果传递给
insert:
(defun test-upcase-region …Run Code Online (Sandbox Code Playgroud)