Elisp:这是预期行为的预期行为吗?

时间:2014-01-02 15:45:48

标签: emacs elisp

起始条件是*scratch*中的此文字:

(
form
30
)

(
   baz
  41
)

空白是这里唯一重要的事情。 现在,通过o中的form点,使用 M进行评估 - eval-expression) 这段代码:

(save-excursion
  (up-list)
  (backward-list)
  (indent-sexp))

给出

(
 form
 30
 )

orm0az1上的点重复相同(预期)行为。

但是,对于f3b4的起点,结果点是之前的一个字符 预期的位置。

这是预期的行为还是错误? 如果是预期的话,我想了解更多有关规则和边缘情况的信息。

UPD:添加直观的保存 - 偏移变体

万一有人会想要它, 这是对我来说更直观的行为(即保存点f3等):

(defmacro save-excursion-ex (&rest body)
  "More intuitive (`save-excursion' BODY)."
  `(let ((ext (save-match-data
                (looking-back "^\\s-*")))
         (out (save-excursion
                ,@body)))
     (if ext
         (if (or (bolp)
                 (= (point)
                    (save-excursion
                      (back-to-indentation)
                      (point))))
             (back-to-indentation)
           (error "Unexpected")))
     out)) 

1 个答案:

答案 0 :(得分:4)

在Emacs中,该点被视为“之前”(point)。 因此,当indent-sexp插入空格时,它会在点后插入。 例如,当您说该点在f上时,它实际上位于f之前的行的开头,而indent-sexp之后插入空格并且< em>之前 f

一般规则是,如果该点位于行的开头和行中的第一个非空白字符之间,则它将结束于行的开头,否则它将保留其相对于周围文本的位置。

以这种方式思考:我们通过

缩进代码
  1. 删除所有前导空白
  2. 根据需要插入前导空白
  3. 所以,答案是:这是预期的行为。

    更多的是你的问题隐含的要点,没有理由依靠缩进后的点的具体位置如果该点与标准化的空格相邻。 如果您需要使代码正常工作,请在缩进调用后添加(goto-char (line-beginning-position))(或等效代码),然后跳到您要操作的位置。