E para que eles podem ser usados?
(interactive "p")
leva um argumento numérico da universal argument
direita? E o argumento universal é apenas um int de qualquer maneira, então o que o capital (interactive "P")
faz?
E para que eles podem ser usados?
(interactive "p")
leva um argumento numérico da universal argument
direita? E o argumento universal é apenas um int de qualquer maneira, então o que o capital (interactive "P")
faz?
Respostas:
É difícil acreditar que as pessoas tenham descrito isso aqui sem também fornecer links para as próprias descrições do Emacs sobre isso:
No manual do Emacs, nó Arguments .
No manual Elisp, nó Prefix Command Arguments .
"Ask Emacs!":, C-h i
Escolha um manuali prefix argument RET
,.
Em poucas palavras, embora isso seja dito bem o suficiente por outras respostas aqui e seja descrito em detalhes no manual:
O prefixo "bruto" arg fornece valores Lisp de diferentes tipos e, em particular, distingue se o usuário realmente usou ou não um argumento de prefixo (de qualquer tipo).
Com ele, um programa pode distinguir se o usuário utilizar um dos { -
, M--
, C--
} ou um dos { M-- 1
, C-- 1
, C-u -1
} (sendo que ambos têm o mesmo valor de prefixo numérico -1
), e distinguir se s? Ele usou C-u C-u
ou um dos { M-16
, C-16
, C-u 16
} (ambos com valor numérico 16) - entre muitas outras distinções.
Porém, a distinção mais importante é nil
vs não nil
: muitos comandos agem de maneira diferente dependendo se o usuário usa um prefixo arg.
O prefixo "numérico" arg é realmente apenas o valor que a função prefix-numeric-value
retorna quando aplicado ao prefixo bruto arg. IOW, é melhor pensar em um mapeamento da interação real bruta do usuário para um número inteiro.
Ele não pode dizer se o usuário realmente usou um argumento prefixo, porque o padrão de nenhum argumento prefixo mapeia para o número inteiro 1, assim como faz o uso de C-u 1
, M-1
ou C-1
.
Quando o código interativo do prefixo bruto "P"
é usado, o argumento é passado como está, enquanto "p"
converte o argumento em um número.
Depois de avaliar o elisp abaixo, tente C-u M-x my/fn-with-num-arg
e depois C-u M-x my/fn-with-raw-arg
veja a diferença, porque C-u
passa um 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)
;; .
Também os padrões de argumento para 1
para o argumento numérico ( "p"
), mas o padrão é nil
ou ()
para o argumento matéria ( "P"
).
Meus poucos centavos: Às vezes, o fator decisivo para usar "p"
ou "P"
é se você deseja que o argumento padrão seja 1
ou 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
ou não).
Apenas para adicionar um pouco mais de detalhe à resposta de @ kaushalmodi (e caso de teste útil):
O argumento bruto permite distinguir entre os argumentos fornecidos com universal-argument
e digit-argument
.
Com um prefixo numérico arg, não há como distinguir o argumento universal C-u
de um prefixo arg de 4 (ie C-4
). Com o argumento cru estes são diferentes: (4)
vs 4
.
O mesmo se aplica a negative-argument
. Como argumento bruto, você pode distinguir entre C--
e C-- 1
: o primeiro fornecerá você -
enquanto o segundo -1
. Quando convertidos em um argumento numérico, ambos serão -1
.
Portanto, o benefício de usar um argumento bruto é que ele fornece mais valores possíveis. Você pode escrever comandos que se comportam de maneira diferente, dependendo de como o argumento é especificado.
Como exemplo, dê uma olhada na sequência de documentos para yank
. Este comando trata C-u
e de maneira C-4
diferente:
Com apenas Cu como argumento, coloque o ponto no início e marque no final. Com o argumento N, reinsira a enésima morte mais recente.
nil
que1
, mas nunca que ter um embrulhoint
é preferível a um desembrulhadoint
. (Não posso votar até eu conseguir 15 pontos, btw).