如何在Vim中突出显示Bash脚本?

时间:2010-04-05 02:45:25

标签: linux bash vim syntax-highlighting vim-syntax-highlighting

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

但是当我键入:vim file并在其中写入一个Bash脚本时,它不会突出显示它。

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

我开始在文件顶部键入#!/bin/bash,但它无法正常工作。

12 个答案:

答案 0 :(得分:75)

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

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

答案 1 :(得分:29)

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

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

# vim: set filetype=sh :

# vim: filetype=sh

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

答案 2 :(得分:17)

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

:syntax on

答案 3 :(得分:13)

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。

答案 4 :(得分:11)

我来到这个答案,专门寻找如何突出 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是我必须找到的手册页;它解释了这一点,以及如何触发突出显示其他类型的shell。

答案 5 :(得分:7)

vim可以通过最高评论

进行检测

在文件顶部尝试此行

#!/bin/sh

答案 6 :(得分:2)

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

另见Vim inconsistently syntax highlighting bash files,接受的答案也可能有所帮助。

答案 7 :(得分:1)

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

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

如评论中所述,您需要将其与syntax enable结合使用以启用突出显示。

或者您可以使用:filetype detect。 来自文档:

如果您以一个空文件开头并键入使 可以检测文件类型。例如,当您输入 这在shell脚本中:“#!/ bin / csh”。

答案 8 :(得分:0)

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

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

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

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

中实施

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

vim -c 'setfiletype sh' path/to/script
vim -c 'setfiletype python' path/to/script

答案 11 :(得分:-1)

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

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