【问题标题】:indent-rigidly in function won't undo缩进-严格的功能不会撤消
【发布时间】:2015-08-26 15:23:58
【问题描述】:

我正在尝试编写一个 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 返回 true 时尝试撤消缩进时,第一行就不会返回到正确的位置。 我已经看到它既保持在缩进位置,又进一步增加了缩进;对于给定的文本块以一致的方式,但我看不到清晰的模式。例如,这是可能发生的一件事:

;;Initial
Indented
Lines
Of Text

;;After calling function
    Indented
    Lines
    Of Text

;;After undoing
    Indented
Lines
Of Text

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

【问题讨论】:

    标签: emacs elisp indentation undo region


    【解决方案1】:

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

    【讨论】:

    • 现在说得通了。我只需要将(setq deactivate-mark nil) 替换为(deactivate-mark),它就可以完美运行。我猜不应该在不理解的情况下复制代码。
    • 如果我正在实现这个功能,我会保持标记处于活动状态并将其扩展到第一行的开头。
    • @resueman 如果你想在你的命令之后停用标记,你应该使用(setq deactivate-mark t) 而不是自己停用它。
    • @Stefan 这是记录在案的方法,所以我认为它在改变区域行为的其他模式下表现更好。
    • 你在哪里看到这个文件?
    【解决方案2】:

    最好的办法是调用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) {
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2018-04-23
      • 1970-01-01
      • 2014-05-26
      • 2013-10-03
      相关资源
      最近更新 更多