Hi Nicolas On Fri, Feb 5, 2016 at 6:22 PM, Nicolas Goaziou <m...@nicolasgoaziou.fr> wrote:
> Michael Brand <michael.ch.br...@gmail.com> writes: >> + ;; FIXME: Remove this check when most default installations of >> + ;; Emacs have at least Org 9.0. >> + (let ((arglist (help-function-arglist cmd))) >> + (when (or (memq '&optional arglist) >> + (memq '&rest arglist) >> + (/= 2 (length arglist))) >> + (user-error >> + (format >> + "%s%s%S" >> + "Please see Org News for version 9.0 about `org-file-apps', " >> + "this function signature is wrong: " >> + cmd)))) > > I have the feeling there is some over-engineering involved there. Also it should have allowed at least optional arguments (when (or (memq ;; Too complicated to parse regarding that such functions ;; are probably not useful here. '&rest arglist) (/= 2 (length (delete '&optional arglist)))) (user-error for e. g. a simple (add-to-list 'org-file-apps (cons (concat org-player-file-extensions-regexp "$") 'org-player-play-file)) which refers to the existing (defun org-player-play-file (filename &optional pos) > In any case, instead of relying on `help-function-arglist', I suggest to > use something lightweight: > > (condition-case err > (funcall ...) > (wrong-number-of-arguments > (user-error "Please ...")) > (invalid-function > (user-error "Please ..."))) Of course. I didn't know about this possibility, remixed patch attached. Michael
From f1c382cabe5b34f52db22df70d5c25e02de2a18a Mon Sep 17 00:00:00 2001 From: Michael Brand <michael.ch.br...@gmail.com> Date: Fri, 5 Feb 2016 19:42:55 +0100 Subject: [PATCH] `org-file-apps' add migration hint for function signature * lisp/org.el (org-open-file): Add an error when the function signature does not match. --- lisp/org.el | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index d4fb8a6..f6c5f89 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -11323,9 +11323,18 @@ If the file does not exist, an error is thrown." (when (derived-mode-p 'org-mode) (org-reveal))) (search (org-link-search search)))) ((functionp cmd) - (save-match-data - (set-match-data link-match-data) - (funcall cmd file link))) + (condition-case err + (save-match-data + (set-match-data link-match-data) + (funcall cmd file link)) + ;; FIXME: Remove this check when most default installations of + ;; Emacs have at least Org 9.0. + ((wrong-number-of-arguments invalid-function) + (user-error + (concat + "Please see Org News for version 9.0 about `org-file-apps', " + "error: " + (prin1-to-string err)))))) ((consp cmd) ;; FIXME: Remove this check when most default installations of ;; Emacs have at least Org 9.0. @@ -11333,7 +11342,9 @@ If the file does not exist, an error is thrown." ;; `org-link-frame-setup' for an old usage of `org-file-apps' ;; with sexp instead of a function for `cmd'. (user-error - "Please see Org News for version 9.0 about `org-file-apps'")) + (concat "Please see Org News for version 9.0 about `org-file-apps', " + "error: deprecated usage of " + (prin1-to-string cmd)))) (t (funcall (cdr (assq 'file org-link-frame-setup)) file))) (and (derived-mode-p 'org-mode) (eq old-mode 'org-mode) -- 2.1.3.dirty