当我决定将函数移动到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
2条答案
按热度按时间jchrr9hc1#
sh
的语法文件实际上处理几种不同类型的shell语法:bash
、ksh
和普通旧sh
。由于您的conf文件无法识别为bash
或ksh
,因此它福尔斯到sh
。$(...)
在sh
中不是有效的构造,因此它被突出显示为错误。要解决这个问题,可以确保为文件设置了“g:is_bash”,这样
sh
语法脚本就会知道文件应该突出显示为bash
代码。请编辑您的问题,包括您添加到.vimrc
的内容,以使文件使用sh
语法突出显示。这将更容易建议设置“g:is_bash”的正确方法。更新:正如Alok所评论的,您应该能够将以下内容添加到文件中
让
vim
也知道要使用的正确语法高亮。cnjp1d6j2#
在我的例子中,我想保留
#!/bin/sh
作为shebang行,因为不是每个系统都有/bin/bash
可用。虽然最初的Bourne shell可能不支持
$(...)
语法,但现在大多数sh
shell都是符合POSIX的,并且POSIX规范支持这种语法。比如说,/bin/sh
是/bin/dash
。/bin/sh
是/bin/bash
。/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
。在同一个文件的下面,当需要设置语法突出显示时,还有一些关于它的注解:关于Bourne shell是如何被Bourne的一个简短有趣的历史,Bourne再次作为
bash
作为Ubuntu上/bin/sh
的替代品,并最终被dash
取代,可以在https://askubuntu.com/a/976504中找到。