代码之家  ›  专栏  ›  技术社区  ›  Aditya Mukherji

在Vim中更改变量名

  •  85
  • Aditya Mukherji  · 技术社区  · 16 年前

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

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

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

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

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

    7 回复  |  直到 4 年前
        1
  •  213
  •   kevlar1818 jmetz    10 年前

    {}

    将光标移动到变量用法。按 gd 现在按 [{ -这将带您进入范围开始。 V -将打开“视觉线条选择”。 按 % -会跳到相反的方向 } :s/ -替换命令的开始。 <C-R>/ -将插入与变量名(按之前使用的名称)匹配的模式 ). /newname/gc<CR> -将在每次匹配时启动搜索并替换为确认。

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

    以下是最后的映射:

    " 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>
    

    把这个交给你的朋友 .vimrc gr 关于局部变量将带给您 :s 您只需输入的命令 new_variable_name 和新闻 .

        2
  •  19
  •   Ivan Bartsov    4 年前

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

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

    * :s// 新名称 /gc

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

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

    * cw 新名称 <esc> n. 对于其他事件

    连续波 命令是什么 , n 转到上一个搜索项的下一个匹配项,然后 . 将单词改为新名称 )

    (我知道这一切的功劳归于 @doomedbunnies on Reddit

    另一个很酷的技巧是:( credits to @nobe4 )

    * cgn 新名称 <电子稳定控制系统> 然后重复 . 对于其他事件

    cgn 是“改变任何结果(查找下一个事件)”。现在这是 ,你不需要 N 要转到下一个事件,则再次减少笔划,更重要的是,无需交替 N . . 但是,很明显,这种方法的缺点是无法跳过某个事件。

    以下是一些好处:

    • 没有映射,没有.vimrc(或init.vim),因此您可以在遇到的任何vim副本中使用它(例如,在某些VP或您朋友的机器上执行快速任务,按照您的方式配置vim将无法达到“快速”的目的)
    • 因为单词选择非常快——只需一次按键(比如说1.5)
    • 使用 * gn :%s/<C-R>//gc 做比键入 :%s/\<OLDNAME\>/NEWNAME/gc 手工:我个人倾向于忘记使用 \<
    • 不使用scope只会导致额外的一些笔划 N
        3
  •  10
  •   Community CDub    6 年前

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

    1. 限制更改我的使用标记的范围。
    2. 输入正则表达式时,将名称括在\<及>。这将使其匹配整个单词,从而减少将发生的错误重命名类型。
    3. 仔细检查代码差异,看它是否是一个小的变化以外的任何东西。

    我的找零看起来像这样

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

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

        4
  •  9
  •   Mike    11 年前

    把这个放进你的

    " 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>") 获取光标下的单词。搜索字符串使用 % \(\W\) 模式在要替换的单词边界处查找非单词字符,并将它们保存在变量中 \1 \2

        5
  •  4
  •   Sietse van der Molen    12 年前

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

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

    c代表确认。

        6
  •  0
  •   Kim Reece    16 年前

    在c语言中,您可以使用cscope取得一些进展。它试图理解语法,因此有机会知道字母何时是变量。

        7
  •  0
  •   Drew Olson    16 年前

    如果这是跨多个文件,您可以考虑查看SED。使用“查找”获取文件,并使用xargs plus sed进行替换。假设您想在所有匹配*.c的文件中用更好的名称替换a,您可以这样做

    找到-名称“*.c”| xargs sed-i-e's/a/a\u better\u name/g”

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