由于某些原因,我的Shell脚本模式钩子不起作用。例如,在我的.emacs文件中:
``` (add-hook 'shell-script-mode-hook (lambda () (rainbow-delimiters-mode 1))) ```
可以设置变量,但是不能为打开的脚本文件加载模式。这里有什么正确的钩子方法?
我使用默认的Shell脚本模式(modeline显示例如`Shell-script[bash]`)。我需要为每个Shell类型(sh、bash、zsh)单独钩住吗?如果是,请告诉我如何操作。
谢谢!
编辑3: 问题出在textmate-mode与sh-mode中的skeleton-pair-insert冲突(我尝试通过在sh-mode中禁用textmate来避免冲突,但这让sh-mood-hook陷入了混乱。我已彻底删除了textmate-mode,并现在在全局使用标准的skeleton-pair方法。
我将接受phils的答案 - 没有他,我可能无法自行调试出这个问题。
编辑2: 感谢phils,我认为他的评论让我们更接近解决方案。虽然这不是rainbow-delimiters的问题。我删除了除了你的hello消息之外的所有sh-mode-hook,并重新启动了Emacs。当我打开.sh文件时,我得到这个:
``` Setting up indent for shell type bash setting up indent stuff Indentation variables are now local. Indentation setup for shell type bash File mode specification error: (void-function nil) ```
请注意,没有“hello”消息。 sh-mode-hook的值为:
``` (nil (lambda nil (message "hello"))) ```
我认为问题出在第一个nil值上,尽管我不见得它会在任何地方设置。
如果我评估这个:
``` (setq sh-mode-hook t) (add-hook 'sh-mode-hook (lambda () (message "hello"))) ```
我看到了hello消息,但是重新启动之后(我将这些行放在.emacs中),它又消失了(nil再次在钩子的顶部)。
有什么办法让设置时处于活动状态的钩子吗?
编辑1: 我也尝试了以下操作:
``` (add-hook 'sh-mode-hook (lambda () (rainbow-delimiters-mode 1))) ```
结果相同,但不确定是否相关...
``` (add-hook 'shell-script-mode-hook (lambda () (rainbow-delimiters-mode 1))) ```
可以设置变量,但是不能为打开的脚本文件加载模式。这里有什么正确的钩子方法?
我使用默认的Shell脚本模式(modeline显示例如`Shell-script[bash]`)。我需要为每个Shell类型(sh、bash、zsh)单独钩住吗?如果是,请告诉我如何操作。
谢谢!
编辑3: 问题出在textmate-mode与sh-mode中的skeleton-pair-insert冲突(我尝试通过在sh-mode中禁用textmate来避免冲突,但这让sh-mood-hook陷入了混乱。我已彻底删除了textmate-mode,并现在在全局使用标准的skeleton-pair方法。
我将接受phils的答案 - 没有他,我可能无法自行调试出这个问题。
编辑2: 感谢phils,我认为他的评论让我们更接近解决方案。虽然这不是rainbow-delimiters的问题。我删除了除了你的hello消息之外的所有sh-mode-hook,并重新启动了Emacs。当我打开.sh文件时,我得到这个:
``` Setting up indent for shell type bash setting up indent stuff Indentation variables are now local. Indentation setup for shell type bash File mode specification error: (void-function nil) ```
请注意,没有“hello”消息。 sh-mode-hook的值为:
``` (nil (lambda nil (message "hello"))) ```
我认为问题出在第一个nil值上,尽管我不见得它会在任何地方设置。
如果我评估这个:
``` (setq sh-mode-hook t) (add-hook 'sh-mode-hook (lambda () (message "hello"))) ```
我看到了hello消息,但是重新启动之后(我将这些行放在.emacs中),它又消失了(nil再次在钩子的顶部)。
有什么办法让设置时处于活动状态的钩子吗?
编辑1: 我也尝试了以下操作:
``` (add-hook 'sh-mode-hook (lambda () (rainbow-delimiters-mode 1))) ```
结果相同,但不确定是否相关...
M-x rgrep
命令在.el
文件中搜索sh-mode-hook
,看看是否有其他东西正在干扰它。听起来好像在你的add-hook
之后,还有其他东西执行了类似于(add-hook 'sh-mode-hook nil)
的操作。 - phils(setq sh-mode-hook t)
而不是(setq sh-mode-hook nil)
感到困惑。它似乎没有引起问题,但它的作用是什么? - philsnil
和()
是相同的东西,因此(setq sh-mode-hook nil)
将变量设置为空列表(而不是包含值nil
的列表,这就是你看到的)。我很惊讶add-hook
可以在具有值t
(即不是列表)的变量上工作,但我看到它可以愉快地创建一个列表。 - phils