I do czego można je wykorzystać?
(interactive "p")
bierze argument liczbowy z universal argument
prawej strony? A uniwersalny argument jest tylko int w obu przypadkach, więc co robi kapitał (interactive "P")
?
I do czego można je wykorzystać?
(interactive "p")
bierze argument liczbowy z universal argument
prawej strony? A uniwersalny argument jest tylko int w obu przypadkach, więc co robi kapitał (interactive "P")
?
Odpowiedzi:
Trudno uwierzyć, że ludzie opisali to tutaj, nie podając również linków do własnych opisów Emacsa:
W podręczniku Emacsa węzeł Argumenty .
W podręczniku Elisp węzeł Prefiks Argumenty poleceń .
„Zapytaj Emacs!”: C-h i
Wybierz instrukcjęi prefix argument RET
.
W skrócie, chociaż jest to dobrze powiedziane przez inne odpowiedzi tutaj i jest szczegółowo opisane w instrukcji:
Argument „raw” prefiksu zapewnia wartości Lisp różnego rodzaju, w szczególności rozróżnia, czy użytkownik faktycznie użył argumentu prefiksu (dowolnego rodzaju).
Używając go, program potrafi odróżnić, czy użytkownik stosować jedną { -
, M--
, C--
} lub jednego z { M-- 1
, C-- 1
, C-u -1
} (z których oba mają taką samą wartość liczbowa prefiks -1
) oraz rozróżnić, czy s? Używał C-u C-u
lub jeden { M-16
, C-16
, C-u 16
} (oba mają wartość liczbową 16) - spośród wielu innych wyróżnień.
Ale najważniejsze takie rozróżnienie jest w nil
porównaniu z nie- nil
wiele: wiele poleceń działa inaczej w zależności od tego, czy użytkownik używa przedrostka arg.
Argument „numeryczny” prefiks jest tak naprawdę tylko wartością prefix-numeric-value
zwracaną przez funkcję po zastosowaniu do surowego prefiksu arg. IOW najlepiej jest traktować jako odwzorowanie rzeczywistej interakcji użytkownika na liczbę całkowitą.
Nie można powiedzieć, czy użytkownik faktycznie użył argumentu prefiksu, ponieważ domyślne bez przedrostka argumentu mapuje liczbę 1, podobnie jak czyni stosowanie C-u 1
, M-1
lub C-1
.
Gdy używany jest surowy kod interaktywny "P"
, argument jest przekazywany bez "p"
zmian, podczas gdy argument jest konwertowany na liczbę.
Po dokonaniu oceny poniższego elisp, wypróbuj, C-u M-x my/fn-with-num-arg
a następnie C-u M-x my/fn-with-raw-arg
zobacz różnicę, ponieważ C-u
przekazuje argument listy (4)
.
(defun my/debug-fn (arg)
(let ((msg))
(if (numberp arg)
(setq msg (format "Argument is number %s. " (pp arg)))
(setq msg "Argument is not a number. "))
(if (listp arg)
(setq msg (concat msg (format "Arg is %s." (pp arg))))
(setq msg (concat msg "Argument is not a list.")))
(message msg)))
(defun my/fn-with-num-arg (arg)
(interactive "p")
(my/debug-fn arg))
;; Result of C-u M-x my/fn-with-num-arg :
;; Argument is number 4. Argument is not a list.
(defun my/fn-with-raw-arg (arg)
(interactive "P")
(my/debug-fn arg))
;; Result of C-u M-x my/fn-with-raw-arg :
;; Argument is not a number. Arg is (4)
;; .
Domyślnym argumentem jest również argument 1
liczbowy ( "p"
), ale domyślnie nil
lub ()
surowy argument ( "P"
).
Moje kilka centów: Czasami decydującym czynnikiem decydującym o tym, czy użyć, "p"
czy "P"
też o tym, czy domyślnym argumentem jest 1
lub nil
.
;; Result of M-x my/fn-with-num-arg :
;; Argument is number 1. Argument is not a list.
;; Result of M-x my/fn-with-raw-arg :
;; Argument is not a number. Arg is nil.
nil
czy nie).
Aby dodać nieco więcej szczegółów do odpowiedzi @ kaushalmodi (i przydatnego przypadku testowego):
Surowy argument pozwala rozróżnić argumenty dostarczone z universal-argument
i digit-argument
.
Przy arg numerycznym prefiksie nie ma sposobu na odróżnienie uniwersalnego argumentu C-u
od prefiksu arg o wartości 4 (tj C-4
.). Z surowego argumentem są różne: (4)
vs 4
.
To samo dotyczy negative-argument
. Jako surowiec argumentu można odróżnić C--
i C-- 1
: pierwsze dadzą Ci -
natomiast drugi -1
. Oba zostaną przekonwertowane na argument liczbowy -1
.
Zaletą użycia surowego argumentu jest to, że daje on więcej możliwych wartości. Możesz pisać polecenia, które zachowują się inaczej, w zależności od tego, jak podany jest argument.
Jako przykład spójrz na ciąg dokumentów dla yank
. To polecenie traktuje C-u
i C-4
inaczej:
Z argumentem tylko Cu, umieść punkt na początku i zaznacz na końcu. Za pomocą argumentu N włóż ponownie N-te ostatnie zabicie.
nil
niż1
, ale nigdy, że zawinięcieint
jest lepsze niż rozpakowanieint
. (Nie mogę głosować, dopóki nie zdobędę 15 punktów, przy okazji).