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