【问题标题】:camelCase to underscore in vi(m)在 vi(m) 中下划线的驼峰式
【发布时间】:2011-07-08 07:11:46
【问题描述】:

如果由于某种原因我想选择性地将骆驼命名的东西转换为在 vim 中以下划线分隔,我该怎么做呢?

目前我发现我可以搜索/s[a-z][A-Z] 并记录一个宏来添加下划线并转换为小写,但我很好奇我是否可以使用类似的东西:

%s/([a-z])([A-Z])/\1\u\2/gc

提前致谢!

编辑:我找到了 camelCase 的答案(这是我真正需要的),但是其他人可以回答如何将 CamelCase 更改为 camel_case 吗?

【问题讨论】:

    标签: regex vim replace case-conversion


    【解决方案1】:

    您可能想试试 Tim Pope 的 Abolish 插件。它提供了一些从一种风格到另一种风格的强制捷径。例如,以:

    开头
    MixedCase
    

    输入crc [助记符:CoeRce to Camelcase] 会得到:

    mixedCase
    

    输入crs [助记符:CoeRce to Snake_case] 会得到:

    mixed_case
    

    输入crm [助记符:CoeRce to MixedCase] 将带您回到:

    MixedCase
    

    如果你还安装了repeat.vim,那么你可以通过按点键重复强制命令。

    【讨论】:

    • 我认为这是最好的答案。无需重新发明轮子。
    • 非常不错的插件,它还涵盖了用单个命令系统地替换多个单词变体,例如儿童 -> 成人和儿童 -> 成人
    • 补救问题,我似乎无法弄清楚如何“输入 crc”。我尝试过处于正常、可视、插入和选择模式。
    • 哦,但也许我安装错了?安装说明说“在 ~/.vim 或 ~\vimfiles 中提取”所以我将 abolish.zip 提取到 ~/.vim 但据我所知,我实际上并没有完成任何事情。
    【解决方案2】:

    这有点长,但似乎可以完成工作:

    :%s/\<\u\|\l\u/\= join(split(tolower(submatch(0)), '\zs'), '_')/gc

    【讨论】:

    • 为了不匹配以大写开头的单词,我稍微修改了这个正则表达式:%s/\( \)\@<!\<\u\|\l\u/\=len(submatch(0)) == 1 ? tolower(submatch(0)) : submatch(0)[0].'_'.tolower(submatch(0)[1])/gc
    • 答案的正则表达式(\<\u)的第一个分支匹配Word中的大写字母,所以如果您不想匹配它们,只需删除\<\u\|并使用@987654326 @作为正则表达式::%s/\l\u/...
    • @MertNuhoglu 如果人们错过了一场比赛,有没有办法让它退回去?谢谢!
    【解决方案3】:

    我想我应该再尝试大约 5 分钟。好吧...如果有人好奇:

    %s/\(\l\)\(\u\)/\1\_\l\2/gc 可以解决问题。

    实际上,我意识到这适用于 camelCase,但不适用于 CamelCase,它也可能对某人有用。

    【讨论】:

      【解决方案4】:

      我创建了一个插件来实现这一点。 https://github.com/chiedojohn/vim-case-convert

      要转换大小写,请在可视模式下选择一个文本块,然后输入以下内容之一(自我解释):

      :CamelToHyphen :CamelToSnake :HyphenToCamel :HyphenToSnake :SnakeToCamel :SnakeToHyphen

      要转换文档中的所有单词,请运行以下命令之一:

      :CamelToHyphenAll :CamelToSnakeAll :HyphenToCamelAll :HyphenToSnakeAll :SnakeToCamelAll :SnakeToHyphen

      在上述任何命令中添加一个 bang(例如 :CamelToHyphen!)以绕过每次转换前的提示。 您可能不想这样做,因为插件不知道文件中变量或其他文本之间的区别。

      【讨论】:

        【解决方案5】:

        对于 CamelCase 案例:

        %s#(\
        
        

        提示:可以像我的示例中那样更改正则表达式分隔符,以使其(在某种程度上)更易读。

        【讨论】:

          【解决方案6】:

          我有一个用于各种面向开发的处理的 API。除此之外,它还提供了一些函数用于在(可配置的)约定(变量 属性 getter setter 常量 参数 ...)和样式(camelcase (低/高) 下划线)。这些转换函数已被封装到一个插件中。

          插件+API可以从这里获取:https://github.com/LucHermitte/lh-dev,对于这个名称转换任务,它需要lh-vim-lib

          可以通过以下方式使用:

          • 将光标放在要重命名的符号上
          • 输入:NameConvert + 你希望的转换类型(这里:underscore)。注意:此命令支持自动完成。
          • 瞧!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-05
            • 2015-05-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多