2011-07-01 6 views
5

Intellij Ideaには、機能があります。私がコードのどこかで変数myCamelCaseを使用したとしましょう。次に、mCCと入力してを入力すると、 - と入力します。またはそのようなキーの組み合わせを入力すると、myCamelCaseに展開されます。 Vimに似たものがありますか?IntellijのアイデアのようなVimでのCamelCaseの拡張?

答えて

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」)を取り、スキャン機能がありますこの省略形を持つ「単語」の現在のバッファ(現在の行から後ろに)。 すべての一致のリストが返されます。

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 

使用するに

setlocal completefunc=Camel_Complete 

:これを使用するには、あなたは「completefunc」を定義する必要がありますあなたはmCCが続いタイピングことを見つける必要があり、あなたのvimrcでこのコードでは

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

:挿入モードの補完、タイプCTRL-XCTRL-Uが、私は通常CTRL-LにこれをマッピングしますCTRL-Lは、期待される交換を行います。一致する展開が見つからない場合、省略形は変更されません。

コードは水密ではありませんが、テストしたすべての単純なケースで機能します。それが役に立てば幸い。説明が必要なものがあればお知らせください。

+0

素晴らしい!それは私が言うことができるすべてです。それでも私はあなたにもっと尋ねるほど欲張り/怠惰です。可能な展開が複数ある場合:たとえば、 myCamelCase myCamelCart、最後のものが選択されます。その代わりに、vimでCtrl-Pキーワード補完のように動作させることができますか?再び、素晴らしい! – dharm0us

+0

私はうまく働いた!複数の一致を扱うには、ソリューションのリストを返すExpand_Camel_Initials()を取得し、その間に選択できるように 'completefunc'を設定するだけです。私は今週末に試してみるつもりです。 –

+0

さて、私が思ったほど苦痛ではなかった...私は自分の答えを編集したので、今はあなたが望むように動くはずです。問題がある場合は教えてください(私はそれを正しくテストする機会がありませんでした)。 –

0

これには、vim-abolishというVimのプラグインがあります。キャメルケースに展開するにはcrcマップを使用してください。

関連する問題