【问题标题】:CamelCase Expansion in Vim like Intellij Idea?像 Intellij Idea 一样的 Vim 中的 CamelCase 扩展?
【发布时间】:2011-09-26 18:32:47
【问题描述】:

在 Intellij Idea 中,有一个功能。假设我在代码的某处使用了变量myCamelCase。然后,如果我输入mCC 并按Ctrl-Enter 或类似的组合键,它会扩展为myCamelCase。 Vim 中有类似的东西吗?

【问题讨论】:

    标签: vim intellij-idea camelcasing


    【解决方案1】:

    好的,请原谅我回答了两次,但由于我第一次尝试没有抓住重点,我会再试一次。这比我想象的要复杂,但可能没有我做的那么复杂(!)。

    现在已修改为建议所有匹配的变量名称。

    首先,这是一个从“myCamelCase”字符串生成“mCC”缩写的函数:

    function! Camel_Initials(camel)
        let first_char = matchstr(a:camel,"^.")
        let other_char = substitute(a:camel,"\\U","","g")
        return first_char . other_char
    endfunction
    

    现在,这里有一个函数,它采用缩写 ('mCC') 并扫描当前缓冲区(从当前行向后)以查找具有此缩写的“单词”。 返回所有匹配项的列表:

    function! Expand_Camel_Initials(abbrev)
        let winview=winsaveview()
        let candidate=a:abbrev
        let matches=[]
        try
            let resline = line(".")
            while resline >= 1
                let sstr = '\<' . matchstr(a:abbrev,"^.") . '[a-zA-Z]*\>'
                keepjumps let resline=search(sstr,"bW")
                let candidate=expand("<cword>")
                if candidate != a:abbrev && Camel_Initials(candidate) == a:abbrev
                    call add( matches, candidate )
                endif
            endwhile
        finally
            call winrestview(winview)
            if len(matches) == 0
                echo "No expansion found"
            endif
            return sort(candidate)
        endtry
    endfunction
    

    接下来,这是一个自定义完成函数,它读取光标下的单词并建议上述函数返回的匹配项:

    function! Camel_Complete( findstart, base )
        if a:findstart
            let line = getline('.')
            let start = col('.') - 1
            while start > 0 && line[start - 1] =~ '[A-Za-z_]'
                let start -= 1
            endwhile
            return start
        else
            return Expand_Camel_Initials( a:base )
        endif
    endfunction
    

    要使用它,你必须定义“completefunc”:

    setlocal completefunc=Camel_Complete
    

    要使用插入模式完成,请键入 CTRL-X CTRL-U,但我通常将其映射到 CTRL-L

    inoremap <c-l> <c-x><c-u>
    

    在你的 vimrc 中使用这段代码,你应该会发现键入 mCC 后跟 CTRL-L 将进行预期的替换。如果没有找到匹配的扩展,则缩写不变。

    代码不是无懈可击的,但它适用于我测试的所有简单案例。希望能帮助到你。如果有什么需要说明的,请告诉我。

    【讨论】:

    • 太棒了!这就是我能说的。我仍然贪婪/懒惰地要求你更多。如果有多个可能的扩展:例如myCamelCase myCamelCart,最后一个被选中。相反,可以让它表现得像 vim 中的 Ctrl-P 关键字完成吗?再次,太棒了!
    • 我很高兴它成功了!处理多个匹配应该只是让 Expand_Camel_Initials() 返回解决方案列表,然后设置 completefunc 让您在两者之间进行选择。我会在这周晚些时候尝试看看。
    • 好吧,这并没有我想象的那么痛苦……我已经编辑了我的答案,它现在应该可以如你所愿。如果您有任何问题,请告诉我(我没有机会正确测试它)。
    • 对不起,我错过了这条评论。我会试一试并反馈给你。有没有办法获得 cmets 的通知?
    【解决方案2】:

    在 Vim 中有一个名为 vim-abolish 的插件。使用地图crc 展开为驼峰式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 2019-10-16
      • 2021-05-28
      相关资源
      最近更新 更多