2011-06-30 44 views
4

我遇到了haml-mode的region-indent-function问题,我试图在另一个主要模式中重复使用。我们应该能够通过在haml-indent-region被排除之后保持区域被标记来循环区域缩进,但它不能按预期工作。经过一番黑客左右,我发现,在函数的末尾抛出一个错误使得Emacs的保持标记的区域中,如本例:使区域缩进功能保持区域标记

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

但我真的不喜欢它。有没有这样一个可怕的黑客得到这种行为的干净方式?

+1

我不明白。 'save-excursion'应保存并恢复点和标记;即该地区......抛出一个错误应该与它无关。这不是你观察到的行为吗? – Nemo

+0

它应该,但在这里我怀疑Emacs是如何处理主要模式缩进区域功能的问题。在这个函数被调用之后(没有错误)该区域未被标记。至少这是我从测试中看到的。 –

+0

也许标记仍然设置,但只是“停用”?你是否尝试过使用'(activate-mark)'来重新激活标记(从而突出显示该区域)? – Nemo

回答

3

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

诀窍是:deactivate-mark

如果编辑命令设置该至t,随后去激活的标志。 命令循环在每个命令 之前将其设置为零,并在命令返回时测试该值。 缓冲区修改将t存储在此变量中。

所以才这样做在你的命令的末尾:

 
    (setq deactivate-mark nil) 
+1

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