确切的问题:我有一个C ++源代码,我需要将符号名称替换为其他名称。但是,我需要这只替换符号,而不是意外地在“”中的注释或文本中使用相同的单词。
语法突出显示规则中定义了源信息的特定语言部分。我知道他们有时会失败,但让我们说这不是问题。我需要一些方法来浏览所有发现的短语,然后检查它找到的部分,如果是文本或注释,应该跳过这个短语。否则,替换应立即进行,或先询问,具体取决于众所周知的c
标志。
我认为至少在理论上可能是:
在vim的当前功能中是否完全可以?
答案 0 :(得分:1)
是的,使用:help sub-replace-expression
,您可以评估:substitute
的替换部分中的任意表达式。 Vim的synID()
和synstack()
函数允许您获取当前语法元素。
Luc Hermitte有一个实现,它忽略了字符串中的替换,here。您可以轻松地根据您的使用情况进行调整。
答案 1 :(得分:0)
在ingo-library plugin的帮助下,您可以定义一个短谓词函数,例如匹配注释和常量(字符串,数字等):
function! CommentOrConstant()
return ingo#syntaxitem#IsOnSyntax(getpos('.'), '^\%(Comment\|Constant\)$')
endfunction
我的PatternsOnText plugin现在提供:SubstituteIf
命令,其作用类似:substitute
,但也采用谓词表达式。有了它,除了注释或常量之外,在任何地方进行替换都非常容易:
:%SubstituteIf/pattern/replacement/g !CommentOrConstant()