Vim:仅在语法选择的文本区域中替换

时间:2016-09-16 07:59:13

标签: vim

确切的问题:我有一个C ++源代码,我需要将符号名称替换为其他名称。但是,我需要这只替换符号,而不是意外地在“”中的注释或文本中使用相同的单词。

语法突出显示规则中定义了源信息的特定语言部分。我知道他们有时会失败,但让我们说这不是问题。我需要一些方法来浏览所有发现的短语,然后检查它找到的部分,如果是文本或注释,应该跳过这个短语。否则,替换应立即进行,或先询问,具体取决于众所周知的c标志。

我认为至少在理论上可能是:

  • 在进行替换时有一个“回调”(要求找到每个短语,并要求回答是否替换),或者提取已找到短语的位置列表,然后遍历所有这些< / LI>
  • 提取当前“hi-linked”语法突出显示规则的名称,该规则用于为给定位置的文本着色

在vim的当前功能中是否完全可以?

2 个答案:

答案 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()