EDIT: Como @hatschipuh apontou nos comentários, uma flet
construção de tipo é mais direta e não depende da minha macro de conselhos idiossincrásicos. Pelo menos no meu Emacs (24.5.1), cl-flet
usa o escopo lexical, portanto, você precisará do noflet
pacote para o seguinte snippet funcionar. Role para baixo para obter a resposta idiossincrática original.
(defun my/bypass-confirmation (function &rest args)
"Call FUNCTION with ARGS, bypassing all `y-or-n-p' prompts."
(require 'noflet)
(noflet
((y-or-n-p (prompt) t))
(apply function args)))
(defun my/bypass-confirmation-all (function &rest args)
"Call FUNCTION with ARGS, bypassing all prompts.
This includes both `y-or-n-p' and `yes-or-no-p'."
(require 'noflet)
(noflet
((y-or-n-p (prompt) t)
(yes-or-no-p (prompt) t))
(apply function args)))
EDIT: Esta é a resposta original, exceto que eu consertei my/bypass-confirmation-all
para trabalhar como anunciado e alterei um pouco as convenções de chamada.
Aqui está um invólucro geral que deve funcionar para qualquer função.
(defun my/bypass-confirmation (function &rest args)
"Call FUNCTION with ARGS, bypassing all `y-or-n-p' prompts."
(my/with-advice
((#'y-or-n-p :override (lambda (prompt) t)))
(apply function args)))
(defun my/bypass-confirmation-all (function &rest args)
"Call FUNCTION with ARGS, bypassing all prompts.
This includes both `y-or-n-p' and `yes-or-no-p'."
(my/with-advice
((#'y-or-n-p :override (lambda (prompt) t))
(#'yes-or-no-p :override (lambda (prompt) t)))
(apply function args)))
Esse código depende dessa macro, que parece ser minha solução preferida para tudo no Stackexchange.
(defmacro my/with-advice (adlist &rest body)
"Execute BODY with temporary advice in ADLIST.
Each element of ADLIST should be a list of the form
(SYMBOL WHERE FUNCTION [PROPS])
suitable for passing to `advice-add'. The BODY is wrapped in an
`unwind-protect' form, so the advice will be removed even in the
event of an error or nonlocal exit."
(declare (debug ((&rest (&rest form)) body))
(indent 1))
`(progn
,@(mapcar (lambda (adform)
(cons 'advice-add adform))
adlist)
(unwind-protect (progn ,@body)
,@(mapcar (lambda (adform)
`(advice-remove ,(car adform) ,(nth 2 adform)))
adlist))))
Se esse código é a maneira mais inteligente de lidar com essa situação, eu não sei. Em geral, eu gosto de usar esse tipo de conselho temporário para fazer modificações nas funções existentes, em vez de duplicar o código das funções originais, em parte porque ajuda a tornar sua função modificada à prova do futuro contra alterações não relacionadas no original. Mas, nesse caso, talvez seja necessário tomar cuidado adicional, pois se twittering-mode
atualizar e alterar os prompts ou adicionar outro, você não verá as alterações. Como um prompt de y ou n indica uma escolha controversa, isso pode ter consequências infelizes.
EDIT: Ocorreu-me que um exemplo de uso pode ser útil. Este exemplo funciona com qualquer uma das implementações.
(defun my/twittering-function ()
;; This will bypass `y-or-n-p' in both commands.
(my/bypass-confirmation #'twittering-favorite arg)
(my/bypass-confirmation #'twittering-native-retweet)
;; This will bypass both `y-or-n-p' and `yes-or-no-p' in this command.
(my/bypass-confirmation-all #'twittering-favorite arg)
;; Prompts in this call are not bypassed.
(twittering-native-retweet)
twittering-mode
(e não vou me incomodar em acessar o código), mas como um conselho geral: normalmente, em vez de fazer o que você sugere (crie um código que simule a resposta de um usuárioyes
), é melhor criar um código que usa diretamente o código que espera a resposta. IOW, tente aproveitar o caminho do código-fonte que umayes
resposta faria com que fosse invocada. (É só uma sugestão.)