起始条件是*scratch*
中的此文字:
(
form
30
)
(
baz
41
)
空白是这里唯一重要的事情。
现在,通过o
中的form
点,使用 M进行评估 - (eval-expression
)
这段代码:
(save-excursion
(up-list)
(backward-list)
(indent-sexp))
给出
(
form
30
)
点o
。 r
,m
,0
,a
,z
,1
上的点重复相同(预期)行为。
但是,对于f
,3
,b
,4
的起点,结果点是之前的一个字符
预期的位置。
这是预期的行为还是错误? 如果是预期的话,我想了解更多有关规则和边缘情况的信息。
万一有人会想要它,
这是对我来说更直观的行为(即保存点f
,3
等):
(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))
答案 0 :(得分:4)
在Emacs中,该点被视为“之前”(point)
。
因此,当indent-sexp
插入空格时,它会在点后插入。
例如,当您说该点在f
上时,它实际上位于f
之前的行的开头,而indent-sexp
在之后插入空格并且< em>之前 f
。
一般规则是,如果该点位于行的开头和行中的第一个非空白字符之间,则它将结束于行的开头,否则它将保留其相对于周围文本的位置。
以这种方式思考:我们通过
缩进代码所以,答案是:这是预期的行为。
更多的是你的问题隐含的要点,没有理由依靠缩进后的点的具体位置如果该点与标准化的空格相邻。
如果您需要使代码正常工作,请在缩进调用后添加(goto-char (line-beginning-position))
(或等效代码),然后跳到您要操作的位置。