2011-01-05 4 views
2

を考える:Vimの通常のコマンドで再帰マクロを記録して実行できますか?

https://stackoverflow.com/questions/ask 

を最初の文字で、通常モードから、qaqqaf/[email protected]@aでのタイピングは、スラッシュのすべてをクリアします。

  1. QAQレジスタ
  2. Qaが記録
  • F/X削除次のスラッシュ@aマクロ
  • Qを再実行
  • に終了記録を開始クリア

    しかし、normal qaqqaf/[email protected]@aを実行すると、bの後で停止します。再帰呼び出しでは、保留状態にあるようです。同じことは、あなたがコマンドをマップしようとすると起こります。

    私の構文に何か問題がありますか?または、normalで再帰マクロを記録することはできませんか?


    注:私はそれがletで再帰的なマクロを書くことが可能であることを知っています。

    let @a = "f/[email protected]" 
    normal @a 
    

    は:これはそれを手動で記録せずに再帰的なマクロを書くための唯一の方法である場合、私は思ったんだけど(私はこのための答えを尋ねる:Remove everything except regex match in Vim

  • +0

    に応じて変更する機能。だから、あなたはあなたのコマンドをレジスタに入れることは、テキストでヤンクするようなやり方です。私はマッピングのためにこれを行う最善の方法であることを 'let 'と信じています。 –

    +0

    ですが、 'normal' **で再帰マクロ**を記録することは可能ですか? – idbrii

    +0

    'normal'は再帰マクロをうまく扱えないようです。私は正しく記録することができないようです。しかし、 'execute'と' feedkeys() 'を一緒に使うことができます:' exe feedkeys( "qaqqar_l @ aq @ a"、 't') 'はマクロの記録と実行の両方を行います。 –

    答えて

    2

    あなたがにマップを作成したい場合

    nmap <f2> :let @a = "f/[email protected]"|normal @a 
    

    はもちろん、これは登録@a切り詰め、あなたが見つけた場合、あなた自身は、もっと自分のニーズに合うかもしれない機能のマッピングのこれらの種類の多くをやって:私が提案する再帰的なマクロは、あなたはとてもような何かを行うことによって開始します。

    はここで、再帰的マクロのマッピングを行うに安全な代替です:

    function! RecMacroExe(cmds) 
        let a = @a 
        let @a = a:cmds . "@a" 
        try 
        normal @a 
        finally 
        let @a = a 
        endtry 
    endfunction 
    
    nmap <f2> :call RecMacroExe("f/xb")<cr> 
    

    編集:Vimはマクロとしてレジスタに何かを実行することができ@Luc Hermitteコメント

    +0

    これらの場合、tryブロックに失敗する可能性のある部分をラップし、@aをfinallyブロックに戻す方が良いです。 –

    +0

    良いキャッチ@Luc。 –

    +0

    本質的に「通常使用しないで、letを使用してください」と受け入れられ、関数も良い考えです。 – idbrii