文の最後の文字に移動するにはどうすればよいですか?


9

通常モードで()、それぞれの文の前のまたは次の最初の文字に移動します。最後のキャラクターに移動するにはどうすればよいですか。

すべての文がピリオド)T.(次の文の最初の文字、最初のピリオドに戻る)で終わる場合、マクロで使用するより堅牢なソリューションが必要です。

私はビジュアルモードで動作していることを知ってasおりis、動作しますvis<ESC>(ビジュアルモード、文の内部を選択して、ビジュアルモードを終了します)。

私は途方に暮れています。助けて!


なぜ2つ<esc>ですか?必要なのは1つだけです。
ドアノブ2015

おっと、vimの応答が遅れたので混乱していた。質問を編集します。
bsmith89 2015

1
提案しかできない)gE。あなたはいつも文章をピリオドで終わらせると言っていましたが、それを仮定する必要さえない方がいいです。
superjer 2015

また、ビジュアルモードでのみ機能するわけではasありisません。das文章を削除する通常モードで行うことができます。
superjer 2015

回答:


10

これに関する私の研究から、少なくとも2つのカスタムモーションを定義する必要があります。1つ目はカーソルを移動するためのもので、2つ目は演算子で使用するためのものです。フル機能のセットアップのために、それははるかに複雑である、と私は内のコードを見て推薦するCamelCaseMotionによってインゴKarkatショーがかなり多く、私は以下のやるよりも、この権利を行う上で思いました。私の答えのほとんどは、Vimのヘルプと実験で見つかった簡単な情報に基づいています。

次の例では、およびモーションを再マッピングして、文の両端を実行します。例を変更することにより、必要に応じて他の文字を使用できます。(と比較して)より堅牢なオプションの例も紹介します。そうすることで、もしあなたがすでに文の終わりにいるのなら、その方法のために、この文の後の最後に移動するのではなく、最後に留まることになります。別の結果でそれを置き換えることを試みることができます。これは実際には、テキストオブジェクトのいずれかの側をモーションに変換するために機能します。)(vis<ESC>)T.isas

まず、ノーマルモードの動き

これは、ビジュアルモードまたはオペレーター保留モードでは機能しません。

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)、文の最後まで削除することができます(元の文を次の文の最初まで削除するのではなく)。他のすべてのオペレーターも同様に機能するはずです。


4

忍者足

この問題を解決することを目的としたninja-feet.vimというプラグインを作成しました。

モーションオペレーター

これは、カーソルからテキストオブジェクトの一端までのテキストを操作できるいくつかのモーションオペレーター1を定義します。演算子とテキストオブジェクトの間に、[またはそれらを使用する]と、オペレーターはカーソルからテキストオブジェクトの左または右(それぞれ)の境界までのテキストを操作できます。

テキストオブジェクトの最初または最後で挿入モードを開始するための通常モード演算子もあります:z[およびz]

例1:ここから文字列の終わりに変更する

この例で|は、カーソル位置を示します。

foo("This is a string| with superfluous text at the end", bar);

入力d]i"すると、これは次のように変わります。

foo("This is a string", bar);
  1. d:削除演算子を使用する
  2. ]:次のテキストオブジェクトの終わりまで
  3. i":引用文字列テキストオブジェクト

例2:現在の文の後に挿入を開始する

ここでも、|カーソル位置を示します。

Here is |some sentence. And here is another.

入力z]isすると、最初の文の終わりに挿入モードが開始されます。

  1. z]:次のテキストオブジェクトの後に挿入モードを開始します
  2. is:文テキストオブジェクト

注意事項

  • これらのマッピングは、では再現できません.。それはかなりトリッキーであり、私はそれを正しくしようとしています。
  • [そして]オペレータ(オペレータとテキストオブジェクトとの間で使用される)で始まるテキストオブジェクトのための唯一の仕事iまたはa。彼らはだからだ技術的には、本当にためにマッピングし[i]i[a]a。これを改善したいのですが、それも非常にトリッキーです。
  • カーソルをテキストオブジェクトの末尾に移動するだけの通常モードの動作はありません。私はそれを動作させましたが、モーションは実際にはオペレーターであるという.ことを意味します(つまり、モーションを繰り返すことになります)。私はその振る舞いは許容できるとは思いません。

1彼らしている事業者は、あなたがオペレーターと(例えば間の動きタイピングの間にいるモードであるオペレータ待機モードでマッピングされたので、私はmotionyオペレーターそれらを呼び出すdと、w中をdw)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.