2

これは、プラグインを作成しようとしているときに遭遇した奇妙な状況です。私には Vim のバグのように見えますが、何かが欠けている可能性があるため、StackOverflow の知恵に頼りました。

次の関数を使用します。

fun! Test()
    normal! q ; Stop recording a macro.
    let @r='kkkkkkkkkkkkk'
    normal! @r
    normal! qm
endf

基本的に、マクロの記録を停止し、レジスタの内容を試して実行してから、マクロの再記録を開始します。

この関数を呼び出すにはqm、 を押し、いくつかのコマンドを実行してから、関数を呼び出します。

私が期待すること

「kkkkkk」が実行され、録音が再開されることを期待しています。

何が起こるのですか

「kkkk」が実行されますが、記録は再開されません

理由がわかりません!

回避策

次の関数は私が望むことを行いますが、ハックです。私は自分の問題の根本的な原因を理解しようとしています:

楽しい!Test() 正常です! q let @r='kkkkkkkkkkkkk' は "normal!" を実行します。@r 普通!qm endf

レジスターの実行を、レジスターの内容を直接実行する実行呼び出しに置き換えただけです。基本的に、私はvimをだまして、レジスターを実行しているとは思わないようにしました。

注:なぜ私はこれが欲しいのですか

プラグイン用です。この関数は、私が作成できる最小のものであり、問​​題を示しています。なぜこれが必要なのかを説明する価値はありません。必要な基本機能は、関数内からレジスタを実行してから、記録を再開することでした。実際の使用例では、実行して記録するレジスタは同じですが、この問題には影響していないようです。

それで、何かアイデアはありますか?

4

1 に答える 1

3

関数呼び出しをマッピング内に埋め込むことができないのはなぜですか。

function Test()
    let @r='kkkkkkkkkkkk'
    normal! @r
endfunction
nnoremap Q q:call Test()<CR>qm

? 「m」が実際には一定でない値の場合は、次を使用する必要があります<expr>

nnoremap <expr> Q "q:call Test()\nq".g:plugin_register

. もちろん、<expr>マッピング内で関数呼び出しを使用できます (したがってnormal! @r、関数の出力に移動します:式は、バッファ編集、カーソルの切り替え、移動がreturn '@r'許可されていないため)。normal!

于 2012-05-28T04:32:58.030 に答える