发布网友
共2个回答
热心网友
当然,客观地说,在 Vim 里重构代码,是非常艰巨的任务。因为Vim的工具链更偏重于静态分析,文本分析。而对于好的重构工具,他需要一定的语义分析能力,并且不同的编程语言也会面临不一样的挑战。简单的说,静态语言重构相对动态语言而言要轻松一些。
一般我会通过 exVim 中的 \gg 或者 :GS <name> 指令来完成重构中的检索操作。在通过 :GS 全局查找需要重构的 类名,变量名等信息后,我会在 exGlobalSearch 插件中进行一些必要的过滤操作,比如如果我希望检索出所有调用 func_name 的地方,在 C++ 中,我会加入检索过滤 ->func_name 并在 exGlobalSearch 中做第二次过滤查找。
在完成检索结果后,就是比较麻烦的替换操作。在 exVim 中,可以对 exGlobalSearch 中的查找结果做全局替换,通过指令 :SUB name1/name2/option 。这个指令和 Vim 中的 :s/name1/name2/opt 格式是一样,只不过他做的事情是对每一条 exGlobalSearch 中过滤出得检索结果做一次 Vim 的 :s 操作。
当然,由于执行的是文本替换,我个人并不是非常放心替换结果,所以,每次完成名字替换的重构操作后,我还会根据 exGlobalSearch 的检索条目,一一检查替换结果。
诚然Vim不是重构利器,但是在做诸如以上的文本操作时,工作量还是属于可控的。对于静态语言编程,这样的方法已经足够,如果是C语言编程,更有cscope这样的静态分析利器(对应exVim的 exCscope) 来帮助重构和代码分析。
让我比较迷茫的是动态语言(Lua, Javascript)的重构过程,目前我并没有特别好的方法。
热心网友
在终端命令行中打命令 vim hello.c 这时会出现一个空文档,点击a,这时进入输出模式:写上代码: #include int main(int argc,char **argv) { printf("hello world.\n"); return 0; } 点ESC键,进入命令模式,点x键,回车
热心网友
当然,客观地说,在 Vim 里重构代码,是非常艰巨的任务。因为Vim的工具链更偏重于静态分析,文本分析。而对于好的重构工具,他需要一定的语义分析能力,并且不同的编程语言也会面临不一样的挑战。简单的说,静态语言重构相对动态语言而言要轻松一些。
一般我会通过 exVim 中的 \gg 或者 :GS <name> 指令来完成重构中的检索操作。在通过 :GS 全局查找需要重构的 类名,变量名等信息后,我会在 exGlobalSearch 插件中进行一些必要的过滤操作,比如如果我希望检索出所有调用 func_name 的地方,在 C++ 中,我会加入检索过滤 ->func_name 并在 exGlobalSearch 中做第二次过滤查找。
在完成检索结果后,就是比较麻烦的替换操作。在 exVim 中,可以对 exGlobalSearch 中的查找结果做全局替换,通过指令 :SUB name1/name2/option 。这个指令和 Vim 中的 :s/name1/name2/opt 格式是一样,只不过他做的事情是对每一条 exGlobalSearch 中过滤出得检索结果做一次 Vim 的 :s 操作。
当然,由于执行的是文本替换,我个人并不是非常放心替换结果,所以,每次完成名字替换的重构操作后,我还会根据 exGlobalSearch 的检索条目,一一检查替换结果。
诚然Vim不是重构利器,但是在做诸如以上的文本操作时,工作量还是属于可控的。对于静态语言编程,这样的方法已经足够,如果是C语言编程,更有cscope这样的静态分析利器(对应exVim的 exCscope) 来帮助重构和代码分析。
让我比较迷茫的是动态语言(Lua, Javascript)的重构过程,目前我并没有特别好的方法。
热心网友
在终端命令行中打命令 vim hello.c 这时会出现一个空文档,点击a,这时进入输出模式:写上代码: #include int main(int argc,char **argv) { printf("hello world.\n"); return 0; } 点ESC键,进入命令模式,点x键,回车