¿Qué es un argumento de prefijo sin formato? (P mayúscula en interactivo)

9

¿Y para qué se pueden usar?

(interactive "p")toma un argumento numérico de la universal argumentderecha? Y el argumento universal es solo un int de cualquier manera, entonces, ¿qué hace el capital (interactive "P")?

24HrRevengeTherapist
fuente

Respuestas:

11

Es difícil de creer que la gente describió esto aquí sin darle enlaces a las propias descripciones de Emacs sobre esto:

"Haz Emacs!": C-h i , Elegir un manuali prefix argument RET.

En pocas palabras, aunque otras respuestas aquí lo dicen bastante bien, y se describe en detalle en el manual:

  • El argumento de prefijo "en bruto" proporciona valores Lisp de diferentes tipos, y en particular distingue si el usuario realmente utilizó un argumento de prefijo (de cualquier tipo).

    Al usarlo, un programa puede distinguir si el usuario utiliza uno de { -, M--, C--} o uno de { M-- 1, C-- 1, C-u -1} (ambos de los cuales tienen el mismo valor prefijo numérico de -1), y distinguir si s? Lo utilizan C-u C-uo uno de { M-16, C-16, C-u 16} (ambos tienen un valor numérico 16), entre muchas otras distinciones.

    Pero la distinción más importante es nilvs no nil: muchos comandos actúan de manera diferente dependiendo de si el usuario utiliza un prefijo arg.

  • El prefijo arg "numérico" es realmente el valor que la función prefix-numeric-valuedevuelve cuando se aplica al prefijo raw arg. IOW, es mejor considerarlo como un mapeo desde la interacción real del usuario sin procesar a un entero.

    No se puede decir si el usuario utiliza realmente un argumento prefijo, ya que el valor por defecto sin argumento prefijo se asigna al número entero 1, tal como lo hace el uso de C-u 1, M-1o C-1.

Dibujó
fuente
9

Cuando se usa el Código interactivo de prefijo sin formato "P", el argumento se pasa tal cual mientras que "p"convierte el argumento en un número.

Después de evaluar el elisp a continuación, pruebe C-u M-x my/fn-with-num-argy luego C-u M-x my/fn-with-raw-argvea la diferencia porque C-upasa un argumento de lista (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)
;; .

También el argumento predeterminado es 1para argumento numérico ( "p") pero predeterminado para nilo ()para argumento sin formato ( "P").

Mis pocos centavos: a veces, el factor decisivo para usar "p"o no "P"es si desea que el argumento predeterminado sea 1o 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
fuente
Gracias. Entiendo que a veces es mejor conseguir nilque 1, pero nunca que tener un envoltorio intes preferible a uno sin envolver int. (No puedo votar hasta que obtenga 15 puntos, por cierto).
24HrRevengeTherapist
@ 24HrRevengeTherapist: acaba de votar ", llevándote más allá del umbral mágico de 15 puntos. ¡Sal y vota a favor de los artículos que te ayudan!
Dan
No se trata de entradas envueltas vs sin envolver. No se trata de entradas en absoluto. Y haga +1 a @kaushalmodi para enfatizar que puede saber si el usuario usó un prefijo arg solo usando el argumento sin procesar (verificando si el valor es nilo no).
Dibujó
7

Solo para agregar un poco más de detalle a la respuesta de @ kaushalmodi (y un caso de prueba útil):

El argumento sin formato le permite distinguir entre argumentos provistos con universal-argumenty digit-argument.

Con un prefijo numérico arg no hay forma de distinguir el argumento universal C-ude un prefijo arg de 4 (es decir C-4). Con el argumento prima éstos son diferentes: (4)vs 4.

Lo mismo se aplica con negative-argument. Como argumento en bruto puedes distinguir entre C--y C-- 1: el primero te dará -mientras que el segundo -1. Cuando se convierte a un argumento numérico, ambos lo serán -1.

Entonces, el beneficio de usar un argumento en bruto es que le da más valores posibles. Puede escribir comandos que se comporten de manera diferente dependiendo de cómo se especifique el argumento.

Como ejemplo, eche un vistazo a la cadena de documentación para yank. Este comando trata C-uy de manera C-4diferente:

Con solo Cu como argumento, ponga el punto al principio y marque al final. Con el argumento N, reinserta la enésima muerte más reciente.

glucas
fuente