動きのあるマッピング


12

マッピング内の後続のモーションで演算子を使用する方法を理解しようとしています。例えば:

nmap /c c{here we pending for a motion}/<C-r>"<CR>

マップは次のことを行う必要があります。

  1. cオペレーターをアクティブにして、次の動きを聞きます。
  2. たとえば、t,次のコンマの前にすべてを変更するためにここに入力できます。
  3. カーソルとコンマの間のすべてを削除する挿入モードに移動します。
  4. 削除されたテキストはパターンとして自動的に検索されます

簡単に言うと、モーションテキストが削除された後、削除されたテキストが強調表示された挿入モードのままになります。誰かがこの事件を解決するのを手伝ってくれたらとても感謝しています。

更新

答えはほとんど私が欲しいものです。だが!を押す/cwと、単語の代わりに何かを入力し、を押し<Esc>ます。次の出来事でも同じことをするつもりだ。ただし、presing n(次のオカレンスに移動)および.(最後のコマンドを繰り返す)の後、最後に入力したテキストを置き換えるのではなく、先頭に追加します。マッピングの主な目標は、とそれを使用しているn/N.繰り返しに。私は何かを見逃しましたか?

回答:


9

vimはoperator-mappingをサポートしています :h map-operator

必要なのはoperatorfunc、およびマッピングです。必要に応じて、次のコードが機能します。まあそれは単なる例であり、さらに洗練されます。

nmap  <silent> /c :set opfunc=SpecialChange<CR>g@
function! SpecialChange(type)
    silent exec 'normal! `[v`]d'    
    silent exec 'let @/=@"' 
    startinsert
endfunction

exec 'let @/=@"'バッファ内のコードを強調するためだけに注意してください 。ハイライトをすぐに見たくない場合は、let @/=@"


質問を更新しました。あなたの答えは私のニーズに最も近いように見えますが、次の場合と同じではないので、その瞬間を質問で説明しました。
ティムールファイズラフマノフ

2つの演算子(/ci)があり、vim .は最後の演算子を繰り返します。拡張する場合は、repeatプラグインを確認してください。@TimurFayzrakhmanovもあり:g:sコマンドもあります。
ケント

"あなたのコードに奇妙なことはあります'let @/=@""'か?たとえばsilent exec 'normal! [v ]c'c演算子は期待どおりに動作するため、変更されたテキストを検索パターンに追加しないためです。
ティムールファイズラフマノフ

1
@TimurFayzrakhmanovは"" タイプミスでした..修正..私も思いつきましたcが、モードの変更があるため、スペースを追加しましたn-i-n-i...表示されるテストを実行してください。
ケント

@TimurFayzrakhmanovあなたは変更することにより、任意のプラグインなしでそれを再現可能にすることができdまでystartinsertするcall feedkeys("cgn", 'n')(下記の私の答えを参照)
ジェロームDalbert

4

関数を使用すると、複雑なマッピングを簡単に実装(および文書化)できます。

function! DoMagic()
   execute "normal! d".input("enter motion: ")
   let @/=@"
   startinsert
endfunction

次に、マッピングでその関数を呼び出します。

nmap /c :call DoMagic()<CR>

編集:

多数の場所で検索と置換を実行する場合は、代替コマンドを試してください:s。視覚的な選択を検索パターンにコピーするようにマッピングを変更できます。

function! DoMagic2()
   normal! gv"ay
   return @a
endfunction

vmap /c :<c-w>%s/<C-r>=DoMagic2()<CR>//gc<left><left><left>

1
これは「素敵な」UIでもあり、OPのニーズに対応し、入力した内容に応じて、予想よりも「多く」なる可能性があります。例えばenter motion:、彼が見たとき、彼は与えました:t,ggVGJZZ ^ _ ^それはコマンドの連結のための一般的な問題です
ケント

それはほとんど私が欲しいものです。例:を押して/cwから、単語の代わりに何かを入力し、を押し<Esc>ます。次の出来事でも同じことをしたい。ただし、presing n(次のオカレンスに移動)および.(最後のコマンドを繰り返す)の後、最後に入力したテキストを置き換えるのではなく、先頭に追加します。マッピングの主な目標は、とそれを使用しているn/N.繰り返しに。私は何かを見逃しましたか?
ティムールファイズラフマノフ

1
この関数は、複雑なマッピングに問題がある場合に関数を使用するという考え方を明確にするためのものです。ニーズに合わせて変更する必要があります。ケントのアドバイスに従って.、コマンドを繰り返してみてください。
mMontu

答えてくれてありがとう。これも便利ですが、@ Kentの入力を受け入れます。入力した直後に(<CR>から保留にならずにinput())動作するからです。
ティムールファイズラフマノフ

1
@TimurFayzrakhmanov更新で説明されているように、代替を試すこともできます。
mMontu

1

このソリューションは、「最後のコマンドを繰り返す」(別名.)で機能します。

nmap <silent> /c :set opfunc=ChangeOccurence<CR>g@

function! ChangeOccurence(type)
  exec 'normal! `[v`]y'
  let @/ = @"
  call feedkeys('cgn', 'n')
endfunction

繰り返し使用する場合n、を使用する必要はありません.。より速くしたい場合は、を使用して次の出現箇所を直接取得して置き換えることができます。

あなたが一致する単語のハイライトを持っているような場合は、必要に応じて、あなたは置き換えることができます'cgn'によって'n``cgn'

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