GNU/Linux >> Linux の 問題 >  >> Linux

再帰的なVimマクロ:反復的なタスクを自動化するためのさらに一歩

Ricardo Gerardiによる最近の記事「Vimマクロを使用して頻繁なタスクを自動化する」では、マクロとは何か、およびマクロを使用して反復タスクを自動化することの利点について説明しました。この記事では、さらに一歩進んで、再帰マクロが役立つ可能性のあるいくつかの例と、遭遇する可能性のあるいくつかの落とし穴について説明します。

基本的なマクロワークフローは、記録、再生、および利益で構成されます。録音するときは、どのレジスタに録音するかを選択します。 aからのレジスタがあります zへ 利用可能です。

[次のこともお勧めします:Ansibleを使用してVimを設定する方法]

Vimを開いたら、マクロを記録するには、まずqを押します。 保存するレジスタを指定します。次に、実行する一連のコマンドを入力し、q 記録を終了して保存します。その後、 @を押してマクロを再生します とレジスター。

たとえば、qaA - suffixESCjqのようなマクロを記録します 、次に@aを押して再生します 何回必要か。マクロを簡単に再生できるようにするには、マクロを1回実行した後、@@と入力します。 再生します。

マクロの仕組みの詳細

マクロをもう少し掘り下げて、その内部のいくつかを調べてください。コマンドの1つを実行できない場合、マクロは実行を停止します。たとえば、fの場合 (つまり、 を見つける>( その上にカーソルを置きます )を実行できない場合、マクロの再生はすぐに停止します。これは問題だと思われるかもしれませんが、これは実際には機能であり、有利に使用できます。

マクロを記録するときは、一連のコマンドが入力されます。つまり、実行マクロコマンド( @ )を含む任意のコマンドを使用できます。 )。これが再帰マクロの本質であり、実行時に自分自身を呼び出します。

この時点で、いくつかの再帰マクロの記録と再生を開始できます。ただし、その前に、もう1つ見てから、すぐに始めてください。マクロを記録する場合、入力されたコマンドは記録が進むにつれて実行されます。したがって、記録の一部としてマクロを再生し、関連するレジスタにすでに記録されているものがある場合、マクロは実行され、予期しない結果が生じる可能性があります。

最初のヒントは次のとおりです。再帰マクロを記録する前に、レジスタが空であることを確認してください。 qを実行してレジスタをクリアします <登録> q 、これは で録音を開始するのと同じです 、何も実行せず、録音を終了します。

以上で、再帰マクロを使用して余分な編集時間を節約できるシナリオを検討するときがやっとです。

再帰マクロの記録と再生

まず、前の記事で解決した問題を取り上げましょう。架空の監視システムによって生成された次のCSVファイルを/etc/hostsに変換します。 フォーマットファイル。

$ cat hosts.csv
Description,Hostname,IPAddress,FQDN
"OCP Master Node 1",ocpmaster01,192.168.0.20,ocpmaster01.home.ca
"OCP Master Node 2",ocpmaster02,192.168.0.21,ocpmaster02.home.ca
"OCP Master Node 3",ocpmaster03,192.168.0.22,ocpmaster03.home.ca
"OCP Worker Node 1",ocpnode01,192.168.0.30,ocpnode01.home.ca
"OCP Worker Node 2",ocpnode02,192.168.0.31,ocpnode02.home.ca
"OCP Worker Node 3",ocpnode03,192.168.0.32,ocpnode03.home.ca
"Ansible Host 1",ansibleh01,192.168.0.144,ansibleh01.home.ca
"Ansible Host 2",ansibleh02,192.168.0.145,ansibleh02.home.ca

期待される出力は次のとおりです。

192.168.0.20    ocpmaster01.home.ca    ocpmaster01    #OCP Master Node 1
192.168.0.21    ocpmaster02.home.ca    ocpmaster02    #OCP Master Node 2
192.168.0.22    ocpmaster03.home.ca    ocpmaster03    #OCP Master Node 3
192.168.0.30    ocpnode01.home.ca    ocpnode01    #OCP Worker Node 1
192.168.0.31    ocpnode02.home.ca    ocpnode02    #OCP Worker Node 2
192.168.0.32    ocpnode03.home.ca    ocpnode03    #OCP Worker Node 3
192.168.0.144    ansibleh01.home.ca    ansibleh01    #Ansible Host 1
192.168.0.145    ansibleh02.home.ca    ansibleh02    #Ansible Host 2

ファイル形式の変換を支援するために記録されたマクロは次のとおりです。

0r#f"xldf,A,<ESC>p0df,$px:s/,/\t/g<ENTER>j

Vimを開いたばかりで、上記のマクロがまだ記録されていない場合は、レジスタにマクロの内容を入力するためのオプションがいくつかあります。

1)マクロを記録し、すべてのコマンドを入力します

qを押すことから始めます 次に、<登録> 、上記のすべてのコマンドを入力し、qを押して終了します 。

2)レジスタを設定します

次のコマンド:letを使用してレジスタを設定できます @ ='' 後でマクロ再生として使用します。この場合、マクロにはEscのような特別なキーがあるため、そのコマンドを直接実行することはできません。 およびEnter 。これを回避するには、:executeを使用します 指図。特別なキーをエスケープシーケンスとして入力できます。通常モードでは、:と入力します 次の行を貼り付けて、Enterを押します。 :

execute "let @h='0r#f\"xldf,A,\<Esc>p0df,$px:s/,/\\t/g\<Enter>j'"

レジスタがhであることを確認してください 内容はきちんと設定されていました。これは、:regを実行することで実行できます。 <登録> または reg h この場合:

:reg h
--- Registers ---
"h   0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj

レジスタの内容は、:executeで設定されたものとは少し異なります。 指図。これは、:executeが原因です。 変換された\ および\ キーコードに^[ および^M それぞれ。これらは、Vimが実際にキーを「押す」ために内部的に使用するものです。

この時点で、レジスタh 頻繁なタスクを自動化するためのVimマクロの使用に関する記事に記録されているものとまったく同じマクロが含まれています。次のステップは、再帰的にすることです。このようにして、一度トリガーすると、ファイルの最後に到達するまで再帰的に繰り返されます。

すでに記録されているマクロを編集して再帰的にするためのちょっとしたコツがあります。また、マクロ全体を記録せずに、不足しているコマンドを追加したり、変更を加えたりするためにも使用できます。

:let @h='から始めます 、次にCtrl-r Ctrl-r h 、「@h'」と入力します 最後に、最後にEnterを押します 。 Ctrl-r Ctrl-r <登録> 文字通りレジスタの内容を挿入します。これは、:reg hを検査するときに表示されるコンテンツと同じです。 。

すべてが揃っているかどうかを確認するには、:regを実行します <登録> 内容を確認してください。次のようになります。

:reg h
--- Registers ---
"h   0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj@h

それが整ったら、hosts.csvの2行目に移動します マクロを再生します@ または@h この例では。ファイルの最後まで続き、すべての行が更新されます。マクロに0があったために可能でした 最初にj 再帰的に自分自身を再生する前に。これにより、1行下に移動し、マクロを再実行すると、カーソルが行の先頭に配置されました。

また、jでマクロを停止できなくなるため、マクロがファイルの最後まで移動して停止したことを確認してください。 これが再帰実行の中断条件でした。

[システム自動化についてもっと知りたいですか? RedHatの無料の本であるTheAutomatedEnterpriseを始めましょう。 ]

まとめ

これは長い道のりでしたが、繰り返しのタスクがマクロを何度も繰り返している場合でも、繰り返しのタスクを自動化するのに役立つ別のツールを利用できるようになりました。

また、マクロの編集についても検討したので、この時点で、マクロを最初から記録することに慣れているかもしれません。マクロを編集する代わりに記録する場合は、開始する前に必ずターゲットレジスタを空にして、 @ を設定してください。 最後のコマンドとして。また、マクロのブレークポイントについても考えてください。ファイルの最後まで編集している場合は、jを使用します します。

再帰マクロのもう1つの利点は、問題が発生した場合に、1つの元に戻るを使用して元に戻すことができることです。 。


Linux
  1. 大きなディレクトリツリーを指定されたサイズのチャンクに分割しますか?

  2. 特定のファイルを1つのファイルに連結しますか?

  3. Vim:複数のファイルを異なるタブで開く方法は?

  1. Vimマクロを使用して頻繁なタスクを自動化する

  2. Vi および Vim マクロ チュートリアル:記録と再生の方法

  3. 2 つの ar 静的ライブラリを 1 つにマージする方法は?

  1. Json配列からBash配列に1つのフィールドを解析しますか?

  2. OSに基づいてBashコマンドを実行するために1つのVimコマンドをマップする方法は?

  3. MultiCD –複数の起動可能なISOを1枚のCDに結合するシェルスクリプト