Emacs: Jak wstawić „λ” zamiast „lambda” w trybie schematu?


10

Dawno temu natknąłem się na funkcję edytora tekstu, która zastąpiła słowo „lambda” znakiem „λ”. Chciałbym to zrobić w emacs. Moje preferencje:

  • Chciałbym aktywować tę funkcję tylko w niektórych trybach (aktywuj ją w trybie Scheme, ale wyłącz na przykład w trybie C).

  • W pracy nadal używam starszej wersji emacsa, więc rozwiązanie powinno działać dla emacs22 i emacs23.

jak powinienem postąpić?

Odpowiedzi:


8

Tworzysz hook trybu, który zastępuje lambdasię greckim znakiem.

   (defun sm-greek-lambda ()
       (font-lock-add-keywords nil `(("\\<lambda\\>"
           (0 (progn (compose-region (match-beginning 0) (match-end 0)
           ,(make-char 'greek-iso8859-7 107))
           nil))))))

Następnie dodajesz ten hak do swojego trybu:

   (add-hook 'emacs-lisp-mode-hook 'sm-greek-lambda)

2
Lepiej byłoby zmienić nazwę sm-lambda-mode-hookprzez sm-replace-lambdalub sm-greek-lambda. XXX-mode-hookjest zwykle używany do identyfikowania haków obsługiwanych run-hookprzez określony tryb, a zatem do których można użyć add-hook.
Daimrod

Czy make-charjest tam tylko wsparcie 22?
Jon Purdy

@Daimrod: Czy możesz wyjaśnić różnicę między XXX-mode-hooka niestandardowym zdefiniowanym w odpowiedzi? A przynajmniej wskaż mi przydatną dokumentację?
rahmu

@rahmu: xxx-mode-hookto zwykle nazwa haka prowadzonego - z run-hooks- przez tryb xxx. tzn. emacs-lisp-mode-hookjest uruchamiany po wywołaniu funkcji emacs-mode. W takim przypadku nie jest uruchamiany żaden hak, ale funkcja jest dodawana do haka. Spójrz na podręczniku Elisp (Hooks) aby uzyskać więcej informacji.
Daimrod

@rahmu: Aby dodać mały przykład, możesz to zrobić, (add-hook 'emacs-lisp-mode-hook 'some-function)ale (add-hook 'sm-lambda-mode-hook 'some-function)nigdy nie będzie działać, chyba że masz jakiś kod, który to działa (run-hooks 'sm-lambda-mode-hook).
Daimrod
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.