*.zsh文件在默认模式下打开(对我来说是文本模式).但是,sh-mode实际上是多种模式,包括zsh,bash等的行为.如何告诉emacs *.zsh专门在sh-mode的zsh风格中打开文件?
jua*_*eon 12
sh-mode的味道是从shebang行(脚本的第一行)中自动检测的.如果你有"#!/ bin/zsh",将假设zsh并且(例如)autoload将被识别为关键字. autoload如果第一行是"#!/ bin/bash",则不会被识别
要使emacs将*.zsh文件识别为shell脚本,只需将其添加到init文件中:
(add-to-list 'auto-mode-alist '("\\.zsh\\'" . sh-mode))
Run Code Online (Sandbox Code Playgroud)
当你不想使用shebang时选择一种风味的程序化方法是在sh模式缓冲区中这样做:
(sh-set-shell "zsh")
Run Code Online (Sandbox Code Playgroud)
所以在你的情况下你需要的东西(除非你使用shebang)是更新auto-mode-alist,如上所述
(add-hook 'sh-mode-hook
(lambda ()
(if (string-match "\\.zsh$" buffer-file-name)
(sh-set-shell "zsh"))))
Run Code Online (Sandbox Code Playgroud)
无论您的文件是否有#!shebang,您始终可以使用文件模式行或本地变量部分来设置shell脚本模式.在脚本中使用其中一个将允许Emacs做正确的事情,即使您没有更新auto-mode-alist,因此建议用于任何非标准文件扩展名.
shell脚本的Emacs文件模式行是-*- mode: sh -*-.它应该在注释中,并且必须出现在第一行(如果第一行是shebang行,则必须出现在第二行).
如果由于某种原因无法将其放在第一行(第二行)上,则可以在文件末尾创建一个局部变量部分(在文件的最后3000个字符中,在最后一页上,根据手册):
# Local Variables:
# mode: sh
# End:
Run Code Online (Sandbox Code Playgroud)
请注意,仅设置Emacs模式仍将依赖于shebang行进行shell类型自动检测,如果未检测到shebang行,则默认为当前SHELL环境变量或sh-shell-fileif set 的值).
如果你不能有一个shebang行,但想要选择正确的shell类型,唯一的方法是使用eval模式行或局部变量部分.每次将文件加载到Emacs时,添加此选项都会生成确认提示,因此通常不建议这样做,但在某些情况下可能会接受.模式行将是-*- mode: sh; eval: (sh-set-shell "zsh") -*-,并且局部变量形式将是:
# Local Variables:
# mode: sh
# eval: (sh-set-shell "zsh")
# End:
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2608 次 |
| 最近记录: |