Vim红色高亮$( )

16

我正在写一个脚本,决定将函数移动到一个lib文件中,但是当我打开lib文件时,所有的$(和连续的)都被红色高亮显示。以下是一些脚本示例:

TAB="$(printf '\t')"
percent=$(echo "scale=2; $number/$total*100" | bc | sed -e 's/\.[[:digit:]]*//g')
if [[ -z $(grep $site/post $max_lim) ]];then

文件类型是conf,但我在.vimrc中将其设置为sh语法。你知道发生了什么吗?
谢谢。
编辑:感谢快速回答,我发现这行代码使vim将指定后缀名的文件与sh语法匹配。
au BufReadPost * set syntax=sh

我曾经认为在库中使用shebang是不允许的,但这是一个很好的解决方案。

无论如何,在.vimrc中使用g:is_bash会返回找不到模式的错误。

所以我想做的是,由于我只写bash脚本,让vim将没有扩展名的文件识别为bash。


你的意思是将颜色标为红色?还是将文字颜色设为白色,背景设为红色? - Kent
目前,您可以使用“:set ft=sh”命令,但您可能希望发布您的~/.vimrc文件中设置文件类型和文件名的部分,以便我们了解正在发生的情况。您也可以将以下内容添加到文件末尾:“# vim: set ft=sh”。 - gpojd
1
顺便提一下,你可以使用 TAB=$'\t'bash 中指定一个字面上的制表符。 - chepner
只是一个提示,对我来说,红色高亮显示出来的是搜索匹配项,“:noh”可以解决这个问题。 - seth10
2个回答

17
sh的语法文件实际上处理了几种不同的Shell语法:bashksh和普通的sh。由于您的配置文件未被识别为bashksh,因此它会回退到sh。在sh中,$(...)不是一个有效的结构,因此它将被突出显示为错误。
要解决此问题,您可以确保为该文件设置了"g:is_bash",以便sh语法脚本知道您的文件应该被突出显示为bash代码。请编辑您的问题,以包括您添加到.vimrc中使文件使用sh语法突出显示的内容。这将更容易建议设置"g:is_bash"的正确方法。
更新:如Alok所评论的,您应该能够向文件中添加以下内容:
#!/bin/bash

为了让vim知道使用正确的语法高亮。


5
如果脚本文件中的 "shebang 行" 指定为 bash 脚本,似乎也可以正常运行。 - Alok Singhal
好的,我忘了提到,因为听起来这个文件似乎只是被引用而不是独立执行。尽管如此,这绝对是最简单的解决方法。 - chepner
5
文档位于:h ft-sh-syntax - glts

11
在我的情况下,我希望保留`#!/bin/sh`作为shebang行,因为不是每个系统都有`/bin/bash`可用。
原始的Bourne shell可能不支持`$(...)`语法,但现在大多数`sh` shell都符合POSIX标准,POSIX规范支持这种语法。例如,
- 在Ubuntu上,`/bin/sh`是`/bin/dash`。 - 在MacOS上,`/bin/sh`是`/bin/bash`。 - 在Alpine上,`/bin/sh`是`/bin/ash`。
所有这些都符合POSIX规范。传统上,如果我们想编写可移植的Shell脚本,我们应该将shebang行保留为`#!/bin/sh`。如果我们不打算使用任何Bashism,则不应该仅为了语法高亮而将其更改为`#!/bin/bash`。
好的,但是对于错误的红色高亮呢?问题在于Vim将#!/bin/sh解释为对1979年最初的Bourne shell的引用,不支持$(...)。也许这是Vim向后兼容性的证明,或者可能是不太多的人关心。这里有一个描述相同行为的相关GitHub问题
无论如何,对我来说最好的解决方案是在我的配置文件中设置let g:is_posix = 1。有趣的是,如果你浏览Vim的运行时文件,它相当于设置let g:is_kornshell = 1。在同一文件的后面,当需要设置语法高亮时,还有一些相关评论
" $() and $(()): {{{1
" $(..) is not supported by sh (Bourne shell).  However, apparently
" some systems (HP?) have as their /bin/sh a (link to) Korn shell
" (ie. Posix compliant shell).  /bin/ksh should work for those
" systems too, however, so the following syntax will flag $(..) as
" an Error under /bin/sh.  By consensus of vimdev'ers!

关于Bourne shell如何诞生,如何再次作为Ubuntu上/bin/sh的替代品而变成bash,并最终被dash所取代的简要有趣历史,可以在https://askubuntu.com/a/976504找到。

3
这肯定应该是被接受的答案。另一个根本没有回答问题。 - ruohola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接