Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim:仅在语法选定的文本区域中替换 确切的问题:我有C++的源代码,需要把符号名替换为其他名称。但是,我需要这只替换符号,而不是意外地替换注释中相同的单词或“”中的文本_Vim - Fatal编程技术网

Vim:仅在语法选定的文本区域中替换 确切的问题:我有C++的源代码,需要把符号名替换为其他名称。但是,我需要这只替换符号,而不是意外地替换注释中相同的单词或“”中的文本

Vim:仅在语法选定的文本区域中替换 确切的问题:我有C++的源代码,需要把符号名替换为其他名称。但是,我需要这只替换符号,而不是意外地替换注释中相同的单词或“”中的文本,vim,Vim,源信息—它是什么特定的语言部分—在语法突出显示规则中已经有足够的定义。我知道他们有时会失败,但让我们声明这不是问题。我需要一些方法来遍历所有找到的短语,然后检查在哪个部分找到它,如果是文本或注释,应该跳过这个短语。否则,根据众所周知的c标志,应立即更换,或先询问 我认为至少在理论上是可能的: 在进行替换时有一种“回调”(为找到的每个短语调用,并要求回答是否替换),或者提取找到短语的位置列表,然后迭代所有位置 提取当前“hi链接”语法突出显示规则的名称,该规则用于在给定位置为文本着色 在vim

源信息—它是什么特定的语言部分—在语法突出显示规则中已经有足够的定义。我知道他们有时会失败,但让我们声明这不是问题。我需要一些方法来遍历所有找到的短语,然后检查在哪个部分找到它,如果是文本或注释,应该跳过这个短语。否则,根据众所周知的
c
标志,应立即更换,或先询问

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

  • 在进行替换时有一种“回调”(为找到的每个短语调用,并要求回答是否替换),或者提取找到短语的位置列表,然后迭代所有位置
  • 提取当前“hi链接”语法突出显示规则的名称,该规则用于在给定位置为文本着色

在vim的当前功能中是否有可能?

是的,使用
:help子替换表达式
,您可以在
:substitute
的替换部分计算任意表达式。Vim的
synID()
synstack()
函数允许您获取当前语法元素

Luc Hermitte有一个实现,它省略了字符串中的替换。您可以很容易地将其适应您的用例。

在my的帮助下,您可以定义一个简短的谓词函数,例如匹配注释和常量(字符串、数字等):

My现在提供了一个
:SubstituteIf
命令,其工作原理类似于
:substitute
,但也采用谓词表达式。这样,除了注释或常量之外,在任何地方进行替换都非常容易:

:%SubstituteIf/pattern/replacement/g !CommentOrConstant()

这几乎就是我所需要的,还有一个问题:
hi-def link
String
链接到
Constant
。我可以获得直接语法元素名,它可以是
cString
cCppString
甚至是另一种字符串,或者在ID上执行
synIDtrans()
,并获得最终的解析,这是令人惊讶的
常量(而不是
string
)。有没有办法获得“syn链接列表”,或者至少是链接hi项的“直接同级”(不是最终解决方案)?如果没有,我可能可以在名称中包含“String”,但它看起来有点难看。不幸的是,您只能获得语法元素的名称(
cString
),以及最终有效的高亮显示组名(
常量
)。我会检查前者是否有
String
,好的,这应该足够好了。问题是,`$VIMRUNTIME/syntax/syncolor.vim中有一个从字符串到常量的清晰链接。。。
:%SubstituteIf/pattern/replacement/g !CommentOrConstant()