代码之家  ›  专栏  ›  技术社区  ›  Toskan

在vim中选择first char up to first non camelCase或non upper case char或up to first snake case

  •  0
  • Toskan  · 技术社区  · 5 年前

    我用了这张地图:

    map ,w v/\([^ a-z0-9]\|[^ A-Z0-9]\)*<cr>h

    mysuperTest
    MYSUPER_TEST
    mysuper_test
    

    总是选择显示mysuper的部分

    但它不起作用,不知道为什么

    0 回复  |  直到 5 年前
        1
  •  3
  •   filbranden    5 年前

    我会用下面这样的方法:

    nnoremap ,w v/\C\%#.\([a-z]\+\<bar>[A-Z]\+\)\zs<cr>h
    

    <bar> | 加上一个额外的反斜杠) :help map-bar .)

    另一个需要注意的是你希望比赛 开始 在第一个字的结尾你会这样说的 h ). 可视选择将扩展到 开始 \zs 显式设置匹配的开始(请参见 :help /\zs .)

    'ignorecase' 'smartcase' 设置。使用 \C 显式请求区分大小写的匹配(请参见 :help /\C .)

    \%# 匹配当前光标位置(请参见 :help /\%# ),所以您总是确保只匹配当前单词,而不会在缓冲区中徘徊。

    综合起来:

    \C         Case-sensitive search
    \%#        From cursor position
    .          Skip first character
    \(         Either one of:
      [a-z]\+  One or more lowercase letters
      \|       (\<bar>) Or:
      [A-Z]\+  One or more uppercase letters
    \)         End group
    \zs        Set match position here
    

    我保留了你找到第一个角色的初衷 之后 h

    [a-z]\+\zs[a-z] ,它将在最后一个小写字符上设置匹配的开始。您可以为组的两边都这样做(您可以有多个 在你的模式中,最后一个获胜。)如果你这样安排你的比赛,你就不需要决赛了 回去。

    我不会处理数字,我会把这些留给读者练习。

    最后,考虑到有相当多的拐角情况,可以使这样的映射变得非常棘手。与其提出自己的方法,不如看看那些添加了对处理CamelCase单词的支持的插件,这些单词已经过战斗测试,并且将覆盖比您这里使用的简单表达式更高级的用例?

    这是最棒的 vim-scripts/camelcasemotion Ingo Karkat建立了一个 ,w i,w 选择当前的。您可以使用强大的组合,例如 v3i,w 直观地选择当前和下两个CamelCase单词。

    你也可以看看蒂姆·波普的 tpope/vim-abolish cr 从camelCase到MixedCase、snake_case、UPPER_case等执行强制的映射(不直接选择它们,但仍然相关,您可能会发现它很有用)