2011-01-11 8 views
13

Pracuję w Haskell i często natknąć się kod podobny do poniższego:Emacs align-regexp on = ale nie ==

func i j | i == j = i 
     | otherwise = j 

Chcę wyrównać na postać '=' używając align-regexp ale nie mam elisp know-how. Próbowałem po prostu robić "=" bez cudzysłowów, ale to wstawia niechciany znak spacji przed każdym "=". Znalazłem proponowane rozwiązanie here, ale nie mogę tego zrobić, aby cokolwiek zrobić.

Proszę pomóżcie mi napisać funkcję lub zakodowane makro, które pozwoli mi ustawić skrót klawiszowy.

Odpowiedz

17

Cu Mxalign-regexpRET\(\s-*\) =RET1RET0RETn

(nb istnieje przestrzeń po '=', ale to nie jest bardzo oczywiste.)

Co oznacza ...

Użyj argumentu prefiksu, aby powiedzieć align-regexp, aby poprosić o więcej parametrów niż domyślnie.

Patrz CH Falign-regexp i CH valign-rules-list do szczegółów, ale w skrócie

\(\s-*\) jest domyślnym „grupa” do usuwania/ekspansji. Dodajemy nasz wzór do końca tego: '='. (Zauważ, że \s- jest składnią regexp Emacsa dla białych znaków.)

1 odnosi się po prostu do nawiasowanej grupy 1 (jak wyżej). To jest domyślne.

0 dla odstępu używanego między dwiema częściami linii. Domyślnie jest to 1 i właśnie dlatego otrzymujesz dodatkowe miejsce.

n, aby nie wyrównywać żadnych późniejszych dopasowań wzorców po pierwszym w każdym wierszu.

edit: Faktycznie, Q & Â związana jest blisko identyczne, i działa dobrze dla mnie na Emacsa 23.2.1, więc jest duplikat, ale nadal i odpowiedzieć na kluczowe aspekty wiążące:

Możesz powiązać tę (lub dowolną) sekwencję za pomocą makr klawiatury. Oto wynik końcowy, który prawdopodobnie możesz dodać do pliku init, chociaż zalecam, aby samemu przejść przez ten proces. Użyj tego, co chcesz zamiast klucza w celu uzyskania numeru C-c a. C-c (letter) i F5-F9 są zarezerwowane dla użytkowników końcowych, aby wiązali się, jak im się podoba, więc jeden z nich będzie bezpieczny przed byciem spętanym przez mapę klawiszy trybu.

(global-set-key (kbd "C-c a") (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([21 134217848 97 108 105 103 110 45 114 101 103 101 120 112 return 32 61 32 return return backspace 48 return 110] 0 "%d")) arg))) 

Zrobiłem to przez:

  1. zaznaczając tekst.
  2. F3, aby rozpocząć nagrywanie.
  3. wykonanie align-regexp jak wyżej (uważając, aby wpisać wszystko dosłownie, a nie używać historii minibuffer lub szarpanie).
  4. F4, aby zatrzymać nagrywanie.
  5. C-X-C, K nalign-single-equalsRET otrzymując makro nazwę
  6. M-Xinsert-kbd-macroretalign-single-equalsret GET LISP.
  7. Zawijanie wyrażenia (lambda) za pomocą (global-set-key) w celu powiązania go. (Chociaż można też użyć kodu (fset 'align-single-equals ...) przewidziane, a następnie wiążą klucz do tego symbolu.

Jeśli pomylisz się podczas nagrywania skomplikowaną makro, nie denerwować — Emacs zapewnia naprawdę dobry edytor makro, które można użyć, aby naprawić wszelkie błędy po zakończeniu nagrywania (wpisz Cx Ck e), więc nie muszą być idealne

edit 2:. może również dodać przykład funkcja, zgodnie z komentarzami:

(defun my-align-single-equals() 
    "Align on a single equals sign (with a space either side)." 
    (interactive) 
    (align-regexp 
    (region-beginning) (region-end) 
    "\\(\\s-*\\) = " 1 0 nil)) 

(global-set-key (kbd "C-c a") 'my-align-single-equals) 
+0

Dzięki. Byłem w stanie użyć twojego rozwiązania, ale stworzyłem funkcję zamiast makra, ponieważ jest dla mnie bardziej czytelna. – Karl

+0

Cóż, to jeszcze lepiej :) Funkcja jest zdecydowanie lepsza, jeśli jesteś zadowolony z pisania selp, ale makra są bardzo przydatne, jeśli nie. – phils

+0

trochę spóźniony na imprezę, ale kanonicznym sposobem rozwiązania tego problemu jest dodanie reguły do ​​"align-rules-list" zamiast pisania własnej funkcji. –

Powiązane problemy