2

出力するテキストをモーションで制御できるようにする vim マッピングを作成したいと思います。これに関するドキュメントはそれほど多くないようで、vim のヘルプ ページのサンプルを必要なものに適合させるのに苦労しています。これは私が持っているもので、エラーは発生しませんが、テキストは置き換えられません。私は何が欠けていますか?

nmap ,s :set opfunc=CustomFunc<cr>g@

function! CustomFunc(type, ...)
    let sel_save = &selection
    let &selection = "inclusive"
    let reg_save = @@

    if a:type == 'line'
        silent exe "normal! '[V']!sort"
    elseif a:type == 'block'
        silent exe "normal! `[\<C-V>`]!sort"
    else
        silent exe "normal! `[v`]!sort"
    endif

    let &selection = sel_save
    let @@ = reg_save
endfunction

!sortテスト用の非常に簡単な例として使用しました。ここでのアイデアは、次のようなブロックを持つことができるということです:

{
    Hello, World!
    Hello, Earth!
    Hello, Planet!
}

その後、カーソルを {} ブロック内のどこかに移動して入力,si{すると、ブロックが次のように置き換えられます

{
    Hello, Earth!
    Hello, Planet!
    Hello, World!
}

回避策はvi{:!sort<cr>、 または の場合は ですがvmap ,s :!sortvi{,sこれを演算子のマッピングとして使用すると便利です (タイピングが少なく、柔軟性が高いなど)。

4

2 に答える 2

2

を使用した外部フィルタリングは、行単位以外のものになることはないと思います:!

systemそのようなものが必要な場合は、Vimのフィルタリングコマンドに頼るのではなく、関数などに頼ってバッファの内容を「手動で」操作する必要があると思います。

行ごとのケースでは、次のはるかに単純な呪文で修正できます。

'[,']!sort

つまり、代わりにsilent exe "normal! '[V']!sort". exec/ で暗示される追加のモード切り替えnormalは、オペレーター保留モード (?) を強制終了すると思います。

{
    Hello, World!
    Hello, Earth!
    Hello, Planet!
}

(カーソルを に置き、Wと入力,SiB):

{
    Hello, Earth!
    Hello, Planet!
    Hello, World!
}
于 2013-08-20T20:04:31.493 に答える
1

Ex コマンドは常に行単位なので、思いどおりに動作しません。それを支援するプラグインがいくつかあります (たとえば、Dr. Chips VIS プラグインや私のNrrwRgnプラグインなど)。

于 2013-08-20T20:49:48.327 に答える