在Vim中更改variables名称
我想通过包含许多单字母variables名称的vim读取大量的c / perl代码。
当我正在阅读代码的过程中,有一些命令可以帮助我将variables的名称更改为更有意义的命令,以便更快地读取其余部分。
在vim中有一些命令可以让我快速的做到这一点。
我不认为正则expression式会起作用
1)在不同的范围块中,相同的单个字母名称可能有不同的用途
2)相同的字母组合可能是另一个更大的var名称的一部分,或者在一个string或注释中。不想修改这些
任何已知解决scheme
以下是如何重命名在当前范围{}
定义的variables。
将光标移动到variables用法。 按gd
。 这意味着 – 将光标移动到定义。 现在按[{
– 这将使您开始范围。 按V
– 将打开视觉线select。 按%
– 将跳转到相反的}
因此将select整个范围。 按:s/
– 替代命令的开始。 <CR>/
– 将插入与variables名称相匹配的模式(在按gd
之前,你的名字是)。 /newname/gc<CR>
– 将开始search,并在每场比赛中进行确认。
现在你必须logging一个macros,甚至更好 – 映射一个键。
这里是最终的映射:
" For local replace nnoremap gr gd[{V%::s/<CR>///gc<left><left><left> " For global replace nnoremap gR gD:%s/<CR>///gc<left><left><left>
把这个放在你的.vimrc
或者直接执行。 在这个局部variables的按下之后,你可以input:s
命令,你只需要inputnew_variable_name
,然后回车即可 。
AFAIK,VIM中没有实际的重构支持。 当重组的意图进行重命名时,我通常采取以下的认识。
- 限制更改我使用标记的范围。
- input正则expression式时,用\ <和>括起名字。 这将使它匹配整个单词,减less将发生不正确的重命名的types。
- 不要多行replace,以减less更换不良的可能性
- 仔细查看代码diff,看看是否有其他变化。
我的最终变化看起来像这样
:'a,'bs/\<foo\>/bar
我很想在VIM中没有重构工具,但我没有看到它。
把它放在你的.vimrc里
" Function to rename the variable under the cursor function! Rnvar() let word_to_replace = expand("<cword>") let replacement = input("new name: ") execute '%s/\(\W\)' . word_to_replace . '\(\W\)/\1' . replacement . '\2/gc' endfunction
调用它:call Rnvar()
expand("<cword>")
获取光标下的单词。 searchstring使用%
作为文件范围, \(\W\)
模式在要replace的单词边界处寻找非单词字符,并将它们保存在variables\1
和\2
中,插入replace模式。
您可以在全局search中使用'c'修饰符,并replace它会要求您确认每个replace。 这将花费更长的时间,但它可能适用于非庞大的代码文件:
%s/\$var/\$foo/gc
c代表确认。
在c中,你可能可以使用cscope取得一些进展。 它试图理解语法,所以有可能知道这个字母是一个variables。
如果这是跨多个文件,你可以考虑看看sed。 使用find来抓取你的文件和xargs加sed来replace。 假设你想在所有匹配* .c的文件中用a_better_namereplace,你可以这样做
找 。 -name“* .c”| xargs sed -i -e's / a / a_better_name / g'
请记住,这将取代所有出现的,所以你可能想要一个更强大的正则expression式。