2011-01-23 4 views
1

ユーザーが<cr>(通常モードと挿入モードの両方)を押したときに何かをするvimscriptを書き込もうとしていますが、改行を挿入してカーソルを移動する通常の効果を妨げません(スマートインデントまたは他のインデントモードを考慮して)次の行の正しい位置に移動します。<cr>を関数に再マップした場合、関数内の元の<cr>をどう呼び出すことができますか?

提案がありますか?

答えて

1

てみてください。これは期待通りに動作します:

function s:DoSomething() 
    echom "Inside DoSomething" 
    return "\<CR>" 
    " return "\n" also works " 
endfunction 
inoremap <expr> <CR> <SID>DoSomething() 
" If DoSomething function cannot be executed inside a textlock: " 
inoremap <CR> <C-o>:call <SID>DoSomething()<CR><CR> 

noreに注意してください、それが再び置き換えられてからs:DoSomethingによって返さ<CR>を防止します。

0

マッピングの右側は<cr>で始まる必要があります。このように:

:imap <cr> <cr>sometext 

次に、再帰的にマッピングをトリガーしません。

出典: http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-Tutorial%28Part_1%29#Nested_.28recursive.29_maps

マップの{RHSが} {LHS}で始まる場合は、それは再帰的に置換されていません。たとえば、次のコマンドは、GQのための再帰的なマップを作成することはありません:あなたはこのような問題を持っていない可能性や*mapを省略する

:nmap gq gq 
関連する問題