当前位置:  开发笔记 > 编程语言 > 正文

在Vim中更改变量名称

如何解决《在Vim中更改变量名称》经验,为你挑选了4个好方法。

我试图通过Vim读取很多C/Perl代码,其中包含许多单字母变量名.

在我阅读代码的过程中,有一些命令可以帮助我将变量的名称更改为更有意义的内容,这样我就可以更快地阅读其余内容.

在Vim中是否有一些命令可以让我快速执行此操作?

我不认为正则表达式会起作用,因为:

    相同的单个字母名称在不同的作用域块中可能具有不同的用途

    相同的字母组合可以是另一个较大的var名称的一部分,或者在字符串或注释中......不想修改它们

任何已知的方案?



1> Mykola Golub..:

以下是如何重命名在当前范围中定义的变量{}.

将光标移动到变量用法.按gd.这意味着 - 将光标移动到定义.现在按[{- 这将带你到范围开始.按V- 将打开视线选择.按%- 将跳到相反的位置,}从而选择整个范围.按:s/- 替换命令的开始. /- 将插入与变量名称匹配的模式(在按下之前您所在的名称gd). /newname/gc - 将在每场比赛中启动搜索并替换确认.

现在你必须记录一个宏甚至更好 - 映射一个键.

以下是最终映射:

" For local replace
nnoremap gr gd[{V%::s////gc

" For global replace
nnoremap gR gD:%s////gc

把它放到你的.vimrc或只是执行.在按下gr局部变量后:s,您将进入命令,您只需输入new_variable_name并按下即可Enter.


+1用于学习超过5个我以前应该知道的新Vim技巧.谢谢
+1非常好的vimgineering(我想我刚创造了一个新名词).注意:我实际上需要按两次冒号(`:`).我第一次按它,我看到`:'<,'>`.如果我只是从那里键入`s /`它就不起作用; 我必须在`s /`之前键入另一个冒号.
注意:gd不能在macvim中以Javascript模式定位直接定义范围内的变量.它需要我在文件中的某个函数中首次使用变量名:(如果你在某个范围内并且想要选择那个范围,"va {" - "visual select around {" - 是要走的路我认为.
注意,在替换命令中不需要``,简单地省略搜索将导致vim使用最后搜索的模式,在本例中是从`gd`命令创建的.所以简单地做`:s // /gc`就足够了.
略有改进的版本:https://gist.github.com/048616a2e3f5d1b5a9ad提示用户,显示旧名称,更换后恢复光标位置
只有当我在s(:: s - >:s)之前删除一个冒号时,本地替换才有效.我看到有人编辑了添加第二个冒号的答案,我想知道他为什么这样做......

2> JaredPar..:

AFAIK,VIM没有实际的重构支持.在以重构为目的进行重命名时,我通常采取以下预防措施:

    使用标记限制更改的范围.

    输入正则表达式时,请使用\ <和>括起名称.这将使它与整个单词匹配,从而减少将发生的错误重命名的类型.

    不要进行多线更换以减少更换不良的可能性

    仔细查看代码差异,如果它不是一个小的变化.

我的结束变化看起来像这样

:'a,'bs/\/bar

我不喜欢错误的是没有VIM的重构工具,但我还没有看到它.



3> 小智..:

把它放在你的.vimrc中

" Function to rename the variable under the cursor
function! Rnvar()
  let word_to_replace = expand("")
  let replacement = input("new name: ")
  execute '%s/\(\W\)' . word_to_replace . '\(\W\)/\1' . replacement . '\2/gc'
endfunction

叫它 :call Rnvar()

expand("")获取光标下的单词.搜索字符串%用于文件范围,\(\W\)模式在要替换的单词的边界处查找非单词字符,并将它们保存在变量中\1,\2以便重新插入替换模式中.



4> Ivan Bartsov..:

我知道这是一个老问题,@ mykola-golubyev的方式显然是OP问题中特定情况的最佳答案(我假设是通过混淆代码,你可能有多个具有相同var名称的块) ; 但问题名称就像从谷歌搜索来到这里的许多人可能会寻找一种更少特定情况的方法来重命名VIM中的变量 - 这些可以更简洁

我很惊讶没有人建议这样:

* :s// 新名字 /gc

*是相同的gn- 它搜索光标下的单词的下一个出现并且它成为最后搜索的模式,因此当您在替换命令中省略搜索模式时,VIM假定这是要搜索的模式.

对于少量var副本,更快一个:

* cw 然后NEWNAME重复n.其他事件

搜索出现,cw更改单词的命令,n转到下一次出现以进行上次搜索并.重复最后一个命令(将更改单词更改为NEWNAME)

(知道所有这一切的信用证转到Reddit上的@doomedbunnies)

另一个很酷的伎俩是:( @ nobe4的积分)

* cgn 然后NEWNAME重复.其他事件

cgn是"改变(发现下次发生)的结果".现在这是最后一个命令,你不需要n转到下一次出现,所以再次减少笔划,更重要的是,不需要交替n..但是,显然,这个缺点是无法跳过某个事件.

这有一些好处:

没有映射,没有的.vimrc(或init.vim),这样你就可以在任何VIM用它复制你遇到(例如,快速的任务上一些VPS或您的朋友的机器其中,配置VIM自己的方式会破坏的目的,"快速" )

使用*gn用于单词选择非常快 - 只需一次击键(好吧,比方说1.5)

使用*gn确保你没有在其他单词中得到任何匹配,就像那样:%s///gc.节拍打字:%s/\/NEWNAME/gc:我个人倾向于忘记使用这些\<东西来限制匹配整个单词.

不使用范围只会导致一些额外的笔划n来跳过不需要的匹配 - 可能甚至比限制范围所需的额外笔划更少.在正常情况下,无论如何,您的变量很可能在某种程度上局限于某个代码块.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有