コマンドラインで記録を停止するにはどうすればよいですか?


18

でマクロを記録してq完了したら、次のように入力できます。

  • q 通常モードまたは視覚モードの場合に記録を停止します。
  • <c-o>q 挿入モードの場合に記録を停止します。
  • ..

    マクロがコマンドモードで終了した場合、記録を停止するにはどうすればよいですか?


これのユースケースは何ですか?私は本当に興味があります:)
PhilippFrank

2
@PhilippFrank頻繁に検索し、テキストのさまざまなブロックで同じパターンを異なるパターンに置き換えます。このようなマクロを使用すると、ブロックの選択、実際の検索パターンの作成、および置換チェーンの入力に適した位置へのカーソルの配置を自動的に行うことができます。プレイすると、ブロックが選択され、コマンドモードになり、入力し:'<,'>s/toBeReplaced//gてからカーソルを2つの間に置き、入力//するだけでnewString<cr>完了です。:)
iago-lito

つまり、パラメータを持つマクロのようなものです。とてもいいアイデアです、ありがとう!
PhilippFrank

ええ、@ PhilippFrankのようなものです。私はあなたがそれを好きうれしい。:)
iago-lito

回答:


11

別の解決策は、コマンドラインモードのときにを使用しCtrl-f、を押しqて記録を停止することです。

Ctrl-fコマンドラインウィンドウを開くことができます。このウィンドウでは、通常モードでコマンドを編集できます。コマンドを検証するには、単にEnterを使用します。


したがって、次のようなものを追加した後:

cnoremap <c-q> <c-f>i<c-o>q

で、コマンドモードでマクロの記録を停止.vimrcするために使用でき<c-q>ます。


フロレント


^Fマクロの最後から<Cf>文字()を削除する必要がありますか?少なくともそれは私が見るものです。
ヴァンレーザー

もうすぐ!本当に便利です(コマンドラインウィンドウについては知りませんでしたが、素晴らしいです)。挿入モードからこのウィンドウに入ると、選択した領域が失われるようです。コマンドラインウィンドウから起動したコマンドを選択した領域で機能させる方法はありますか?
iago-lito

@VanLaserいいえ、コマンドラインウィンドウにコマンドを入力することができます。マクロは次のようqqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>qになるため、コマンド部分を入力している間、記録は実際に停止します。マクロを使用するには:@qFINISHYOURCOMMAND<cr>完了です:編集する必要はありません。残念ながら、これは視覚モードでは機能しないようです(または選択が失われます)。
iago-lito

ああ、右:)ところで、私がやる、その後、視覚的な範囲を選択することができ@q、範囲は、コマンド開始時に添加し、'<,'>長期の使用を開始するマクロとしてとして- :....
VanLaser

@ lago-lito実際には、選択範囲が表示されなくても'<,'>、コマンドの検証時に指定範囲(つまり)が選択範囲と一致するように見えます。
fflorent

17

それを行う1つの方法:

  • 通常通りにマクロを開始します(例qq...他の文字)
  • cmdline-modeに到達したら、必要なすべての文字を書きます
  • ここでマクロを終了します。マクロを終了するにはESC、ヒットしてcmdline-mode qを終了します。
  • レジスタESCから削除q(*):バッファに貼り付け、^[文字を削除し、(文字ごとに)全体を再度選択し、ヤンクしてregisterに戻しますq
  • それだけです:マクロを実行します:@q

基本的に、マクロはレジスタに格納されるため、少し「後処理」します。

(*)registerに保存されているマクロから最後の文字を削除する簡単な方法qは次のとおりです。

:let @q = @q[:-2]

ハハ!これはこれまでのところ実際に私のハックでした= D。そうするための「標準的な」方法はありませんか?(同様に高速
iago-lito

私はそれを知りませんが、マクロをあまり使いません(代わりに小さな関数を書くことを好みます)。後でマクロを見ると、マクロは私にとって不可解に感じます。
ヴァンレーザー

@VanLaser:ライン:let @q = @q[:-2]についてもう少し詳しく教えてください。特にどのように機能し[:-2]ますか?:-)
スタトックス

これは「スライス」であり、リストと文字列で動作します(これが@q上記のアクセス/設定方法です)。ここに
-VanLaser

@VanLaser彼らは本当に不可解に見えます。ただし、非常に特定の場合に必要な、洗練された小さなことを繰り返す場合には便利です。その場でマクロを作成し、専用の関数を記述およびデバッグする必要なく、それらに対処できることは、まさに素晴らしいことです。^ ^
iago-lito

3

ユースケースに関するコメントを読んだところ、マクロの代わりにキーマッピングを使用できるようです。

.vimrcに次の行があります(どこで見つけたか覚えていません)。

nnoremap <Leader>s :%s/\<<C-r><C-w>\>//g<Left><Left>

説明したユースケースと同様の効果があり、コマンドラインに入力するので、必要なのは置換を入力してEnterを押すだけですが、この場合、カーソルの下にある単語のすべての出現を置換します。

現在のブロック内で置き換えるには、次のように動作するはずです。

nnoremap <Leader>s m'va{<ESC>``:'<,'>s/\<<C-r><C-w>\>//g<Left><Left>

もちろん、必要なキーにマップできます。

上記の機能:名前のないマーカーを使用して現在の位置をマークし、現在のブロックを視覚的に選択し、視覚モードを終了して保存位置にカーソルを戻し(視覚選択マーカーは設定されたまま)、コマンドモードに入り、代替コマンドを入力します、カーソルの下にある単語をで挿入し、カーソルを<C-r><C-w>置いて置換を入力します。


ええ、私もこれを持っています。ただし、特定のユースケースでは、toBeReplacedパターンは「カーソルの下の単語」ほど単純ではないため、外出先で作成できる小さな特定のマクロが必要です。そして再び:地図に具体的すぎる:\とにかくありがとう:)
iago-lito

2
おそらく、パターンをレジスターに入れてから、上記のマッピングを適応させて、レジスターの内容を自動的にtoBeReplacedパーツとして取得します(より限定的なカーソルの下の現在の単語の代わりに)。
ヴァンレーザー

1
@VanLaser正しい、それは一般的なマッピングを可能にし、それをはるかに簡単にします:va{:s/<C-r>0//g<Left><Left>これにより、事前に必要なパターンをヤンクし、マップされたキーを押すだけでそのパターンを現在のものに置き換えることができますブロック。
ダキミアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.