Makro gupcze!

Emacsa miałem opisywać delikatnie i od początku, żeby szoku nie było, ale im bardziej człowiek chce 'uporządkować i zrobić dobrze’, tym więcej czasu siedzi, myśli i porządkuje. Zamiast wziąć się i zrobić 😀 To wogóle jest temat na inny raz – będzie zatytułowany 'Moja bezproduktywna produktywność’ 🙂
No ale do rzeczy.
Mam ja sobie dziś rano taki kawałek kodu:
tempfd.engFail1 = int.Parse(parametry[40]);
tempfd.engIdle1 = int.Parse(parametry[44]);
tempfd.engOilP1 = int.Parse(parametry[50]);
tempfd.engChip1 = int.Parse(parametry[36]);
tempfd.bustieOpn1 = int.Parse(parametry[24]);
tempfd.engExceed1 = int.Prase(parametry[38]);
tempfd.engManual1 = int.Parse(parametry[46]);
tempfd.engOFilt1 = int.Parse(parametry[48]);
tempfd.fValveCl1 = int.Parse(parametry[57]);
tempfd.fadecFail1 = int.Parse(parametry[59]);
tempfd.fadecMinr1 = int.Parse(parametry[61]);
tempfd.fireETst1 = int.Parse(parametry[63]);
tempfd.fireExt1 = int.Parse(parametry[65]);
tempfd.fliDegr1 = int.Parse(parametry[67]);
tempfd.fliFail1 = int.Parse(parametry[69]);
tempfd.fuelFilt1 = int.Parse(parametry[72]);
tempfd.fuelPress1 = int.Parse(parametry[74]);
tempfd.fuelValve1 = int.Parse(parametry[76]);
tempfd.genDiscon1 = int.Parse(parametry[78]);
tempfd.genOvht1 = int.Parse(parametry[80]);
tempfd.hydPress1 = int.Parse(parametry[85]);
tempfd.inverter1 = int.Parse(parametry[87]);
tempfd.ovsp1 = int.Parse(parametry[90]);
tempfd.pitotHtr1 = int.Parse(parametry[94]);
tempfd.primePump1 = int.Parse(parametry[96]);
tempfd.starter1 = int.Parse(parametry[101]);
tempfd.trainIdle1 = int.Parse(parametry[103]);
tempfd.training1 = int.Parse(parametry[105]);
tempfd.twistGrip1 = int.Parse(parametry[110]);a potrzebuję z niego zrobić taki kawałek kodu:
engFail1,
engIdle1,
engOilP1,
engChip1,
bustieOpn1,
engExceed1,
engManual1,
engOFilt1,
fValveCl1,
fadecFail1,
fadecMinr1,
fireETst1,
fireExt1,
fliDegr1,
fliFail1,
fuelFilt1,
fuelPress1,
fuelValve1,
genDiscon1,
genOvht1,
hydPress1,
inverter1,
ovsp1,
pitotHtr1,
primePump1,
starter1,
trainIdle1,
training1,
twistGrip1;Czyli dla każdej linii potrzebuję zrobić tak:
- wcisnąć TAB, żeby ustawić automatyczne wcięcie danego wiersza.
- skasować 'tempfd’ (M-d – kasowanie wyrazu)
- skasować kropkę (C-d – kasowanie znaku)
- przejść na koniec wyrazu (M-e – przejście na koniec wyrazu)
- dopisać przecinek (’,’)
- skasować co zostało (C-k – usuń wszystko od pozycji kursora do końca wiersza)
- przejść do kolejnego wiersza (C-n)
- ustawić się na jego początku (C-a)
W razie jakby ktoś nie wiedział to ’C’
oznacza klawisz Control, a ’M’ klawisz Meta
(czyli Alt).
Tu widać 29 linii ale w tym pliku mam około 200 takich zmian do wprowadzenia.
Można oczywiście 'po nowoczesnemu’: latać mysz-klawa: zaznaczyć cośtam, wyciąć cośtam, kliknąć i ustawić kursor w innym miejscu, cośtam dopisać, zaznaczyć coś innego itp.
Ale można też użyć metod prymitywnych – Emacsowego prostego makra.
Nagrywanie makra rozpoczynamy skrótem: C-x ( a kończymy C-x )
No to robimy tak:
C-x ( TAB M-d C-d M-f , C-k C-n C-a C-x )
i już.
Teraz każdorazowe wciśnięcie C-x e
wykona nam nasze makro czyli posprząta jeden wiersz 😀
Oczywiście to Emacs jest – istnieje coś takiego jak 'argument
numeryczny’. Jeżeli wciśniemy ’C-u liczba skrót’ to Emacs wykona ’skrót’
’liczbę’ razy.
Np.:
C-n to przejście do nowego wiersza
C-u 10 C-n to przejście o 10 wierszy w
dół
czy:
M-f to przejście na koniec wyrazu C-u 5 M-f to przejście na koniec 5 wyrazu
Już pewnie widać do czego dążę ;D Ustawiamy się na początku naszego
kodu, wciskamy C-u 29 C-x e To zaaplikuje
nasze makro 29 razy i tym samym zrobi nam porządek z całym fragmentem
😉
Oczywiście to dopiero początek zabawy bo teraz za pomocą C-x C-k n możemy nasze makro nazwać.
A potem wywołać za pomocą M-x nasza-nazwa-makra. W ten sposób można mieć
kilka(naście) makr i aplikować wedle potrzeby.
Zapisywanie makra na przyszłość
Otwieramy nasz plik konfiguracyjny (~/.emacs albo ~/.emacs.d/init/el)
Wstawiamy makro: M-x insert-kbd-macro – Emacs zapyta o nazwę mark do wstawienia.
Zapisujemy konfig.
Tak zapisane makro możemy już wywołać zawsze i wszędzie za pomocą
M-x nazwa-makra