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:

  1. wcisnąć TAB, żeby ustawić automatyczne wcięcie danego wiersza.
  2. skasować 'tempfd’ (M-d – kasowanie wyrazu)
  3. skasować kropkę (C-d – kasowanie znaku)
  4. przejść na koniec wyrazu (M-e – przejście na koniec wyrazu)
  5. dopisać przecinek (’,’)
  6. skasować co zostało (C-k – usuń wszystko od pozycji kursora do końca wiersza)
  7. przejść do kolejnego wiersza (C-n)
  8. 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ść

  1. Otwieramy nasz plik konfiguracyjny (~/.emacs albo ~/.emacs.d/init/el)
  2. Wstawiamy makro: M-x insert-kbd-macro – Emacs zapyta o nazwę mark do wstawienia.
  3. Zapisujemy konfig.
  4. Tak zapisane makro możemy już wywołać zawsze i wszędzie za pomocą M-x nazwa-makra