数字のプレフィックスが付いたホットキーで何度も機能を実行することは可能ですか?


7

exコマンドを実行する前に数値の接頭辞を入力した場合、それが適用される規則は、行範囲全体で操作を準備するようにコマンドを設定することです。ドキュメントで説明されています

行数

変更する行数がわかっている場合は、番号を入力してから「:」を入力できます。たとえば、「5:」と入力すると、次のようになります。

    :.,.+4

これで、使用するコマンドを入力できます。範囲「。」を使用します。(現在の行) "。+ 4"(4行下)まで。したがって、5行にまたがっています。

今私が扱っているのは私のカスタム関数です、これはこれです:

function! MyAmazingEnhancedDot()
    if v:hlsearch == 1
        :normal! .n
    else
        :normal! .j
    endif
endfun

これは、一連の行または一連の検索一致に対して操作を繰り返すことを含む、反復的なタスクを合理化する方法にすぎません。

この機能はホットキーにバインドされています。以下のようなAlt+ .または何でも。

私の目的は、非常に強力な何かをできるようにすることです:私は入力することができるはず/varName<CR>ciwnew-var<ESC>n9<Alt+.>の10個のインスタンス名の変更を達成するためvarNameにしますnew-var

これを行うと実際に何が起こるかというと、名前の変更が行われず、9行が.列0の-saved編集操作で操作されているということです。

私はVimが私のキーストロークを次のように解釈しているとしか想定できません:.,.+8 normal! .n

ガラスの半分いっぱいの側で:normal! .jは、バインドのケースが実際に機能しjます。これは、影響のないモーションはこの状況では影響がないためです。(私はまだjそれが数字の接頭辞のないインタラクティブなユースケースで動作させるために必要です)。

それで私の質問は、Vimがバインドに適用する行拡張動作をどのようにオーバーライドできるかということです。数値接頭辞を引数またはそのようなものとして読み取ることができれば素晴らしいと思います。

回答:


6

デフォルトでは、vimはすべての関数をデフォルトのexコマンドであるかのように扱います。つまり、接頭辞付きの番号はすべてとして使用され{range}ます。これを変更するには、カウントを使用するように関数とマップを変更する必要があります。

カウント付きマップ

マップは数えることができ、およびを介して利用可能にv:countなりv:count1ます。カウントが指定されていない場合、1つ目は0を含み、2つ目はデフォルトとして1を含みます。関数へのマップを作成できます。

nnoremap <M-.> :<C-u>call MyAmazingEnhancedDot(v:count1)<cr>

詳しくは :h v:count

カウント付きコマンド

コマンドには、プレフィックスとしてa {range}またはaのオプションを指定できcountます。コマンドを作成するとき、フラグ-countは範囲オプションを無効にし、<count>変数をデフォルトで0に設定します-count=N。オプションで、デフォルト値を指定できます。プレフィックス値はcount、関数の変数を介して利用できます。

countを使用するコマンドは次のようになります。

:command -count=1 EDot call MyAmazingEnhancedDot(<count>)

これで9EDot、関数を呼び出す9と、範囲ではなくカウントで呼び出されます。

詳細については参照してください :h command-count

両方の例

これがあなたのコードです:

function MyAmazingEnhancedDot(count)
  let c = a:count
  while c > 0
    if v:hlsearch == 1
      :normal! .n
    else
      :normal! .j
    endif
    let c -= 1
  endwhile
endfunction

command -count=1 EDot call MyAmazingEnhancedDot(<count>)

nnoremap <M-.> :<C-u>exe v:count1 . "EDot"<CR>

今、あなたはあなたの例を行うことができます

/varName<CR>ciwvar-name<esc>n9<M-.>

1
涼しい。今、私の問題を解決するにはあまりにも多くの方法があるようです!あなたがそれらを使用する方法を説明するためにあなたが与えた例で両方のメカニズムを組み合わせたと私は理解しています。しかし、それを使用nnoremap <M-.> :<C-u>call MyAmazingEnhancedDot(v:count1)<cr>してスキップするだけでは十分ではないのcommand -count=1 EDot call MyAmazingEnhancedDot(<count>)でしょうか?
Steven Lu

コマンドオプションをスキップしても問題ありません。コマンドオプションから得られる唯一の利点は、などのexコマンドから呼び出すことができること:9EDotです。exコマンドをあまり使用しない場合は、スキップしてください。
jecxjo 2015年

驚くばかり。これで完璧な答えが完成しました!
Steven Lu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.