在emacs中以sh模式打开zsh脚本

时间:2013-12-13 03:07:21

标签: emacs zsh

*.zsh个文件在默认模式下打开(对我来说是文本模式)。但是,sh-mode实际上是多种模式,包括zsh,bash等的行为。如何告诉emacs专门以sh-mode的zsh风格打开*.zsh文件?

3 个答案:

答案 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
相关问题