由于某种原因,我的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)))
具有相同的否定结果 - 不确定这是否相关,但是......
答案 0 :(得分:10)
shell-script-mode
是sh-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)))