80

我的 Vim 编辑器自动突出显示 PHP 文件 ( vim file.php)、HTML 文件 ( vim file.html) 等等。

但是当我输入:vim file并在其中编写一个 Bash 脚本时,它并没有突出显示它。

我如何告诉 Vim 将其突出显示为 Bash 脚本?

我开始#!/bin/bash在文件顶部输入,但它不起作用。

4

12 回答 12

93

您是否正确地为 shell 脚本提供了.sh扩展名?Vim 的自动语法选择几乎完全基于文件名(扩展名)检测。如果一个文件没有设置语法(或者是错误的语法),Vim 不会因为你开始用给定的语言输入脚本而自动更改为正确的语法。

作为临时解决方法,该命令:set syn=sh将打开 shell 脚本语法突出显示。

于 2010-04-05T02:53:01.843 回答
44

到目前为止的答案是正确的,您可以使用扩展名(如.sh)或 shebang 行(如#!/bin/bash)来识别文件类型。如果您没有其中之一,您仍然可以使用文件顶部或底部的模式行注释手动指定文件类型。

例如,如果您想将没有扩展名的脚本识别为 shell 脚本,您可以将此注释添加到文件顶部:

# vim: set filetype=sh :

或者

# vim: filetype=sh

这将告诉 vim 将该文件视为 shell 脚本。(您也可以在模式行中设置其他内容。在 vim 类型:help modeline中获取更多信息。)

于 2012-08-31T22:58:09.647 回答
24

实际上语法高亮是 vim 而不是 vi 的一个特性。尝试使用 vim 命令然后执行

:syntax on.

于 2015-02-10T10:01:19.150 回答
22

我来到这个答案专门寻找如何突出bash语法,而不是 POSIX shell。简单地做一个set ft=sh(或等效的)将导致文件被 POSIX shell 突出显示,这留下了很多有效的语法,bash以红色突出显示。要获得 bash 突出显示:

" Set a variable on the buffer that tells the sh syntax highlighter
" that this is bash:
let b:is_bash = 1
" Set the filetype to sh
set ft=sh

请注意,如果您ft已经是sh,您仍然需要该set命令;否则let不会立即生效。

您可以通过将变量设置为全局变量来使其成为全局默认值,即let g:is_bash = 1.

:help ft-sh-syntax是我必须找到的手册页;它解释了这一点,以及如何触发其他外壳风格的突出显示。

于 2017-03-01T22:29:49.883 回答
17

Vim 还可以通过检查文件的内容来检测文件类型(例如,如果第一行包含 bash shebang),下面是filetype.txt帮助文件的引用:

如果您的文件类型只能通过检查文件的内容来检测

创建您的用户运行时目录。您通常会使用 'runtimepath' 选项的第一项。Unix 示例:

:!mkdir ~/.vim

为此创建一个 vim 脚本文件。例子:

if did_filetype()   " filetype already set..
    finish      " ..don't do these checks
endif
if getline(1) =~ '^#!.*\<mine\>'
    setfiletype mine
elseif getline(1) =~? '\<drawing\>'
    setfiletype drawing
endif

更多示例见 $VIMRUNTIME/scripts.vim。在您的用户运行时目录中将此文件写为“scripts.vim”。例如,对于 Unix:

:w ~/.vim/scripts.vim

检测将立即生效,无需重新启动 Vim。

您的 scripts.vim 在默认检查文件类型之前加载,这意味着您的规则会覆盖 $VIMRUNTIME/scripts.vim 中的默认规则。

于 2010-04-05T08:02:22.450 回答
9

Vim 可以检测读取第一行的文件类型。将以下行添加为第一行。

#!/bin/sh
于 2014-12-05T07:41:08.900 回答
2

在文件顶部添加 shebang 后,保存并重新加载它(例如:w|e),然后语法着色就可以启动了。

另请参阅Vim 不一致的语法高亮 bash 文件,接受的答案也可能有所帮助。

于 2015-05-15T22:12:32.777 回答
2

对于那些有这个问题的变体的人,即如何.sh在打开时自动在没有扩展名的bash文件上启用语法突出显示......

添加filetype on您的.vimrc. 这通过还考虑文件的内容来启用文件类型检测。例如,bash 脚本将设置为sh文件类型。但是,#!在使用 vim 创建的新文件上键入不会触发文件类型检测,您需要set ft=sh在这种情况下使用。有关更多信息,请输入:h filetypevim。

如评论中所述,您需要结合使用它syntax enable来打开突出显示。

或者你可以使用:filetype detect. 从文档:

如果您从一个空文件开始并键入可以检测文件类型的文本,请使用此选项。例如,当您在 shell 脚本中输入:“#!/bin/csh”。

于 2020-04-16T21:26:51.097 回答
0

默认情况下,vim 已经可以识别许多文件类型。它们中的大多数通过文件扩展名工作,但在这种情况下,vim 也会分析文件的内容以猜测正确的类型。

vim 自动设置特定文件名的文件类型,如.bashrc,.tcshrc等。但是带有.sh扩展名的文件将被识别为 csh、ksh 或 bash 脚本。为了确定这到底是什么类型的脚本,vim 读取文件的第一行来查看 #! 线。

如果第一行包含单词bash,则该文件被标识为 bash 脚本。通常你会看到#!/bin/bash脚本是否打算直接执行,但对于 shell 配置文件,使用简单# bash的也可以。

如果您想查看详细信息,这是在$VIMRUNTIME/filetype.vim.

于 2011-09-16T23:36:45.577 回答
0

在新文件上获得语法突出显示的最简单方法可能是在编写 shebang 行后重新加载它。一个简单的:w :e将写出文件,重新加载它,并解释您刚刚编写的 shebang 行,为您提供适当的语法突出显示。

于 2014-01-24T10:32:22.947 回答
0

如果您在打开脚本之前已经知道文件类型,或者如果您正在创建一个没有常见扩展名的新脚本,您可以在命令行上将它传递给 vim,如下所示:

vim -c 'setfiletype sh' path/to/script
vim -c 'setfiletype python' path/to/script
于 2017-08-20T18:40:37.887 回答
-1

创建新文件时,只有文件名检测起作用;如果您在创建新缓冲区后键入内容检测 ( #!/bin/bash),则它不适用。

明智的做法:set ft=bash是第一次做,下次编辑时,#!/bin/bash会自动设置正确的文件类型。

于 2012-08-31T23:00:26.267 回答