2017-02-08 7 views
0

私は少し時間をかけてvimプラグインの開発に取り組んでいますが、数週間はロードブロッキングで立ち往生しています。私はvimscriptで書かれており、(){}[]""''のペアのための簡単な自動ペアリングプログラムです。私は終了時に終了文字()}])の右にスキップするようにしようとしています。今私の焦点は、)]}文字のためだけに機能するようになっています。vimscriptの終了文字をスキップする

私の問題は、閉じた文字入力が入力されたときに関数を実行するのに問題があることです。ここで

は、私がこれまで試してみましたものです: 最初の試行:

inoremap (() 
inoremap (h()<LEFT> 
inoremap (l();<RETURN> 
inoremap (" ("")<LEFT><LEFT> 
inoremap (' ('')<LEFT><LEFT> 
inoremap (;();<DOWN> 
inoremap) call CloseChar() 

inoremap [ [] 
inoremap [h []<LEFT> 
inoremap ] call CloseChar() 

inoremap { {} 
inoremap {h {}<LEFT> 
inoremap {<RETURN> {<RETURN><TAB><RETURN><BACKSPACE>}<UP><TAB> 
inoremap } call CloseChar() 

inoremap " "" 
inoremap "h ""<LEFT> 
inoremap "l "";<RETURN> 

inoremap ' '' 
inoremap 'h ''<LEFT> 
inoremap 'l '';<RETURN> 

function CloseChar() 
    if matchstr(getline('.'), '\%' . col('.') . 'c.') == '}' 
     return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ')' 
     return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ']' 
      return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == '"' 
      return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ''' 
      return <RIGHT> 
    endif 
endfunction 

第二の試み:

inoremap (() 
inoremap (h()<LEFT> 
inoremap (l();<RETURN> 
inoremap (" ("")<LEFT><LEFT> 
inoremap (' ('')<LEFT><LEFT> 
inoremap (;();<DOWN> 
inoremap) :call CloseChar() 

inoremap [ [] 
inoremap [h []<LEFT> 
inoremap ] :call CloseChar() 

inoremap { {} 
inoremap {h {}<LEFT> 
inoremap {<RETURN> {<RETURN><TAB><RETURN><BACKSPACE>}<UP><TAB> 
inoremap } :call CloseChar() 

inoremap " "" 
inoremap "h ""<LEFT> 
inoremap "l "";<RETURN> 

inoremap ' '' 
inoremap 'h ''<LEFT> 
inoremap 'l '';<RETURN> 

function CloseChar() 
    if matchstr(getline('.'), '\%' . col('.') . 'c.') == '}' 
     return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ')' 
     return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ']' 
      return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == '"' 
      return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ''' 
      return <RIGHT> 
    endif 
endfunction 

3回目の試み:

inoremap (() 
inoremap (h()<LEFT> 
inoremap (l();<RETURN> 
inoremap (" ("")<LEFT><LEFT> 
inoremap (' ('')<LEFT><LEFT> 
inoremap (;();<DOWN> 
inoremap <silent>) :call CloseChar() 

inoremap [ [] 
inoremap [h []<LEFT> 
inoremap <silent>] :call CloseChar() 

inoremap { {} 
inoremap {h {}<LEFT> 
inoremap {<RETURN> {<RETURN><TAB><RETURN><BACKSPACE>}<UP><TAB> 
inoremap <silent>} :call CloseChar() 

inoremap " "" 
inoremap "h ""<LEFT> 
inoremap "l "";<RETURN> 

inoremap ' '' 
inoremap 'h ''<LEFT> 
inoremap 'l '';<RETURN> 

function CloseChar() 
    if matchstr(getline('.'), '\%' . col('.') . 'c.') == '}' 
     return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ')' 
     return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ']' 
      return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == '"' 
      return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ''' 
      return <RIGHT> 
    endif 
endfunction 

最後の試み:

inoremap (() 
inoremap (h()<LEFT> 
inoremap (l();<RETURN> 
inoremap (" ("")<LEFT><LEFT> 
inoremap (' ('')<LEFT><LEFT> 
inoremap (;();<DOWN> 

inoremap [ [] 
inoremap [h []<LEFT> 

inoremap { {} 
inoremap {h {}<LEFT> 
inoremap {<RETURN> {<RETURN><TAB><RETURN><BACKSPACE>}<UP><TAB> 

inoremap " "" 
inoremap "h ""<LEFT> 
inoremap "l "";<RETURN> 

inoremap ' '' 
inoremap 'h ''<LEFT> 
inoremap 'l '';<RETURN> 

function CloseChar() 
    if matchstr(getline('.'), '\%' . col('.') . 'c.') == '}' 
     return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ')' 
     return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ']' 
      return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == '"' 
      return <RIGHT> 
    elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ''' 
      return <RIGHT> 
    endif 
endfunction 

call CloseChar() 

CloseChar()の代わりに、),],}が挿入されます。私が参照したソリューションのソースはlearnvimscriptthehardwayFive Minute Vimscriptです。いくつかのstackoverflow投稿(私は、関連するすべてのフォーラムや記事をリンクするには十分な評判がありません。申し訳ありません)。

本質的に、私は立ち往生しており、プラグインを修正して動作するように頼んでいます。

注: 大きな違いがあるかどうかわかりませんが、Linux用のWindowsサブシステム(wsl)からvimを使用しています。

inoremap (() 
inoremap (h()<LEFT> 
inoremap (l();<RETURN> 
inoremap (" ("")<LEFT><LEFT> 
inoremap (' ('')<LEFT><LEFT> 
inoremap (;();<DOWN> 
inoremap) <Esc><RIGHT>:call CloseChar()<cr>i 

inoremap [ [] 
inoremap [h []<LEFT> 
inoremap ] <Esc><RIGHT>:call CloseChar()<cr>i 


inoremap { {} 
inoremap {h {}<LEFT> 
inoremap {<RETURN> {<RETURN><TAB><RETURN><BACKSPACE>}<UP><TAB> 
inoremap } <Esc><RIGHT>:call CloseChar()<cr>i 

inoremap " "" 
inoremap "h ""<LEFT> 
inoremap "l "";<RETURN> 

inoremap ' '' 
inoremap 'h ''<LEFT> 
inoremap 'l '';<RETURN> 

function! CloseChar() 
    if matchstr(getline('.'), '\%' . col('.') . 'c.') =~# '\v\)|]|"|''|}' 
     normal! l 
    endif 
endfunction 

答えて

0

私はこの作業を少し改良で最初の試みを検討していますその関数を呼び出すことができるモードです。それは動作しません。

カーソル下の文字はキー君と同じである場合、最良の方法は何を入力したか<right>(実際には、あなたがREDOをサポートするために<c-g>U<right>を返したい)のいずれかを返すinoremap-<expr>を持っているだろうちょうど入力しました。

<esc> + iで遊ぶことは、副作用が多すぎることに注意してください。私が言ったように、<c-o>、またはさらに良い場合はinoremap-<expr>とします。

((;(IOW、ちょうどキーと同じキーの後に何かが続きます)をマップすると、すぐにはトリガーされないがタイムアウトの後のマッピングが観察されます。(私はほぼ20年間進化したmappingsを維持してきた)大括弧に関する多くの実験の結果、私の結論は次のとおりです。ブラケットの開始文字から始まり、改行を挿入するのに必要なコンテキストマッピングすべてのカッコを閉じたり、開いているカッコをすべて閉じたり、セミコロンを追加したりするなどの操作を行うことができます。

+1

ありがとうございました。これは私にとって完璧に機能します。 – CMason8856

+0

お手伝いします! –

0

あなたの最初の問題は、あなたがに行くことなく、インサートモードマッピングから関数を呼び出すしようとしているということです。

関連する問題