小编Jas*_*ins的帖子

如何防止Emacs设置撤消边界?

我编写了一个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)

emacs elisp undo

10
推荐指数
1
解决办法
923
查看次数

标签 统计

elisp ×1

emacs ×1

undo ×1