函数中的严格缩进不会撤消

indent-rigidly in function won't undo

我正在尝试编写一个 elisp 函数来缩进区域或当前行。我的功能是这样的:

(defun shift-text (distance)
  (interactive "p")
  (if (use-region-p)
      (save-excursion
        (let ((r-start (region-beginning))
              (r-end   (region-end)))
          (let ((i-start (progn (goto-char r-start) (line-beginning-position)))
                (i-end   (progn (goto-char r-end)   (line-end-position))))
            (indent-rigidly i-start i-end distance)
            (setq deactivate-mark nil))))
    (indent-rigidly (line-beginning-position)
                    (line-end-position)
                    distance)))

哪个工作正常。但是,当 use-region-p return 为真时,每当我尝试撤消缩进时,第一行都不会 return 到正确的位置。 我看到它既保持缩进位置,又进一步增加缩进;对于给定的文本块以一致的方式,但我看不到清晰的模式。因此,例如,这是可能发生的一件事:

;;Initial
Indented
Lines
Of Text

;;After calling function
    Indented
    Lines
    Of Text

;;After undoing
    Indented
Lines
Of Text

在此函数之外使用相同的参数调用 indent-rigidly 行为正常,因此我认为这一定是我正在做的事情。然而,唯一似乎可以解决的问题是将值硬编码为 indent-rigidly。 这是怎么回事?

撤消适用于该区域,该区域在 运行 您的功能后对我来说仍然有效。如果我 select 整行(在尝试撤消之前,或者首先在 运行 之前),或者停用标记,撤消对我来说是正确的,至少对于你的测试用例是这样。

最好的办法是调用 indent-rigidly 然后从新行开始:

#' My function. Does stuff with numbers.
#'
#' This takes an input `x` and does something with it.
#' @param x a number.
myFunction <- function (x) {
}