GNU/Linux >> Belajar Linux >  >> Linux

Makro Vim Rekursif:Satu langkah lebih jauh untuk mengotomatisasi tugas yang berulang

Artikel terbaru Menggunakan makro Vim untuk mengotomatiskan tugas yang sering dilakukan oleh Ricardo Gerardi menjelajahi apa itu makro dan manfaat menggunakan makro untuk mengotomatiskan tugas yang berulang. Dalam artikel ini, Anda akan melangkah lebih jauh dan menjelajahi makro rekursif apa yang merupakan beberapa contoh di mana mereka mungkin berguna, dan beberapa jebakan yang mungkin Anda temui.

Alur kerja makro dasar terdiri dari record, replay, dan profit. Saat merekam, pilih di register mana ia akan melakukannya. Ada register dari a ke z tersedia.

[ Anda mungkin juga menyukai: Cara menggunakan Ansible untuk mengonfigurasi Vim ]

Setelah Anda membuka Vim, untuk merekam makro, mulailah dengan menekan q dan tentukan register untuk menyimpannya. Kemudian ketik urutan perintah yang akan dieksekusi dan q untuk mengakhiri dan menyimpan rekaman. Setelah itu, putar ulang makro dengan menekan @ dan daftar.

Misalnya, rekam makro seperti qaA - suffixESCjq , lalu putar ulang dengan menekan @a berapa kali diperlukan. Untuk mempermudah memutar ulang makro, setelah menjalankannya sekali, ketik @@ untuk memutar ulang.

Selengkapnya tentang cara kerja makro

Menggali makro sedikit lebih banyak dan menjelajahi beberapa internalnya. Makro akan berhenti berjalan jika tidak dapat menjalankan salah satu perintahnya. Misalnya, jika f ( (yang berarti temukan ( dan posisikan kursor di atasnya ) tidak dapat dijalankan, maka pemutaran ulang makro akan segera dihentikan. Anda mungkin menganggap ini masalah, tetapi sebenarnya ini adalah fitur, dan Anda dapat menggunakannya sesuai keinginan Anda.

Saat merekam makro, urutan perintah dimasukkan. Itu berarti Anda dapat menggunakan perintah apa pun, termasuk mengeksekusi makro (@ ). Ini adalah inti dari makro rekursif, memanggil dirinya sendiri saat dijalankan.

Pada titik ini, Anda bisa mulai merekam dan memutar ulang beberapa makro rekursif. Namun sebelum Anda melakukannya, lihat satu hal lagi sebelum terjun langsung ke dalamnya. Saat merekam makro, perintah yang diketik akan dieksekusi saat perekaman berjalan. Jadi, jika Anda memutar ulang makro sebagai bagian dari rekaman dan register terkait memiliki sesuatu yang sudah direkam, itu akan berjalan dan mungkin akan membawa hasil yang tidak diharapkan.

Inilah tip pertama:Pastikan register kosong sebelum merekam makro rekursif. Hapus register dengan menjalankan q q , yang sama dengan memulai perekaman di , tidak menjalankan apa pun, dan mengakhiri perekaman.

Dengan semua itu, akhirnya tiba saatnya untuk menjelajahi beberapa skenario di mana makro rekursif akan menghemat waktu pengeditan tambahan.

Merekam dan memutar ulang makro rekursif

Untuk memulainya, mari kita selesaikan masalah di artikel sebelumnya:Ubah file CSV berikut yang dihasilkan oleh sistem pemantauan hipotetis menjadi /etc/hosts format file.

$ 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 

Inilah hasil yang diharapkan:

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

Makro yang direkam untuk membantu mengonversi format file adalah sebagai berikut:

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

Dengan asumsi bahwa Anda baru saja membuka Vim dan makro di atas belum direkam, Anda memiliki beberapa opsi untuk mengisi register apa pun dengan konten makro:

1) Rekam makro dan ketik semua perintah

Mulailah dengan menekan q lalu , ketik semua perintah di atas dan akhiri dengan menekan q .

2) Atur register

Anda dapat mengatur register menggunakan perintah berikut :let @='' dan kemudian digunakan sebagai replay makro. Dalam hal ini, Anda tidak dapat menjalankan perintah itu secara langsung karena makro memiliki beberapa kunci khusus seperti Esc dan Enter . Untuk mengatasinya, gunakan :execute memerintah. Hal ini memungkinkan memasukkan kunci khusus sebagai urutan melarikan diri. Dalam mode normal, ketik : lalu paste baris berikut dan tekan Enter :

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

Pastikan register h isinya diatur dengan benar. Itu dapat dilakukan dengan menjalankan :reg atau : reg h dalam hal ini:

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

Isi register sedikit berbeda dari apa yang ditetapkan oleh :execute memerintah. Ini karena :execute dikonversi \ dan \ ke kode kunci mereka ^[ dan ^M masing-masing. Itulah yang digunakan Vim secara internal untuk benar-benar "menekan" tombol.

Pada titik ini, register h berisi makro yang sama persis yang direkam pada artikel Gunakan makro Vim untuk mengotomatisasi tugas yang sering. Langkah selanjutnya adalah membuatnya rekursif. Dengan cara ini, Anda dapat memicunya sekali, dan itu berulang secara rekursif hingga mencapai akhir file.

Ada sedikit trik untuk mengedit makro yang sudah direkam dan membuatnya rekursif. Anda juga dapat menggunakannya untuk menambahkan perintah yang hilang dan membuat perubahan tanpa merekam keseluruhan makro.

Mulai dengan :let @h=' , lalu Ctrl-r Ctrl-r h , ketik @h' di akhir, dan terakhir tekan Enter . Ctrl-r Ctrl-r secara harfiah menyisipkan isi register. Ini adalah konten yang sama yang ditampilkan saat memeriksa :reg h .

Untuk memeriksa apakah Anda memiliki semuanya, jalankan :reg dan periksa isinya. Seharusnya terlihat seperti berikut:

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

Setelah itu, buka baris kedua di hosts.csv dan putar ulang makro @ atau @h dalam contoh ini. Ini akan berlanjut hingga akhir file memperbarui semua baris. Itu mungkin karena makro memiliki 0 di awal dan j sebelum memutar ulang dirinya sendiri secara rekursif. Itu membuatnya turun satu baris, dan saat menjalankan ulang makro, kursor ditempatkan di awal baris.

Perhatikan juga bahwa makro berjalan hingga akhir file dan berhenti karena tidak dapat turun lagi dengan j itu adalah kondisi istirahat kami untuk eksekusi rekursif.

[ Mencari lebih banyak tentang otomatisasi sistem? Mulailah dengan The Automated Enterprise, buku gratis dari Red Hat. ] 

Menutup

Ini adalah perjalanan yang panjang, tetapi sekarang Anda memiliki alat lain yang tersedia untuk membantu mengotomatiskan tugas yang berulang, bahkan jika tugas yang berulang itu mengulang makro berulang kali.

Anda juga menjelajahi pengeditan makro, jadi pada titik ini, Anda mungkin terbiasa merekamnya dari awal. Jika Anda merekam alih-alih mengedit makro, pastikan untuk mengosongkan register target sebelum memulai dan memiliki @ sebagai perintah terakhir Anda. Juga, pikirkan tentang breakpoint untuk makro Anda. Jika Anda mengedit hingga akhir file, gunakan j akan melakukannya.

Manfaat lain dari makro rekursif adalah jika terjadi kesalahan, dapat dibalik dengan menggunakan undo tunggal. .


Linux
  1. Parsing Satu Bidang Dari Json Array Ke Bash Array?

  2. Menggabungkan File Tertentu Menjadi Satu File Tunggal?

  3. Bagaimana Memetakan Satu Perintah Vim Untuk Menjalankan Perintah Bash Berdasarkan Os?

  1. MultiCD – Skrip Shell untuk Menggabungkan Beberapa ISO yang Dapat Di-boot menjadi Satu CD

  2. Gabungkan / ubah beberapa file PDF menjadi satu PDF

  3. Bagaimana cara menggabungkan dua perpustakaan statis menjadi satu?

  1. Bagaimana cara membagi satu file teks menjadi beberapa file *.txt?

  2. Cat rekursif semua file menjadi satu file

  3. Gabungkan beberapa perintah unix menjadi satu output