vim sed嵌入式语法突出显示

vim sed嵌入式语法突出显示,vim,sed,syntax,Vim,Sed,Syntax,我找不到高级语法工作 我搜索了一下,没有找到任何特别适合塞德的东西 以下是我的结论: if exists("b:current_syntax")

我找不到高级语法工作

我搜索了一下,没有找到任何特别适合塞德的东西

以下是我的结论:

if exists("b:current_syntax")                                                                                                                                                                                                                                             
    unlet b:current_syntax                                                                                                                                                                                                                                                  
endif                                                                                                                                                                                                                                                                     
syntax include @sed syntax/sed.vim                                                                                                                                                                                                                                        
syntax region sedEmbed start=+\<sed\>+ end=+'+ contains=@sed
如果存在(“b:当前语法”)
unlet b:当前_语法
恩迪夫
语法包括@sed syntax/sed.vim
语法区域sedebedd start=+\+end=+'+contains=@sed
但它没有效果。
怎么了?

你很接近了。一个问题是,
start=
end=
模式默认包含在区域中。sed语法被这些语法弄糊涂了;i、 e.它将
sed
解释为
s//
命令

这可以通过以下方法解决。粗略地说,(语法include)匹配只在
sed
(区域结束开始匹配)+1空格+开始单引号(给出
ms=e+1
)之后开始:

这样,我就可以在普通缓冲区中突出显示类似于
sed's/foo/bar/g'
的内容

与基本语法的集成 正如您提到的,您看到的是“无效果”(而不是混乱的高亮显示),我怀疑您实际上是在缓冲区中使用预先存在的语法(可能是
sh
)运行此语法扩展。这会导致额外的问题,因为原始语法元素模糊了覆盖区域,因此它不匹配

要解决这个问题,您需要找出哪个原始基本语法组导致高亮显示<代码>:syn list显示所有活动组,但安装插件时更容易。(我有一份工作。)

对我来说,以下方法可行,但它稍微破坏了原始shell语法:

setfiletype sh
if exists("b:current_syntax")                                                                                                                                                                                                                                             
    unlet b:current_syntax                                                                                                                                                                                                                                                  
endif                                                                                                                                                                                                                                                                     

" Remove sh.vim syntax items that are "in the way".
syn clear kshStatement
syn clear bashStatement
syn clear shQuote
syn clear shSingleQuote

syntax include @sed syntax/sed.vim                                                                                                                                                                                                                                        
syntax region sedEmbed start="\<sed\s\+'"ms=e+1 end="'"me=s-1 contains=@sed

我们越来越近了,但现在这打破了bash语法的hilighting。我不确定你想要的东西是否真的可以实现。嵌入另一个语法需要为它准备好原始语法(这里是:shell)。虽然
syntax/.sh.vim
是由一位真正的vim老手编写的,而且非常复杂,但我怀疑是否有人尝试过这样做。因此,也要做好调整原始语法的准备,并向其作者提交补丁。更简单的方法是将sed命令放在单独的行上(例如,通过here document),然后使用类似或(不同的方法)我自己的插件来突出显示sed。你知道syntax/sh.vim是如何为awk做准备的吗?我看不到其中提到awk。我会继续努力,如果我取得了一些成功/进步,我会在这里发布。谢谢。我不认为与awk有任何整合。awk有一个单独的语法,可以通过
#检测到/usr/bin/awk
shebang行,但没有包含语法。祝你的尝试好运;如果你能找到一个优雅的解决方案,那就太好了!
syntax region sedEmbed start="\<sed\s\+'"ms=e+1 end="'"me=s-1 contains=@sed
setfiletype sh
if exists("b:current_syntax")                                                                                                                                                                                                                                             
    unlet b:current_syntax                                                                                                                                                                                                                                                  
endif                                                                                                                                                                                                                                                                     

" Remove sh.vim syntax items that are "in the way".
syn clear kshStatement
syn clear bashStatement
syn clear shQuote
syn clear shSingleQuote

syntax include @sed syntax/sed.vim                                                                                                                                                                                                                                        
syntax region sedEmbed start="\<sed\s\+'"ms=e+1 end="'"me=s-1 contains=@sed
syn clear kshStatement
syn clear bashStatement

let s:save_syntax = b:current_syntax
unlet b:current_syntax
syn include @shSedScript syntax/sed.vim
let b:current_syntax = s:save_syntax
unlet s:save_syntax

syn match shSedLineContinuation "\\\s*$" contained skipempty nextgroup=shSedExpression
syn match shSedExpression "\%(^\|\_s\+\)-\a*e\a*\_s\+" contained nextgroup=shSedScriptCode
syn region shSedScriptCode matchgroup=shSedCommand start=+[=\\]\@<!'+ skip=+\\'+ end=+'+ contains=@shSedScript contained skipwhite skipempty nextgroup=shSedLineContinuation,shSedExpression
syn region shSedScriptEmbedded matchgroup=shSedCommand start=+\<sed\>+ skip=+\\$+ end=+[=\\]\@<!'+me=e-1 contains=@shIdList,@shExprList2 nextgroup=shSedScriptCode
syn cluster shCommandSubList add=shSedScriptEmbedded

hi def link shSedCommand Type
hi def link shSedExpression shSetOption