【问题标题】:How to renames variable according to the type如何根据类型重命名变量
【发布时间】:2017-07-01 10:58:46
【问题描述】:

我需要找到一种方法来执行/找到一个 vim 脚本,该脚本将根据模式更改变量名!

这是一个可以帮助您的答案 How to quickly change variable names in Vim?

它会检查哪个类型是变量并添加一个特定的前缀

例如:

char myvarchar char_myvar

char *myvarchar pointer_char_myvar

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

f(char myvar)f(char param_char_myvar)

这些类型的标记将由模式匹配定义

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

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

但我失败了。

我该怎么做?

【问题讨论】:

  • 如果你真的想做这些傻事,别忘了把函数也重命名:char char_myFunc(char char_myChar);,别忘了structsstruct x struct_x_myFunc (struct x struct_x_myStruct);unions和@987654335 @(现在它变得非常愚蠢......)
  • 哦对了,函数也是这样重命名的char function_char_myFunc(char char_myChar);
  • @tofro 你被巨魔取消了。
  • struct 也一样,谢谢考虑:D。它很愚蠢,但它是必需的。
  • 有问题的代码有多大?它是否遵循某种严格的编码风格,声明都采用相同的形式?它是否有一些棘手的类型声明,比如函数返回函数?

标签: c vim refactoring


【解决方案1】:

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

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

然后您必须检测所有变量声明(universal-ctags 或 cscope 将在此处提供帮助),然后重命名所有出现的变量。

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

更准确地说,找到确切的功能并非易事,因为我的插件的这些部分没有记录:

  • echo lh#dev#c#function#_analyse_parameter('char *str') 会分解一个变量声明,
  • echo lh#dev#c#types#is_pointer(lh#dev#c#function#_analyse_parameter('char *str').type) 很清楚变量背后的类型是否实际上是一个指针。注意:它不支持每行多个声明之类的东西char *s, c;
  • 给定函数声明的行号,:echo lh#dev#c#function#get_prototype(linenr, 0) 将提取可以用lh#cpp#AnalysisLib_Function#AnalysePrototype(the_protoype) 分析的函数原型,在那里你将获得函数的返回类型、它的名称以及它的所有参数的列表(类型、名称以及其他信息)。
  • 我还有一个 lh#dev#get_variables() 函数,它返回 ctags 能够在一系列行中识别的所有局部变量 -- 这需要我的 lh-tags 插件。

【讨论】:

  • 我没有对你投反对票。我已经给出了解决方案的提示。
  • 你的插件看起来真的很有用。我没有找到如何提取类型并做我想做的事情(只有 :DOX 似乎使用类型提取功能)我希望我有更多的时间来学习使用它。我确实想出了自己的 vimscript 解决方案
  • 它很好地隐藏在 lh-dev 中。我已经编辑了我的消息以提供更准确的指示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 2018-01-10
  • 2017-12-07
  • 2021-04-30
  • 1970-01-01
  • 2018-11-22
相关资源
最近更新 更多