Nedávný článek Používejte makra Vim k automatizaci častých úloh od Ricarda Gerardiho zkoumal, co je makro a výhody použití maker k automatizaci opakujících se úloh. V tomto článku uděláte krok dále a prozkoumáte, jaká rekurzivní makra jsou příklady, kde by mohla být užitečná, a některá úskalí, se kterými se můžete setkat.
Základní pracovní postup maker se skládá ze záznamu, přehrávání a zisku. Při nahrávání vyberte, v jakém registru to provede. Existují registry z a
do z
k dispozici.
[ Také by se vám mohlo líbit: Jak používat Ansible ke konfiguraci Vim ]
Jakmile otevřete Vim a chcete nahrát makro, začněte stisknutím q
a zadejte registr, do kterého se má uložit. Poté zadejte sekvenci příkazů, které se mají provést, a q
pro ukončení a uložení záznamu. Poté makro znovu přehrajte stisknutím @ a rejstříku.
Zaznamenejte například makro jako qaA - suffixESCjq
a poté jej znovu přehrajte stisknutím @a
kolikrát je potřeba. Pro snazší přehrání makra po jeho prvním spuštění napište @@
pro přehrání.
Další informace o tom, jak funguje makro
Ponořte se trochu více do maker a prozkoumejte některé jeho vnitřnosti. Makro se zastaví v případě, že nemůže provést některý ze svých příkazů. Pokud například f
( (což znamená najít ( a umístěte kurzor nad něj ) nelze provést, přehrání makra se okamžitě zastaví. Možná si myslíte, že je to problém, ale ve skutečnosti se jedná o funkci a můžete ji využít ve svůj prospěch.
Při záznamu makra se zadává sekvence příkazů. To znamená, že můžete použít jakýkoli příkaz, včetně makra pro spuštění (@
V tomto okamžiku můžete začít nahrávat a přehrávat některá rekurzivní makra. Než to však uděláte, podívejte se ještě na jednu věc, než se do toho pustíte. Při nahrávání makra se zadané příkazy provádějí během nahrávání. Pokud tedy přehrajete makro jako součást záznamu a související registr má již něco zaznamenané, spustí se a pravděpodobně přinese neočekávané výsledky.
Zde je první tip:Před záznamem rekurzivního makra se ujistěte, že je registr prázdný. Vymažte registr spuštěním q
q
, což je stejné jako spuštění nahrávání na
S tím vším je konečně čas prozkoumat některé scénáře, kde vám rekurzivní makra ušetří čas navíc.
Nahrávání a přehrávání rekurzivních maker
Pro začátek si vezměme problém vyřešený v předchozím článku:Převeďte následující soubor CSV vytvořený hypotetickým monitorovacím systémem na /etc/hosts
formát souboru.
$ 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
Zde je očekávaný výstup:
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, které bylo zaznamenáno pro pomoc při převodu formátu souboru, je následující:
0r#f"xldf,A,<ESC>p0df,$px:s/,/\t/g<ENTER>j
Za předpokladu, že jste právě otevřeli Vim a výše uvedené makro ještě není zaznamenáno, máte několik možností, jak naplnit jakýkoli registr obsahem makra:
1) Zaznamenejte makro a zadejte všechny příkazy
Začněte stisknutím q
pak q
.
2) Nastavte registr
Registr můžete nastavit pomocí následujícího příkazu :let
@Esc
a Enter
. Chcete-li to obejít, použijte :execute
příkaz. Umožňuje vkládání speciálních kláves jako escape sekvence. V normálním režimu zadejte :
a poté vložte následující řádek a stiskněte Enter
:
execute "let @h='0r#f\"xldf,A,\<Esc>p0df,$px:s/,/\\t/g\<Enter>j'"
Ujistěte se, že registr h
obsah byl správně nastaven. To lze provést spuštěním :reg
reg h
v tomto případě:
:reg h
--- Registers ---
"h 0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj
Obsah registru se mírně liší od toho, co bylo nastaveno příkazem :execute
příkaz. Je to proto, že :execute
převedeno \^[
a ^M
resp. To je to, co Vim interně používá ke skutečnému „stisknutí“ kláves.
V tomto okamžiku je registr h
obsahuje přesně stejné makro zaznamenané v článku Použití maker Vim k automatizaci častých úkolů. Dalším krokem je udělat to rekurzivní. Tímto způsobem jej můžete spustit jednou a rekurzivně se to opakuje, dokud nedosáhne konce souboru.
Existuje malý trik, jak upravit již zaznamenané makro a udělat z něj rekurzivní. Můžete jej také použít k přidání chybějících příkazů a provedení změn bez záznamu celého makra.
Začněte :let @h='
a poté Ctrl-r
Ctrl-r h
, zadejte @h'
na konci a nakonec stiskněte Enter
. Ctrl-r Ctrl-r
:reg h
.
Chcete-li zkontrolovat, zda máte vše, spusťte :reg
:reg h
--- Registers ---
"h 0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj@h
S tímto na místě přejděte na druhý řádek na hosts.csv
a znovu přehrajte makro @@h
v tomto příkladu. Bude pokračovat až do konce souboru aktualizující všechny řádky. Bylo to možné, protože makro mělo 0
na začátku a j
než se rekurzivně přehraje. Díky tomu šlo o řádek níže a při opětovném spuštění makra umístilo kurzor na začátek řádku.
Všimněte si také, že makro běželo až do konce souboru a zastavilo se, protože již nebude moci jít dolů pomocí j
to byla naše podmínka přerušení pro rekurzivní provedení.
[ Hledáte více o automatizaci systému? Začněte s The Automated Enterprise, bezplatnou knihou od Red Hat. ]
Sbalit
Byla to dlouhá cesta, ale nyní máte k dispozici další nástroj, který vám pomůže zautomatizovat opakující se úkoly, a to i v případě, že tento opakovaný úkol opakuje makro znovu a znovu.
Zkoumali jste také úpravy makra, takže v tuto chvíli možná znáte nahrávání jednoho od začátku. Pokud místo úpravy makra nahráváte, nezapomeňte před spuštěním vyprázdnit cílový registr a mít @j
udělá to.
Další výhodou rekurzivního makra je, že pokud se něco pokazí, lze to zvrátit pomocí jediného vrátit zpět .