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