Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在emacs中以sh模式打开zsh脚本_Emacs_Zsh - Fatal编程技术网

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

在emacs中以sh模式打开zsh脚本,emacs,zsh,Emacs,Zsh,*.zsh文件以默认模式打开(我的文本模式)。但是,sh模式实际上是多个模式,包括zsh、bash等的行为。我如何告诉emacs以sh模式的zsh风格打开*.zsh文件?sh模式的风格是从shebang行(脚本的第一行)自动检测到的。如果您有“#!/bin/zsh”,将假定zsh,并且(例如)autoload将被识别为关键字自动加载将不会被识别为自动加载 要使emacs将*.zsh文件识别为shell脚本,只需将其添加到init文件中: (add-to-list 'auto-mode-alist

*.zsh
文件以默认模式打开(我的文本模式)。但是,sh模式实际上是多个模式,包括zsh、bash等的行为。我如何告诉emacs以sh模式的zsh风格打开
*.zsh
文件?

sh模式的风格是从shebang行(脚本的第一行)自动检测到的。如果您有“#!/bin/zsh”,将假定zsh,并且(例如)
autoload
将被识别为关键字<如果第一行是“#!/bin/bash”,则代码>自动加载将不会被识别为自动加载

要使emacs将*.zsh文件识别为shell脚本,只需将其添加到init文件中:

(add-to-list 'auto-mode-alist '("\\.zsh\\'" . sh-mode))
当您不想使用shebang时,选择一种风味的编程方式是在sh模式缓冲区中执行此操作:

(sh-set-shell "zsh")
因此,在您的情况下,您需要(除非您使用shebang)更新自动模式列表,如上所述

(add-hook 'sh-mode-hook
          (lambda ()
            (if (string-match "\\.zsh$" buffer-file-name)
                (sh-set-shell "zsh"))))

您的文件是否有
#shebang,都可以使用文件模式行或局部变量部分来设置shell脚本模式。在脚本中使用其中一个将允许Emacs做正确的事情,即使您没有更新自动模式列表,因此建议使用任何非标准文件扩展名

shell脚本的Emacs文件模式行是
-*-mode:sh-*-
。它应该在注释中,并且必须出现在第一行(如果第一行是shebang行,则第二行)

如果由于某种原因无法将其放在第一(第二)行,可以在文件末尾创建一个局部变量部分(在文件的最后3000个字符中,在最后一页,):

请注意,仅设置Emacs模式仍将依赖shebang行进行shell类型自动检测,如果未检测到shebang行,则默认为当前
shell
环境变量或
sh shell文件的值(如果设置)

如果不能使用shebang行,但希望选择正确的shell类型,则唯一的方法是在mode line或local variables部分使用
eval
。添加此选项将在每次将文件加载到Emacs时生成确认提示,因此通常不建议这样做,但在某些情况下可以接受。 模式行应为
-*-mode:sh;eval:(sh set shell“zsh”)-*-
,局部变量形式为:

# 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

自动模式列表
中添加一个条目,将
.zsh
后缀映射到所需的模式。啊,谢谢,我知道如何调用sh mode,但它没有自动检测到类型。如果我没有sebang行,我还能让它自动工作吗?你知道为什么
(添加到列表中的“自动模式列表”(“\\.zsh\\'”.sh mode))
在我的emacs中绝对没有效果吗<代码>sh模式
已安装,我可以手动启动,没有问题。谢谢!这太酷了!我现在正在策划使用这个功能的绝妙方法。这与问题无关。
#!/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