Emacs 在haskell模式2.7中,强制haskell缩进模式超过haskell缩进模式?

Emacs 在haskell模式2.7中,强制haskell缩进模式超过haskell缩进模式?,emacs,haskell,indentation,Emacs,Haskell,Indentation,我是一个Emacs用户,没有配置编辑器的技能。从2.4升级到2.7后,我注意到两个变化: 缩进在某种程度上是不同的,我不太喜欢。我不太清楚它是什么 更重要的是:如果启用cua模式并高亮显示一块文本,则backspace/delete不会删除整个块,只删除标记中的上一个/下一个字符 我看到haskell模式2.7默认使用次要模式haskell缩进模式,而2.4的行为以haskell缩进模式的形式保留下来。如果先禁用前者,然后启用后者,则会恢复所需的行为(即缩进感觉像以前一样,退格/删除删除高亮

我是一个Emacs用户,没有配置编辑器的技能。从2.4升级到2.7后,我注意到两个变化:

  • 缩进在某种程度上是不同的,我不太喜欢。我不太清楚它是什么
  • 更重要的是:如果启用cua模式并高亮显示一块文本,则backspace/delete不会删除整个块,只删除标记中的上一个/下一个字符
我看到haskell模式2.7默认使用次要模式haskell缩进模式,而2.4的行为以haskell缩进模式的形式保留下来。如果先禁用前者,然后启用后者,则会恢复所需的行为(即缩进感觉像以前一样,退格/删除删除高亮显示的块)

但是,我无法在打开后缀为.hs的文件时自动执行此操作。我试过各种类似的东西

(remove-hook 'haskell-mode-hook 'turn-on-haskell-indentation-mode)
(add-hook 'haskell-mode-hook 'turn-on-haskell-indent-mode)
诸如此类,但我要么使用标准模式,要么使用无缩进和doc的纯haskell模式

有什么想法吗

解决方案(感谢nominolo)

(remove-hook 'haskell-mode-hook 'turn-on-haskell-indent)
(remove-hook 'haskell-mode-hook 'turn-on-haskell-indentation)
(add-hook 'haskell-mode-hook 'my-haskell-mode-hook)
(defun my-haskell-mode-hook ()
   (haskell-indentation-mode -1) ;; turn off, just to be sure
   (haskell-indent-mode 1)       ;; turn on indent-mode
   )

配置这些东西的最佳方法是编写自定义挂钩:

(add-hook 'haskell-mode-hook 'my-haskell-mode-hook)

(defun my-haskell-mode-hook ()
   (haskell-indentation-mode -1) ;; turn off, just to be sure
   (haskell-indent-mode 1)       ;; turn on indent-mode

   ;; further customisations go here.  For example:
   (setq locale-coding-system 'utf-8 )
   (flyspell-prog-mode)  ;; spell-checking in comments and strings
   ;; etc.      

   )

您也可以在其中粘贴一个匿名函数,但是如果您想尝试一些设置,则使用命名函数更容易。只需重新定义函数(并重新打开Haskell文件)就可以提供新的行为。

答案很好;这比我以前使用的随机
addhook
s模式要好得多。谢谢可悲的是,这对我没有帮助。我将您提供的代码添加到my.emacs中,但当我打开.hs haskell缩进模式时,该模式仍处于启用状态。运行
M-x haskell缩进模式
会按预期关闭它。@gspr:这可能是因为后面运行了另一个钩子。使用
C-h v haskell模式挂钩
查看活动挂钩。或者,似乎实际上有三种缩进模式,所以也许你需要关闭另一种模式?啊,太好了,这很有帮助!原来
我的haskell模式挂钩
打开haskell缩进
打开haskell缩进
之前就已经存在了。很抱歉,我不能向上投票。显然,我这样做了,然后再次删除了它(无意中),现在它说我的投票被锁定了。