*.zsh
文件以默认模式(对我来说是文本模式)打开。但是,sh-mode
实际上包括了zsh
、bash
等多种行为方式。我该如何告诉Emacs在*.zsh
文件中特别使用zsh
风格的sh-mode
?
sh-mode的味道是从shebang行(脚本的第一行)自动检测到的。如果您有“#!/bin/zsh”,则将假定为zsh,并且(例如)autoload
将被识别为关键字。如果第一行是“#!/bin/bash”,则autoload
将不被识别为这样。
要使emacs将*.zsh文件识别为shell脚本,只需将此添加到您的init文件中:
(add-to-list 'auto-mode-alist '("\\.zsh\\'" . sh-mode))
当您不想使用shebang时,选择口味的一种程序化方法是在sh-mode缓冲区中执行以下操作:
(sh-set-shell "zsh")
所以在你的情况下,除非你使用shebang,否则你需要更新auto-mode-alist如上所述,并
(add-hook 'sh-mode-hook
(lambda ()
(if (string-match "\\.zsh$" buffer-file-name)
(sh-set-shell "zsh"))))
(add-to-list 'auto-mode-alist'("\\.zsh\\'" . sh-mode))
完全没有效果?sh-mode
已经安装,我可以手动启动它,没有问题。 - marczellm#!
shebang,你都可以使用文件模式行或本地变量部分来设置shell脚本模式。只要在你的脚本中有其中之一,即使你没有更新auto-mode-alist,Emacs也会做正确的事情,因此建议对于任何非标准的文件扩展名都这样做。-*- mode: sh -*-
。它应该在注释中,并且必须出现在第一行(如果第一行是shebang行,则为第二行)。# Local Variables:
# mode: sh
# End:
# Local Variables:
# mode: sh
# eval: (sh-set-shell "zsh")
# End:
如果您使用shebang方法,一个更强大的形式是
#!/usr/bin/env zsh
# env will search the path for zsh. Some distros may put it a different place.
# env is pretty much guaranteed to be in /usr/bin
auto-mode-alist
,将.zsh
后缀映射到您想要的模式。 - Barmar