Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Vim中快速更改变量名?_Vim_Variables_Refactoring - Fatal编程技术网

如何在Vim中快速更改变量名?

如何在Vim中快速更改变量名?,vim,variables,refactoring,Vim,Variables,Refactoring,我正在使用Vim阅读大量包含许多单字母变量名的C和Perl代码 在我阅读代码的过程中,如果有一些命令可以将变量的名称更改为更有意义的名称,那就太好了,这样我就可以更快地阅读其余的代码 Vim中是否有一些命令可以让我快速执行此操作 我认为正则表达式行不通,因为: 相同的单字母名称在不同的范围块中可能有不同的用途;及 相同的字母组合可以是另一个较长的变量名、字符串文字或注释的一部分 有任何已知的解决方案吗?您可以在全局搜索和替换中使用“c”修饰符,该修饰符将要求您确认每次替换。这将花费更长的时间

我正在使用Vim阅读大量包含许多单字母变量名的C和Perl代码

在我阅读代码的过程中,如果有一些命令可以将变量的名称更改为更有意义的名称,那就太好了,这样我就可以更快地阅读其余的代码

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

我认为正则表达式行不通,因为:

  • 相同的单字母名称在不同的范围块中可能有不同的用途;及

  • 相同的字母组合可以是另一个较长的变量名、字符串文字或注释的一部分


  • 有任何已知的解决方案吗?

    您可以在全局搜索和替换中使用“c”修饰符,该修饰符将要求您确认每次替换。这将花费更长的时间,但可能适用于非大型代码文件:

    %s/\$var/\$foo/gc
    

    c代表确认。

    好的,VIM中没有实际的重构支持。为了重构而重命名时,我通常采取以下预防措施:

  • 限制更改我的使用标记的范围
  • 输入正则表达式时,将名称括在\<和>。这将使其匹配整个单词,从而减少将发生的错误重命名类型
  • 不要执行多行替换以减少错误替换的机会
  • 仔细检查代码差异,看它是否是一个小的变化以外的任何东西
  • 我的找零看起来像这样

    :'a,'bs/\<foo\>/bar
    
    :'a,'bs/\/bar
    

    我很想对VIM没有重构工具的说法有所误解,但我还没有看到它

    以下是如何重命名当前作用域中定义的变量
    {}

    将光标移动到变量用法。按
    gd
    。这意味着-将光标移动到定义。 现在按
    [{
    -这将使您进入范围开始。 按
    V
    -将打开可视行选择。 按
    %
    -将跳转到对面的
    }
    从而选择整个范围。 按
    :s/
    -开始替换命令。
    /
    -将插入与变量名匹配的模式(您在按下
    gd
    之前使用的名称)。
    /newname/gc
    -将启动搜索,并在每次匹配时用确认进行替换

    现在你必须记录一个宏,或者更好地映射一个键

    以下是最后的映射:

    " For local replace
    nnoremap gr gd[{V%::s/<C-R>///gc<left><left><left>
    
    " For global replace
    nnoremap gR gD:%s/<C-R>///gc<left><left><left>
    
    本地替换的
    ”
    nnoremap gr gd[{V%::s///gc
    “全球替代
    nnoremap gR gD:%s///gc
    
    将其放入
    .vimrc
    或直接执行。
    在局部变量上按
    gr
    之后,您将进入
    :s
    命令,在该命令中,您只需输入
    new\u variable\u name
    ,然后按enter键。

    在c中,您可以使用cscope取得一些进展。它试图理解语法,因此有机会知道字母何时是变量如果这是跨多个文件,你可以考虑查看SED。使用find来获取你的文件和XARGS加上SED进行替换。如果你想在所有与*.c匹配的文件中替换一个AyBeTyType名称,你可以做< /P> 查找。-name“*.c”| xargs sed-i-e's/a/a_better_name/g'


    请记住,这将替换所有出现的正则表达式,因此您可能需要一个更健壮的正则表达式。

    将其放在.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
    
    函数重命名光标下的变量 函数!Rnvar() 让单词_to_replace=展开(“”) 让替换=输入(“新名称:”) 执行“%s/\(\W\)”。word要替换。“\(\W\)/\1”。替换。“\2/gc” 端功能 用
    调用它:调用Rnvar()

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

    我知道这是一个老问题,@mykola golubyev的方法显然是OP问题中特定情况的最佳答案(我假设这是经过模糊处理的代码,其中可能有多个具有相同var名称的块);但对于问题名称,许多来自谷歌搜索的人可能会寻找一种不太特定于情况的方法来重命名VIM中的变量——这些方法可以更简洁

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

    *
    :s/
    新名称
    /gc

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

    对于少量的var副本,更快速的副本:

    *
    cw
    新名称
    然后对其他事件重复
    n.

    搜索匹配项,
    cw
    是更改单词的命令,
    n
    转到上一个搜索词的下一个匹配项,
    重复上一个命令(将单词更改为新名称)

    (我知道这一切的功劳归我所有)

    另一个很酷的技巧是:()

    *
    cgn
    新名称
    ,然后对其他事件重复

    cgn
    是“改变任何结果(查找下一个事件)“。现在这是最后一个命令,您不需要使用
    n
    转到下一个事件,因此再次减少笔划,更重要的是,不需要交替使用
    n
    。但是,很明显,这一命令的缺点是无法执行