Napisałem funkcję i chcę ją wywołać za pomocą Mx i przypisać do klawisza. To moja funkcja:
(defun my-function ()
(message "This is a great function"))
Jeśli spróbuję to wywołać M-x my-function
, pojawia się błąd: [no match]
w mini-buforze.
Jeśli spróbuję powiązać go z klawiszem (lub kliknięciem myszy):
(global-set-key (kbd "C-c a") 'my-function)
Wygląda na to, że działa, ale gdy próbuję to wywołać C-c a
, pojawia się błąd
Nieprawidłowy typ argumentu: polecenie, moja funkcja
Dlaczego nie mogę korzystać z mojej funkcji?
functions
commands
interactive
Tyler
źródło
źródło
interactive
- np. Czasami polecenie znika z nowej wersji biblioteki. Błąd może zostać zgłoszony w dowolnym kontekście, w którym Emacs oczekuje polecenia.commandp
aby spróbować znaleźć inne pytania, które można zamknąć jako duplikaty tego. Należy jednak uważnie przeczytać pytania i odpowiedzi, ponieważ niektóre są różne. W niektórych przypadkach warto powtórzyć odpowiedź (i kontekst Q). W innych przypadkach pytanie nie ma związku i należy je pozostawić takie, jakie jest (nie zamknięte).Odpowiedzi:
Najważniejsze jest to, że istnieje różnica między funkcją a poleceniem .
W Emacs lisp funkcje nie są domyślnie wywoływane interaktywnie. Oznacza to, że nie można uzyskać do nich dostępu za
M-x
pomocą klawisza lub kliknięcia myszy ani przypisać ich. Jeśli chcesz to zrobić, musisz jawnie zadeklarować funkcjęinteractive
, którą wykonujesz, dodając(interactive)
formularz jako pierwszy wiersz w treści (po ciągu dokumentacji). Funkcja interaktywna nazywana jest poleceniem. Wyjaśniono to w instrukcji:(info "(elisp) Using Interactive")
(wersja online) .Wyświetlany komunikat o błędzie
Wrong type argument: commandp, my-function
wskazuje, że próbujesz wywołać funkcję interaktywnie, ale ta funkcja nie jest poleceniem .Aby wyjaśnić rzeczywisty błąd, litera
p
jest często używana w lisp do wskazania predykatu lub testu. W tym przypadku Emacs sprawdza,my-function
czy jest to polecenie korzystające z testucommandp
. Nie jest, co prowadzi do błędu. Podobne błędy pojawiają się przy każdym użyciu przedmiot niewłaściwego typu: jeśli Emacs oczekuje ciąg i przekazać symbol, może pojawić się odniesienie dostringp
, na przykład.Aby odpowiedzieć na zadane pytanie, musisz dodać
(interactive)
wiersz do definicji:Istnieje wiele opcji
interactive
formularza, obsługujących wszelkiego rodzaju sposoby przekazywania informacji do funkcji. Sprawdź w instrukcji wszystkie szczegóły.Makra klawiaturowe są szczególnym przypadkiem w tym kontekście. Makro klawiatury to sekwencja zdarzeń wejściowych, reprezentowana jako ciąg znaków. Makra klawiaturowe zachowują się jak polecenia, dzięki czemu można je przypisywać do klawiszy, nie martwiąc się o dodanie
interactive
deklaracji. Na przykład w następujący sposób:"λ"
to makro klawiatury, dzięki czemu możemy goC-c l
bez problemu powiązać . Jeśli staramy się zrobić to samo z funkcją musimy mieć pewność, aby zdefiniować funkcję jakointeractive
:źródło
M-x my-function
w swoim przykładzie. Również jako początkujący emacs nie jestem jeszcze w 100% pewien, co dokładnieC-x C-e
robi lub kiedy trzeba go uruchomić, ale wydaje się, że ... kiedy go uruchomisz, analizuje bufor i zastępujemy-function
w pamięci, ponieważ jeśli ja nie uruchamiajC-x C-e
M-x
uruchamia funkcję od ostatniego uruchomieniaC-x C-e
C-x C-e
ocenia bufor , wydaje się, że wynikiem oceny buforu zawierającego adefun
jest zarejestrowanie funkcji, chociaż ten artykuł wydaje mi się, że myślę, że powinien on po prostu uruchomić funkcję, a jednak jedyną rzeczą pokazaną w minibuforze jestmy-function
(co oznacza, że zwraca funkcję?), nieThis is a great function
. Coś mi tu brakuje.