2011-07-01 79 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

好的,這並不像我想的那麼痛苦......我編輯了我的答案,現在它應該可以按照你的意願工作。如果您有任何問題,請告訴我(我沒有機會正確測試)。 –