ubuntu Vim red highlight $()

u0njafvf  于 2023-10-17  发布在  其他
关注(0)|答案(2)|浏览(105)

当我决定将函数移动到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将返回pattern not found错误
所以我想做的是,因为我只写在bash,以Vim识别任何文件,没有扩展名为bash

jchrr9hc

jchrr9hc1#

sh的语法文件实际上处理几种不同类型的shell语法:bashksh和普通旧sh。由于您的conf文件无法识别为bashksh,因此它福尔斯到sh$(...)sh中不是有效的构造,因此它被突出显示为错误。
要解决这个问题,可以确保为文件设置了“g:is_bash”,这样sh语法脚本就会知道文件应该突出显示为bash代码。请编辑您的问题,包括您添加到.vimrc的内容,以使文件使用sh语法突出显示。这将更容易建议设置“g:is_bash”的正确方法。
更新:正如Alok所评论的,您应该能够将以下内容添加到文件中

#!/bin/bash

vim也知道要使用的正确语法高亮。

cnjp1d6j

cnjp1d6j2#

在我的例子中,我想保留#!/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。如果我们不打算使用任何Bashisms,我们不应该仅仅为了语法突出显示而将其更改为#!/bin/bash
好吧,那错误的红色高亮是怎么回事?问题在于Vim将#!/bin/sh解释为对the original Bourne shell from 1979的引用,而不支持$(...)。也许这是Vim向后兼容性的证明,或者也许没有足够的人关心。下面的related GitHub issue描述了相同的行为。
在任何情况下,对我来说最好的解决方案是在我的配置中设置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是如何被Bourne的一个简短有趣的历史,Bourne再次作为bash作为Ubuntu上/bin/sh的替代品,并最终被dash取代,可以在https://askubuntu.com/a/976504中找到。

相关问题