Emacs shell脚本模式钩子

时间:2012-01-17 10:11:27

标签: bash shell emacs

由于某种原因,我的shell脚本模式挂钩不会被执行。我的.emacs中的示例:

(add-hook 'shell-script-mode-hook (lambda () (rainbow-delimiters-mode 1)))

导致设置变量,但未为打开的脚本文件加载模式。在这里挂钩的正确方法是什么?

我使用默认的shell脚本模式(modeline表示例如Shell-script[bash])。我是否必须单独挂钩每个shell类型(sh,bash,zsh)?如果是的话,请告诉我怎么做?

非常感谢!

EDIT3:

原来是由于textmate模式与sh-mode中的骨架对插入冲突(我试图通过在sh模式下禁用textmate来避免冲突,然后离开sh-mood-hook废墟中的aparatus。我完全删除了textmate模式,现在使用标准的骨架对approch globaly。

我会接受phils回答 - 没有他我可能无法自己调试。

EDIT2:

感谢phils,我认为他的评论让我们更接近解决方案。然而,彩虹分隔符并不是问题。我删除了除你的hello消息之外的所有sh-mode-hook并重新启动Emacs。当我打开.sh文件时,我得到了这个:

为shell类型bash设置缩进 设置缩进的东西 缩进变量现在是本地的。 shell类型bash的缩进设置 文件模式指定错误:(void-function nil)

注意没有“你好”的消息。 sh-mode-hook的值是: (nil (lambda nil (message "hello")))

我认为这个问题是第一个零值 - 虽然我没有看到它会被设置在任何地方。

如果我评价这个:

(setq sh-mode-hook t) (add-hook 'sh-mode-hook (lambda () (message "hello")))

我看到了hello消息,虽然重新启动后(我将这些行放在.emacs中)但它又消失了(nil再次位于挂钩之上)。

知道如何在安装时设置主动挂钩?

EDIT1: 我也试过了:

(add-hook 'sh-mode-hook (lambda () (rainbow-delimiters-mode 1)))

具有相同的否定结果 - 不确定这是否相关,但是......

2 个答案:

答案 0 :(得分:10)

shell-script-modesh-mode的别名。我没有检查过,但我怀疑只评估'真实'函数名的钩子变量,所以我认为sh-mode-hook是要使用的。{/ p>

无论如何,你的语法没有什么破坏,所以使用(rainbow-delimiters-mode 1)可能会有些不对劲。例如,您应该能够观察到以下情况正常:

(add-hook 'sh-mode-hook (lambda () (message "hello")))

FWIW,对于钩子我建议根本不使用匿名函数,只是因为它的很多更容易更新你的钩子函数(如果它被命名)(在添加更新之前从变量中删除旧的lambda表达式)一个人在我的书中烦恼。)

答案 1 :(得分:-1)

尝试删除':

(add-hook 'shell-script-mode-hook (lambda () (rainbow-delimiters-mode 1)))