私は(私の操作を記録するために複雑な繰り返しを使用していますqq、レコードにいくつかの操作を、q停止する)と私は間違いをしました。
記録した内容を確認して、間違いを修正することはできますか?
記録されたキャラクターを@q作品ごとに呼び出しますが、マッピング(:map q- No mapping found
)に表示されません。
次のように入力しても、ヘルプにはあまり情報がありません:help recording
。
私は(私の操作を記録するために複雑な繰り返しを使用していますqq、レコードにいくつかの操作を、q停止する)と私は間違いをしました。
記録した内容を確認して、間違いを修正することはできますか?
記録されたキャラクターを@q作品ごとに呼び出しますが、マッピング(:map q- No mapping found
)に表示されません。
次のように入力しても、ヘルプにはあまり情報がありません:help recording
。
回答:
注: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'
)こともできますが、途中で何かを変更するのは簡単ではありません。
これに最適な方法は、:split
orで新しいバッファを開始し、:tabnew
そこにレジスタを挿入して編集し、それからコピーして戻すことです。
"apwhichを使用して、テキストをバッファーに挿入できます(a
レジスターはどこにありますか)。
iThis is A<1b>
これで、行を多分変更できます。
iThis is an edited macro<1b>
次に^v$"ay、この行をa
レジスタにヤンク(コピー)します。
a
必要に応じて、ビジュアルモードを使用せずにこれを行うことができます^"ay$。
@aこれで、最初に記録したように、を使用できます。
またyy、とを使用することもできますが@"、これは少し高速です。ただし、これは末尾の改行もコピーし、副作用を引き起こす可能性があります...これを高速化する別の方法は、マクロを使用することです:-)
v
行全体(改行なし)を使用して選択するだけです。
v^$"ay
この行をa
レジスタにヤンク(コピー)します。」 それ^
はの前に来るべきv
で$
はありません、そしてあなたはまだ改行をコピーしていませんか?私はそれがあるべきだと思う。0v$h"ay
(はい痛々しいほど長い!)
$
移動しますが、改行は含まれません。それは違います0y$
とyy
。h
後に置く$
ことは、最後のキャラクターを見逃すことを意味します。
動作するものを取得するには...
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}
もちろん、レジスタの内容をバッファに貼り付けて、そこで変更することもできます。ただし、作業バッファーを汚染することなく、必要なすべてを実行できます。
Enter
記録の最後に押したように、行方向の動きをレジスタにヤンクすると、改行文字が含まれるという副作用があります。多くの場合、これは無害かもしれませんが、記録の最後でカーソル位置を慎重に作成したシナリオでは、再現性に影響を与える可能性があります。