1

私はVim の Mapping keys - Tutorial (Part 1) - 6.2 Insert mode mapsに従っています。そこには次のように書かれています。

The <C-R>= command doesn't create a new undo point.
You can also call Vim functions using the <C-R>= command:

:inoremap <F2> <C-R>=MyVimFunc()<CR>

私はこれを使って次のように呼び出そうとしていますSingleCompile#Compile():

map! <F5> <C-R>=SingleCompile#Compile()<CR>

動作していますが、問題は、挿入モードに戻ると0、副作用として文字が挿入されることです。

これはなぜですか、どうすれば回避できますか?

編集:

<C-R>元に戻すポイントを作成せず、コマンドを入力する代わりに関数を呼び出す目的があるため、使用して<C-O>います。元に戻すポイントを作成したくありません。

編集:

Ingo Karkat によって提供された三項演算子のトリックに基づいて、VIM wiki を更新しました。

4

3 に答える 3

2

関数の暗黙の戻り値は です0SingleCompile#Compile()空の文字列を返すラッパーを変更または作成する必要があります。

function! SingleCompileWrapper()
    call SingleCompile#Compile()
    return ''
endfunction

map! <F5> <C-R>=SingleCompileWrapper()<CR>

?:別の巧妙なトリックは、三項演算子内で関数を評価することです。

map! <F5> <C-R>=SingleCompile#Compile()?'':''<CR>
于 2012-07-27T11:07:37.860 に答える
1

「0」は関数の戻り値であり、挿入モードで呼び出されたときに自然にバッファーに挿入されます

コマンドの挿入モードを終了するには、<CR> の代わりに <CO> を使用します。

于 2012-07-27T10:49:48.207 に答える
0

私はそのアプローチをお勧めしませんが、田舎者の解決策はどうですか(0事後を削除するだけです):

map! <F5> <C-R>=SingleCompile#Compile()<CR><BS>

真剣に、<C-R>使用できず、挿入モードを終了する必要がある状況では、:undojoin役立つ場合があります。

于 2012-07-27T11:17:29.347 に答える