Co to jest argument surowego przedrostka? (duże P w interaktywnym)

9

I do czego można je wykorzystać?

(interactive "p")bierze argument liczbowy z universal argumentprawej strony? A uniwersalny argument jest tylko int w obu przypadkach, więc co robi kapitał (interactive "P")?

24HrRevengeTherapist
źródło

Odpowiedzi:

11

Trudno uwierzyć, że ludzie opisali to tutaj, nie podając również linków do własnych opisów Emacsa:

„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-ulub 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 nilporównaniu z nie- nilwiele: 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-valuezwracaną 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-1lub C-1.

Rysował
źródło
9

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-arga następnie C-u M-x my/fn-with-raw-argzobacz różnicę, ponieważ C-uprzekazuje 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 1liczbowy ( "p"), ale domyślnie nillub ()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 1lub 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.
Kaushal Modi
źródło
Dzięki. Rozumiem, że czasem lepiej jest dostać nilniż 1, ale nigdy, że zawinięcie intjest lepsze niż rozpakowanie int. (Nie mogę głosować, dopóki nie zdobędę 15 punktów, przy okazji).
24HrRevengeTherapist
@ 24HrRevengeTherapist: właśnie wybrałem ya ', przekraczając magiczny próg 15 punktów. Wyjdź i zrób głosowanie na przedmioty, które ci pomogą!
Dan
Nie chodzi o opakowane vs nieopakowane int. W ogóle nie chodzi o ints. I +1 do @kaushalmodi za podkreślenie, że możesz stwierdzić, czy użytkownik użył prefiksu arg tylko za pomocą surowego arg (sprawdzając, czy wartość jest, nilczy nie).
Drew,
7

Aby dodać nieco więcej szczegółów do odpowiedzi @ kaushalmodi (i przydatnego przypadku testowego):

Surowy argument pozwala rozróżnić argumenty dostarczone z universal-argumenti digit-argument.

Przy arg numerycznym prefiksie nie ma sposobu na odróżnienie uniwersalnego argumentu C-uod 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-ui C-4inaczej:

Z argumentem tylko Cu, umieść punkt na początku i zaznacz na końcu. Za pomocą argumentu N włóż ponownie N-te ostatnie zabicie.

glucas
źródło