2011-07-01 35 views
5

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

回答

8

好的,原谅我回答两次,但自从我第一次尝试错过了这一点,我会再去一次。这比我想象的要复杂得多,但可能并不像我所做的那样复杂(!)。

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

首先,这里有一个函数生成从“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”)的功能和扫描当前缓冲区(从当前行向后)为具有此缩写的“词”。返回A的所有比赛的名单:

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-XCTRL-U,但我通常这个映射到CTRL-L

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

有了这个代码,在vimrc你会发现,打字,然后mCCCTRL-L将进行预期替换。如果未找到匹配的扩展名,则缩写不变。

该代码不是防水的,但它适用于我测试的所有简单案例。希望能帮助到你。让我知道是否需要澄清。

+0

令人惊叹!这就是我所能说的。尽管如此,我仍然贪婪地/懒惰地向你要求更多。如果有多个可能的扩展:例如myCamelCase myCamelCart,选择最后一个。相反,它可以像Vim中的Ctrl-P关键字完成一样吗?再次,惊人! – dharm0us

+0

我很高兴它的工作!处理多个匹配应该只是让Expand_Camel_Initials()返回一系列解决方案,然后设置'completefunc'来让你在两者之间进行选择。我会尽力在本周晚些时候看看它。 –

+0

好的,这并不像我想的那么痛苦......我编辑了我的答案,现在它应该可以按照你的意愿工作。如果您有任何问题,请告诉我(我没有机会正确测试)。 –