我的 Vim 编辑器自动突出显示 PHP 文件 ( vim file.php
)、HTML 文件 ( vim file.html
) 等等。
但是当我输入:vim file
并在其中编写一个 Bash 脚本时,它并没有突出显示它。
我如何告诉 Vim 将其突出显示为 Bash 脚本?
我开始#!/bin/bash
在文件顶部输入,但它不起作用。
我的 Vim 编辑器自动突出显示 PHP 文件 ( vim file.php
)、HTML 文件 ( vim file.html
) 等等。
但是当我输入:vim file
并在其中编写一个 Bash 脚本时,它并没有突出显示它。
我如何告诉 Vim 将其突出显示为 Bash 脚本?
我开始#!/bin/bash
在文件顶部输入,但它不起作用。
您是否正确地为 shell 脚本提供了.sh
扩展名?Vim 的自动语法选择几乎完全基于文件名(扩展名)检测。如果一个文件没有设置语法(或者是错误的语法),Vim 不会因为你开始用给定的语言输入脚本而自动更改为正确的语法。
作为临时解决方法,该命令:set syn=sh
将打开 shell 脚本语法突出显示。
到目前为止的答案是正确的,您可以使用扩展名(如.sh
)或 shebang 行(如#!/bin/bash
)来识别文件类型。如果您没有其中之一,您仍然可以使用文件顶部或底部的模式行注释手动指定文件类型。
例如,如果您想将没有扩展名的脚本识别为 shell 脚本,您可以将此注释添加到文件顶部:
# vim: set filetype=sh :
或者
# vim: filetype=sh
这将告诉 vim 将该文件视为 shell 脚本。(您也可以在模式行中设置其他内容。在 vim 类型:help modeline
中获取更多信息。)
实际上语法高亮是 vim 而不是 vi 的一个特性。尝试使用 vim 命令然后执行
:syntax on
.
我来到这个答案专门寻找如何突出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
是我必须找到的手册页;它解释了这一点,以及如何触发其他外壳风格的突出显示。
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 中的默认规则。
Vim 可以检测读取第一行的文件类型。将以下行添加为第一行。
#!/bin/sh
在文件顶部添加 shebang 后,保存并重新加载它(例如:w|e
),然后语法着色就可以启动了。
另请参阅Vim 不一致的语法高亮 bash 文件,接受的答案也可能有所帮助。
对于那些有这个问题的变体的人,即如何.sh
在打开时自动在没有扩展名的bash文件上启用语法突出显示......
添加filetype on
您的.vimrc
. 这通过还考虑文件的内容来启用文件类型检测。例如,bash 脚本将设置为sh
文件类型。但是,#!
在使用 vim 创建的新文件上键入不会触发文件类型检测,您需要set ft=sh
在这种情况下使用。有关更多信息,请输入:h filetype
vim。
如评论中所述,您需要结合使用它syntax enable
来打开突出显示。
或者你可以使用:filetype detect
. 从文档:
如果您从一个空文件开始并键入可以检测文件类型的文本,请使用此选项。例如,当您在 shell 脚本中输入:“#!/bin/csh”。
默认情况下,vim 已经可以识别许多文件类型。它们中的大多数通过文件扩展名工作,但在这种情况下,vim 也会分析文件的内容以猜测正确的类型。
vim 自动设置特定文件名的文件类型,如.bashrc
,.tcshrc
等。但是带有.sh
扩展名的文件将被识别为 csh、ksh 或 bash 脚本。为了确定这到底是什么类型的脚本,vim 读取文件的第一行来查看 #! 线。
如果第一行包含单词bash
,则该文件被标识为 bash 脚本。通常你会看到#!/bin/bash
脚本是否打算直接执行,但对于 shell 配置文件,使用简单# bash
的也可以。
如果您想查看详细信息,这是在$VIMRUNTIME/filetype.vim
.
在新文件上获得语法突出显示的最简单方法可能是在编写 shebang 行后重新加载它。一个简单的:w
:e
将写出文件,重新加载它,并解释您刚刚编写的 shebang 行,为您提供适当的语法突出显示。
如果您在打开脚本之前已经知道文件类型,或者如果您正在创建一个没有常见扩展名的新脚本,您可以在命令行上将它传递给 vim,如下所示:
vim -c 'setfiletype sh' path/to/script
vim -c 'setfiletype python' path/to/script
创建新文件时,只有文件名检测起作用;如果您在创建新缓冲区后键入内容检测 ( #!/bin/bash
),则它不适用。
明智的做法:set ft=bash
是第一次做,下次编辑时,#!/bin/bash
会自动设置正确的文件类型。