記録(記録されたマクロ)を表示および編集するにはどうすればよいですか?


39

私は(私の操作を記録するために複雑な繰り返しを使用していますqq、レコードにいくつかの操作をq停止する)と私は間違いをしました。

記録した内容を確認して、間違いを修正することはできますか?

記録されたキャラクターを@q作品ごとに呼び出しますが、マッピング(:map q- No mapping found)に表示されません。

次のように入力しても、ヘルプにはあまり情報がありません:help recording

回答:


42

注:aこの回答全体でレジスタを使用していると仮定していますが、任意のレジスタを使用できます

注2:<1b>Esc; これをCtrl+vで挿入できますEsc^[display設定に応じて)として表示されることもあります。


マッピングではありません。:map動作しないのは理にかなっています。それはレジスターに記録され、他のレジスターと同様に表示および編集できます。

行うことq「このレジスタをクリアし、それにキーストロークを追加する」ことだけで、実行すること@「レジスタをコマンドとして評価する」だけです。

マクロには「異なる」ものは何もありません。任意のレジスタをマクロとして呼び出すことができます。


するために、表示だけで使用することを:

:echo @a

他のレジスタと同じです。

:registersすべてのレジスタを表示するためにも使用できます。


編集あなたは、いくつかのことを行うことができます。

に割り当てる最も簡単な方法は次の@aとおりです。

:let @a='iasd<1b>'

これによりi、挿入モード()、挿入asd、エスケープが開始され、通常モードに戻ります。

これは、大規模な編集にはあまり役立ちません。関数を使用する(substitute())か、何かを追加する(:let @a=@a . 'more')こともできますが、途中で何かを変更するのは簡単ではありません。

これに最適な方法は、:splitorで新しいバッファを開始し、:tabnewそこにレジスタを挿入して編集し、それからコピーして戻すことです。

"apwhichを使用して、テキストをバッファーに挿入できます(aレジスターはどこにありますか)。

iThis is A<1b>

これで、行を多分変更できます。

iThis is an edited macro<1b>

次に^v$"ay、この行をaレジスタにヤンク(コピー)します。

  • ^ 行頭
  • v ビジュアルモード用
  • $ 行末用
  • "ay 登録する選択をヤンクします a

必要に応じて、ビジュアルモードを使用せずにこれを行うことができます^"ay$

@aこれで、最初に記録したように、を使用できます。

またyy、とを使用することもできますが@"、これは少し高速です。ただし、これは末尾の改行もコピーし、副作用を引き起こす可能性があります...これを高速化する別の方法は、マクロを使用することです:-)


2
Enter記録の最後に押したように、行方向の動きをレジスタにヤンクすると、改行文字が含まれるという副作用があります。多くの場合、これは無害かもしれませんが、記録の最後でカーソル位置を慎重に作成したシナリオでは、再現性に影響を与える可能性があります。
tommcdo

@tommcdo右; v行全体(改行なし)を使用して選択するだけです。
マーティントゥルノイ

@Carpetsmoker v^$"ayこの行をaレジスタにヤンク(コピー)します。」 それ^はの前に来るべきv$はありません、そしてあなたはまだ改行をコピーしていませんか?私はそれがあるべきだと思う。0v$h"ay(はい痛々しいほど長い!)
joeytwiddle

2
@joeytwiddleいいえ、行末に$移動ますが、改行は含まれません。それは違います0y$yyh後に置く$ことは、最後のキャラクターを見逃すことを意味します。
evilsoup

編集できるようにするためにできることの1つは、次のように入力することです:<Ctrl-f>を入力して、該当する行(最後の行、デフォルトでは、最後に入力した行)、通常どおりvimを使用します。行の実行が完了したらReturnキーを押すか、<Ctrl-c>を押して終了します。

9

動作するものを取得するには...

qajjjq

aレジスタへのマクロの記録を開始します。

:regコマンドを使用して、現在のレジスタ(マクロ、ヤンク、削除などに使用)の多くを表示したり、名前を指定して表示するレジスタを指定したりできます。たとえば、registerを表示するにはa

:reg a

利回り

--- Registers ---
"a   jjj

対応する大文字を使用して、既存の名前付きレジスタに追加できます。これはマクロの記録だけでなく、ヤンクにも機能します。例えば:

qAkkkq
:reg a

利回り

--- Registers ---
"a   jjjkkk

let構文を使用して既存のマクロを編集する場合は、次のことができます。

let @a='<C-r>a'

に展開されます

let @a='jjjkkk'

その後、個々のキーストロークを変更できます。

あなたが使用できることに注意してください<C-r>(そのことについて、または挿入モードでの)コマンドラインモードに任意のレジスタからペーストする(つまり、コントロール+ r)を。

さらに、コマンドラインモードの場合、これを入力<C-f>すると、コマンドラインウィンドウがポップアップ表示され、発行された過去のコマンドを表示/編集できます。また、呼び出す前に現在のコマンドを編集できます。送信するコマンドでEnterキーを押します。

この利点は、このバッファ内で通常の移動/置換コマンドを使用してマクロを編集できることです。例えば:

let @a='<C-r>a'<C-f>

表示されます:

:118 reg
:119 reg a
:120 let @a='jjjkkk'

コマンド120を使用している場合は、次のことができます。

s/kkk/}
<return>
:reg a

利回り

--- Registers ---
"a   jjj}

もちろん、レジスタの内容をバッファに貼り付けて、そこで変更することもできます。ただし、作業バッファーを汚染することなく、必要なすべてを実行できます。

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