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

nev*_*ame 70 linux vim bash syntax-highlighting vim-syntax-highlighting

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

但是当我输入:vim file并且在里面写一个Bash脚本时,它不会突出显示它.

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

我开始#!/bin/bash在文件的顶部键入,但它不能使它工作.

Mar*_*off 79

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

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

  • @ajsie:我不确定你使用的是什么脚本,但我遇到的大多数 `bash` 脚本确实有一个 `.sh` 后缀。要真正指定 *bash* 而不仅仅是 `sh`,你可以在 `.sh` 文件中使用 `#!/bin/bash` shebang 行。 (4认同)
  • @MarkRushakoff,给bash脚本一个`.sh`扩展名在很多圈子里被认为是糟糕的形式.例如,参见Freenode #bash频道相关条目使用的仿真机器人:http://wooledge.org/~greybot/meta/.sh (4认同)
  • 但大多数脚本没有.sh扩展名?我应该把它作为.sh扩展名来使它工作吗?命名脚本是最佳做法吗?和它的bash ...所以它仍然.sh? (3认同)
  • ...引用:"不要为你的脚本使用扩展.脚本定义你可以运行的新命令,命令通常没有给出扩展.你运行`ls.elf`吗?另外:bash脚本是*不*sh脚本(所以不要使用`.sh`),如果脚本被另一种语言重写,扩展只会导致依赖性问题.请参阅http://www.talisman.org/~erlkonig/documents/commandname-extensions-被认为对人体有害" (3认同)
  • 如果一个文件没有扩展名(与命令一样多的 shell 脚本),那么 Vim 将查看第一行以查看 `#!/bin/sh` 或 `#!/bin/bash` 的shebang 到如果不存在shebang,请确定文件类型为`ft=sh` 或`ft=text`。 (2认同)
  • ...当脚本打算作为库*来源时,shell脚本上的扩展被普遍认为是一个好主意(就像一个人使用Python*模块的`.py`扩展名*而不是Python*脚本*在PATH中) - 但在这种情况下,扩展应正确反映脚本可以正确解析的shell; `.sh`暗示"与所有POSIX shell兼容",这对于*bash*脚本通常不准确. (2认同)

bry*_*ant 31

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

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

# vim: set filetype=sh :
Run Code Online (Sandbox Code Playgroud)

要么

# vim: filetype=sh
Run Code Online (Sandbox Code Playgroud)

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

  • 如果Modeline似乎无效,请尝试在`〜/ .vimrc`中使用`set modeline`,请参阅[this answer](http://superuser.com/q/323712/72223) (2认同)
  • 正如我在暗示这一点的另一个答案中指出的那样,`sh` 似乎突出显示了 POSIX shell,而不是 bash。值得注意的是,它将有效的 bash 语法标记为错误,这很烦人。 (2认同)

Gau*_*are 20

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

:syntax on.

  • 这是我在Mac OS X 10.10.3上的解决方案.使用`vim~/.vimrc`将.vimrc文件添加到我的主目录,并在文件中添加`syntax on`,然后用`:x`关闭 (4认同)

Mat*_*iva 14

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

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

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

:!mkdir ~/.vim
Run Code Online (Sandbox Code Playgroud)

为此执行创建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
Run Code Online (Sandbox Code Playgroud)

有关更多示例,请参阅$ VIMRUNTIME/scripts.vim.在用户运行时目录中将此文件写为"scripts.vim".例如,对于Unix:

:w ~/.vim/scripts.vim
Run Code Online (Sandbox Code Playgroud)

检测将立即生效,无需重启Vim.

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


Tha*_*tos 12

我来到这个答案,寻找具体如何突出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
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 8

vim可以通过顶部评论来检测

尝试在文件顶部的这一行

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)