C 如何根据类型重命名变量

C 如何根据类型重命名变量,c,vim,refactoring,C,Vim,Refactoring,我需要找到一种方法来完成/找到一个vim脚本,它将根据模式更改变量名 这里有一个答案可以帮助你 它将检查变量的类型并添加特定的前缀 例如: char-myvartochar-char\u-myvar char*myvar至char指针\u char\u myvar 或者如果变量是函数的参数 f(char-myvar)tof(char-param\u-char\u-myvar) 这些类型的标记将通过模式匹配来定义 这个想法似乎与gd一起进入变量定义,将其保存在寄存器中,然后在另一个寄存器中加入前

我需要找到一种方法来完成/找到一个vim脚本,它将根据模式更改变量名

这里有一个答案可以帮助你

它将检查变量的类型并添加特定的前缀

例如:

char-myvar
to
char-char\u-myvar

char*myvar
char指针\u char\u myvar

或者如果变量是函数的参数

f(char-myvar)
to
f(char-param\u-char\u-myvar)

这些类型的标记将通过模式匹配来定义

这个想法似乎与
gd
一起进入变量定义,将其保存在寄存器中,然后在另一个寄存器中加入前面的四个字(因为在
char*myvar
中,
*
像一个字一样计数,我们需要足够的信息来知道它是否在函数中),检查哪种模式匹配(检查哪种类型,检查是否在函数中或本地)然后添加标记

另外,如何将此脚本应用于所有变量

但我失败得很惨


我该怎么做呢?

这确实是一件非常愚蠢的事情。它甚至比sys匈牙利符号更糟糕——在这个主题上,请查看Joel Spolsky的十年历史。(在您的环境中,这可能会让您大开眼界)

无论如何。在本文中,我有一些函数可以提取类型,或者判断类型何时实际上是指针或常量,等等。我还有一些函数可以解码函数签名。它位于插件的autoload/lh/cpp目录中。它可能取决于lh-dev的其他功能

然后,您必须检测所有变量声明(universal CTAG或cscope将在这里提供帮助),然后重命名所有出现的变量声明

老实说,您最好继续使用libclang来重构代码

更准确地说,由于我的插件中的这些部分没有文档记录,因此查找确切的函数并非易事:

  • echo lh#dev#c#function#u analysis_参数('char*str')
    将分解变量声明
  • echo lh#dev#c#types#is#u pointer(lh#dev#c#function#u analysis(char*str)参数('char*str').type)
    将告诉您变量后面的类型是否实际上是指针。注意:它不支持每行多个声明
    char*s,c
  • 给定声明函数的行号,
    :echo lh#dev#c#function#get#u prototype(linenr,0)
    将提取可使用
    lh#cpp#AnalysisLib#function#analysiseprototype(the#u prototype)
    进行分析的函数原型,在那里您将有函数返回类型、名称及其所有参数的列表(类型、名称以及其他信息)
  • 我还有一个
    lh#dev#get_variables()
    函数,它返回ctags能够在一系列行中识别的所有局部变量——这需要我的lh tags插件

如果你真的想做这样愚蠢的事情,也别忘了重命名函数:
char char\u myFunc(char char\u myChar);
不要忘了
structs
struct x struct\u myFunc(struct x struct\u myStruct)
unions
enums
(现在它变得非常愚蠢了…)哦,是的,函数也是这样重命名的
char函数\u char\u myFunc(char char\u myChar)
@tofro你被巨魔取消了。struct也是一样,谢谢你考虑它:D.这很愚蠢,但它是必需的。有问题的代码有多大?它是否遵循一些严格的编码风格,声明都是相同的形式?它是否有一些复杂的类型声明,比如函数返回函数?我没有否决你。我已经否决了依文给出了解决方案的提示。你的插件看起来非常有用。我没有找到如何提取类型并做我想做的事情(只是:DOX似乎使用了类型提取功能)我希望我有更多的时间来学习使用它。我确实想出了我自己的vimscript解决方案。它很好地隐藏在lh-dev中。我编辑了我的消息以提供更精确的指示