これに関する私の研究から、少なくとも2つのカスタムモーションを定義する必要があります。1つ目はカーソルを移動するためのもので、2つ目は演算子で使用するためのものです。フル機能のセットアップのために、それははるかに複雑である、と私は内のコードを見て推薦するCamelCaseMotionによってインゴKarkatショーがかなり多く、私は以下のやるよりも、この権利を行う上で思いました。私の答えのほとんどは、Vimのヘルプと実験で見つかった簡単な情報に基づいています。
次の例では、およびモーションを再マッピングして、文の両端を実行します。例を変更することにより、必要に応じて他の文字を使用できます。(と比較して)より堅牢なオプションの例も紹介します。そうすることで、もしあなたがすでに文の終わりにいるのなら、その方法のために、この文の後の最後に移動するのではなく、最後に留まることになります。別の結果でそれを置き換えることを試みることができます。これは実際には、テキストオブジェクトのいずれかの側をモーションに変換するために機能します。)
(
vis<ESC>
)T.
is
as
まず、ノーマルモードの動き
注これは、ビジュアルモードまたはオペレーター保留モードでは機能しません。
function! MoveToEnd(type, ...)
exe "normal `]"
endfunction
map <silent> \) :set opfunc=MoveToEnd<CR>g@
nmap ) \)is
最初に、と呼ばれる新しい関数を定義します。MoveToEnd
その唯一の仕事は、カーソルを「以前に変更またはヤンクされたテキストの最後の文字」である]
マークに置くことです(を参照:help ']
)。
次に、モーションが与えられたときに関数\)
を呼び出すカスタムオペレーターを作成しますMoveToEnd
。このようにして、]
マークは新しいオペレーターに与えられた選択の終わりになります。(を参照:help map-operator
)
最後に、モションで)
カスタムオペレーターを呼び出すようにマップしますis
。これによりvis<ESC>
、最後のビジュアル選択を変更せず、モードを変更せずに、同等の効果を効果的に与えます。
逆も同様ですが、他の方向を使用するだけです。
function! MoveToBeginning(type, ...)
exe "normal `["
endfunction
map <silent> \( :set opfunc=MoveToBeginning<CR>g@
:nmap ( \(is
第二に、オペレーターの動き
これはトリッキーです。上記の動きは開始位置を破壊するので、「d」のような演算子は最終的に何に対しても機能しなくなります。必要なのは、開始位置を保存して終了位置を追加できるようにすることです。:help omap-info
(マッピングを保留しているオペレーター)は、これを行うためのヒントを提供します。これは、実際にビジュアルモードを使用することです。
次に、位置をビジュアル選択レジスタの一端に保存し、上から通常モードのモーションを使用して、他のビジュアル選択レジスタを設定してから、ビジュアルモードをアクティブにします。
function! SelectToEnd()
normal m< "Set start point of visual selection
normal ) "Move to end of sentance (relies on mapping from earlier)
normal m> "Set end point of visual selection
normal gv " 'Go Visual' activate visual mode using selection marks
endfunction
omap ) :call SelectToEnd()<CR>
そして、私たちの背中の動きについて:
function! SelectToBeginning()
normal m> "Set end point to current position (since we are moving backwards)
normal ( "Move to beginning of sentence (relies on mapping from earlier)
normal m< "Set start point
normal gv "Activate visual mode based on our new marks
endfunction
omap ( :call SelectToBeginning()
これによりd)
、文の最後まで削除することができます(元の文を次の文の最初まで削除するのではなく)。他のすべてのオペレーターも同様に機能するはずです。
<esc>
ですか?必要なのは1つだけです。