使用区域缩进函数保持区域标记

Nic*_*roi 5 emacs elisp indentation

我在使用 haml-mode 时遇到了麻烦region-indent-function,我正在尝试在另一个主要模式中重用它。我们应该能够通过在评估 haml-indent-region 后保持区域标记来循环区域缩进,但它无法按预期工作。经过一些修改后,我发现在函数末尾抛出错误会使 Emacs 保留该区域的标记,如下例所示:

(defun haml-indent-region (start end)
  (save-excursion
    ...)
  (error "")) ;; Terrible hack
Run Code Online (Sandbox Code Playgroud)

但我真的不喜欢它。有没有一种干净的方法可以在没有如此可怕的黑客攻击的情况下获得这种行为?

nsc*_*hum 3

命令完成后该区域会重置,因此调用 activate-mark 不会产生任何效果。抛出错误(非本地退出)显然会阻止此步骤,但这可能是一个错误。

诀窍是:deactivate-mark

如果编辑命令将此设置为 t,则随后停用该标记。命令循环在每个命令之前将其设置为 nil,并在命令返回时测试该值。缓冲区修改将 t 存储在此变量中。

因此,只需在命令末尾执行此操作:

  (setq 停用-标记为零)

  • 至少从 emacs 24.3.1 开始,“indent-region”直接调用“(deactivate-mark)”,而不查询“deactivate-mark”变量。因此,当通过设置“indent-line-function”或“indent-region-function”的值来更改缩进行为时,不允许保留突出显示的区域。 (2认同)