我试图通过Vim读取很多C/Perl代码,其中包含许多单字母变量名.
在我阅读代码的过程中,有一些命令可以帮助我将变量的名称更改为更有意义的内容,这样我就可以更快地阅读其余内容.
在Vim中是否有一些命令可以让我快速执行此操作?
我不认为正则表达式会起作用,因为:
相同的单个字母名称在不同的作用域块中可能具有不同的用途
相同的字母组合可以是另一个较大的var名称的一部分,或者在字符串或注释中......不想修改它们
任何已知的方案?
以下是如何重命名在当前范围中定义的变量{}
.
将光标移动到变量用法.按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.
AFAIK,VIM没有实际的重构支持.在以重构为目的进行重命名时,我通常采取以下预防措施:
使用标记限制更改的范围.
输入正则表达式时,请使用\ <和>括起名称.这将使它与整个单词匹配,从而减少将发生的错误重命名的类型.
不要进行多线更换以减少更换不良的可能性
仔细查看代码差异,如果它不是一个小的变化.
我的结束变化看起来像这样
:'a,'bs/\/bar
我不喜欢错误的是没有VIM的重构工具,但我还没有看到它.
把它放在你的.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
以便重新插入替换模式中.
我知道这是一个老问题,@ 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/
.节拍打字:%s/\
:我个人倾向于忘记使用这些\<
东西来限制匹配整个单词.
不使用范围只会导致一些额外的笔划n
来跳过不需要的匹配 - 可能甚至比限制范围所需的额外笔划更少.在正常情况下,无论如何,您的变量很可能在某种程度上局限于某个代码块.