*.zsh
个文件在默认模式下打开(对我来说是文本模式)。但是,sh-mode实际上是多种模式,包括zsh,bash等的行为。如何告诉emacs专门以sh-mode的zsh风格打开*.zsh
文件?
答案 0 :(得分:11)
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模式缓冲区中执行此操作:
(sh-set-shell "zsh")
所以在你的情况下你需要的东西(除非你使用shebang)是更新自动模式 - alist如上所述
(add-hook 'sh-mode-hook
(lambda ()
(if (string-match "\\.zsh$" buffer-file-name)
(sh-set-shell "zsh"))))
答案 1 :(得分:7)
您的文件是否具有#!
shebang,您始终可以使用文件模式行或本地变量部分来设置shell脚本模式。在您的脚本中使用其中一个将允许Emacs做正确的事情,即使您还没有更新自动模式 - alist,因此建议用于任何非标准文件扩展名。
shell脚本的Emacs文件模式行是-*- mode: sh -*-
。它应该在注释中,并且必须出现在第一行(如果第一行是shebang行,则显示在第二行)。
如果由于某种原因无法将其放在第一行(第二行)上,可以在文件末尾创建一个局部变量部分(在文件的最后3000个字符中,最后一个)页面,according to the manual):
# Local Variables:
# mode: sh
# End:
请注意,仅设置Emacs模式仍将依赖shebang行进行shell类型自动检测,如果未检测到shebang行,则默认为当前SHELL
环境变量或sh-shell-file
的值如果设置)。
如果你没有shebang行,但想要选择正确的shell类型,唯一的方法是在模式行或局部变量部分使用eval
。每次将文件加载到Emacs时,添加此选项都会生成确认提示,因此通常不建议这样做,但在某些情况下可能会接受。
模式行为-*- mode: sh; eval: (sh-set-shell "zsh") -*-
,局部变量形式为:
# Local Variables:
# mode: sh
# eval: (sh-set-shell "zsh")
# End:
答案 2 :(得分:-1)
如果使用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