2012-02-22 11 views
11

Chcę napisać funkcję Emacs Lisp, która będzie się włączać flyspell-mode niezależnie od bieżącego stanu trybu. Funkcja flyspell-mode-on jest przestarzała. Dokumentacja sugeruje, że pozytywna prefiks argumentem włączy flyspell-mode, ale niestety działaJak wywołać interaktywną funkcję Emacs Lisp z argumentem prefiksu, z innej funkcji Emacs Lisp?

(flyspell-mode 1) 

wyniki w komunikat o błędzie:

Wrong number of arguments: (lambda (flyspell-mode 1)), 0 

Gdybym mógł dowiedzieć się, jak nazywają flyspell-mode z przedrostka argumentu , Wierzę, że mógłbym rozwiązać ten problem.

Najbardziej istotną sekcją, jaką mogę znaleźć w podręczniku Emacs Lisp, jest sekcja "Połączenie interaktywne", która opisuje takie polecenia, jak call-interactively. Nie jest to zdecydowanie to, czego chcę.

(Ostatecznym Problem usiłuję rozwiązać jest stworzenie hak trybu że włączy tryb niezależnie od jego aktualnego stanu.)

nb Tytuł pytania emacs lisp call function with prefix argument programmatically sprawia, że ​​wydaje się on być powiązany, ale pytanie to dotyczyło utworzenia interaktywnego polecenia, a problem został ostatecznie rozwiązany za pomocą call-interactively.


EDIT: Ta kwestia jest dyskusyjna; Znalazłem rozwiązanie alternatywne do mojego pierwotnego problemu:

(add-hook 'text-mode-hook 
      (function (lambda() 
         (require 'flyspell) 
         (if flyspell-mode nil (flyspell-mode))))) 

Ale nadal chcieliby wiedzieć, jak wywołania funkcji Emacs Lisp z prefiksu, z innej funkcji Emacs Lisp, z nic interaktywnym.


UPDATE: Może powinienem zapytać, dlaczego byłem coraz to komunikat o błędzie ...

Odpowiedz

9

Wygląda twoją wersją trybie Flyspell nie śledzić minor mode conventions, które wymagają, które można włączyć tryb moll z (name-of-mode t) ani pozytywnego przedrostka argumentu, należy je wyłączyć z (name-of-mode 0) żadnego negatywnego prefiksu argumentu, i przełącza się na (name-of-mode nil).

Jeśli masz najnowszą wersję Flyspell, raport o błędzie może być w porządku. Mam wersję dostarczoną z GNU Emacs 23.2 na mojej maszynie i szanuje konwencję. Moja wersja definiuje również dwie funkcje: oba trywialne opakowania około flyspell-mode; funkcje o takich nazwach są powszechne, ale nie są to oficjalne konwencje. Funkcje flyspell-mode-on i flyspell-mode-off są najwyraźniej przeznaczone do użytku wewnętrznego.

Generalnie, polecenia odczytują bieżący prefiks ze zmiennej current-prefix-arg. Nie myl tej z prefix-arg, która jest wartością dla następnego polecenia (tylko kilka poleceń, takich jak universal-argument dotknij tej zmiennej). Tak więc, jeśli musisz przekazać argument przedrostka podczas wywoływania funkcji, połącz lub ustaw current-prefix-arg.

(let ((current-prefix-arg t)) 
    (flyspell-mode)) 
+0

Używam emacsa 21, ponieważ emacsen 22 i 23 spowodował pewne straty w niektórych starszych trybach, których używam, ale nie są już utrzymywane. –

+1

@NormanRamsey Wow, to się starzeje. Co do tego, dlaczego otrzymujesz ten komunikat o błędzie, nie ma w nim nic więcej niż funkcja 'flyspell-mode' w twojej wersji, która nie przyjmuje żadnego argumentu i bezpośrednio czyta' current-prefix-arg'; jest to defekt konstrukcyjny poprawiony w późniejszych wersjach. – Gilles

4

Jeśli nie wywołując funkcję interaktywnego, wówczas deklaracja (interactive) nie jest używany w celu uzyskania argumentów .

W zdecydowanej większości przypadków nie trzeba się martwić, czy argument może być "argumentem przedrostkowym" dla nieinteraktywnych połączeń; po prostu sprawdź dokumentację funkcji i podaj wartość, której potrzebujesz, aby zrobić to, co chcesz.

Jeśli z jakiegoś powodu powinieneś replikować wysyłanie argumentu prefiksu w nieinteraktywnym kontekście, musisz sprawdzić deklarację tej funkcji (interactive) i dokładnie określić, w jaki sposób używasz tego argumentu, i upewnić się, że to zachowanie zostało powtórzone za argument, który przekazujesz.

Aby uzyskać więcej informacji, zob

  • CHFinteractiveRET
  • M:(info "(elisp) Prefix Command Arguments")RET

W bardziej złożonych przypadkach wag tutaj funkcja zmienia swoje zachowanie w oparciu o zmienną current-prefix-arg, możesz bezpośrednio ustawić tę zmienną.

(let ((current-prefix-arg '(4))) 
    (foo current-prefix-arg)) 
0

Nie jestem Emacs i Elisp mistrza (jeszcze;)), ale myślę, że w tym przypadku you may useCtrl - u1Alt - xflyspell-mode.

+5

To byłoby połączenie interaktywne. – phils

2

mogę myśleć o tym .. Powinien być bardziej lepiej

(call-interactively '(lambda() 
         (interactive) 
         (flyspell-mode '(4)))) 

UPDATE: mogę uruchomić ten bezpośrednio .. Czego mi brakuje z pytaniem.?

(flyspell-mode '(4)) 
+0

'(flyspell-mode '(4))' działa dla mnie. – jiahut

1

FWIW, funkcja `flyspell-mode” zaakceptował argument (jak w "(flyspell-mode 1)") co najmniej od Emacs-21, więc nie wiem skąd masz ten błąd .

Ale skoro już tu jestem, równie dobrze mogę zaznaczyć, że (dodawanie haseł w trybie "trybu tekstowego" w trybie flyspell) zmieniło znaczenie w Emacs-24: zamiast znaczenia "przełącz tryb flyspell w tryby tekstowe "będzie to teraz oznaczać" włącz tryb flyspell w trybach tekstowych ". Jest to niekompatybilna wstecz zmiana, ale uważam, że naprawi on więcej ukrytych błędów, niż to wprowadzi.

Powiązane problemy