【问题标题】:Making a region-indent-function keep the region marked使区域缩进功能保持区域标记
【发布时间】:2011-06-30 01:50:27
【问题描述】:

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

(defun haml-indent-region (start end)
  (save-excursion
    ...)
  (error "")) ;; Terrible hack

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

【问题讨论】:

  • 我不明白。 save-excursion 应该保存和恢复点和标记;即区域......抛出错误应该与它无关。这不是你观察到的行为吗?
  • 应该,但在这里我怀疑 Emacs 如何处理主要模式 indent-region-function 这就是问题所在。在调用此函数(没有错误)之后,该区域未被标记。至少这是我从测试中看到的。
  • 也许标记仍然设置但只是“停用”?您是否尝试过使用(activate-mark) 重新激活标记(从而突出显示该区域)?
  • 这不会改变任何事情。

标签: emacs elisp indentation


【解决方案1】:

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

诀窍是:deactivate-mark

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

所以只需在命令结束时执行此操作:

(setq deactivate-mark nil)

【讨论】:

  • 至少从 emacs 24.3.1 开始,直接使用 indent-region' calls (deactivate-mark)`,无需查询 deactivate-mark 变量。因此,当通过设置 indent-line-functionindent-region-function 的值来更改缩进行为时,不允许保留突出显示的区域。
猜你喜欢
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多