From 6deb088a5c855bd94ef2b667338821e2216a0136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6cker?= Date: Sat, 10 Apr 2010 12:22:55 +0200 Subject: [PATCH] org-open-file: decide whether to match against filename or whole link based on wether the regexp makes use of grouping --- lisp/ChangeLog | 8 +++++++ lisp/org.el | 61 +++++++++++++++++--------------------------------- 2 files changed, 28 insertions(+), 41 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f2b497489..de18aedaf 100755 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2010-04-10 Jan Böcker + + * org.el (org-file-apps-entry-uses-grouping-p): new function. + (org-file-apps-ex): remove variable. + (org-open-file): Integrate org-file-apps-ex functionality back + into org-file-apps, and decide whether to match a regexp against + the link or the filename using org-file-apps-entry-uses-grouping-p. + 2010-04-09 Jan Böcker * org.el (org-file-apps-ex): new variable. diff --git a/lisp/org.el b/lisp/org.el index b6d156c11..671037004 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -1520,40 +1520,6 @@ For more examples, see the system specific constants -(defcustom org-file-apps-ex - '() - "This variable is like org-file-apps, except that the regular -expressions are matched against the whole link, and you can use -subexpressions to capture parts of the matched link to use as -command line arguments or in a custom lisp form. - -In a command string to be executed, access the subexpression -matches with %1, %2, etc. In a custom lisp form, you can access -them with (match-string n link). - -Example: -To allow linking to page 5 in a PDF using the following syntax: - -file:document.pdf::5 - -use the following entry: - -Regular Expression: \.pdf::\([0-9]+\)\' -Command: evince %s -p %1 - -The first (and only) subexpression captures the page number, -which is passed to evince as the -p argument." - :group 'org-link-follow - :type '(repeat - (cons (choice :value "" - (string :tag "Regular Expression")) - (choice :value "" - (const :tag "Visit with Emacs" emacs) - (string :tag "Command") - (sexp :tag "Lisp form"))))) - - - (defgroup org-refile nil "Options concerning refiling entries in Org-mode." :tag "Org Refile" @@ -9159,14 +9125,17 @@ With optional prefix argument IN-EMACS, Emacs will visit the file. With a double C-c C-u prefix arg, Org tries to avoid opening in Emacs and to use an external application to visit the file. -Optional LINE specifies a line to go to, optional SEARCH a string to -search for. If LINE or SEARCH is given, the file will be -opened in Emacs, unless one of the entries in org-file-apps-ex matches. +Optional LINE specifies a line to go to, optional SEARCH a string +to search for. If LINE or SEARCH is given, the file will be +opened in Emacs, unless an entry from org-file-apps that makes +use of groups in a regexp matches. If the file does not exist, an error is thrown." (let* ((file (if (equal path "") buffer-file-name (substitute-in-file-name (expand-file-name path)))) - (apps (append org-file-apps (org-default-apps))) + (file-apps (append org-file-apps (org-default-apps))) + (apps (remove-if 'org-file-apps-entry-uses-grouping-p file-apps)) + (apps-dlink (remove-if-not 'org-file-apps-entry-uses-grouping-p file-apps)) (remp (and (assq 'remote apps) (org-file-remote-p file))) (dirp (if remp nil (file-directory-p file))) (file (if (and dirp org-open-directory-means-index-dot-org) @@ -9198,15 +9167,15 @@ If the file does not exist, an error is thrown." (t (setq cmd (or (and remp (cdr (assoc 'remote apps))) (and dirp (cdr (assoc 'directory apps))) - ; first, try matching against org-file-apps-ex + ; first, try matching against apps-dlink ; if we get a match here, store the match data for later - (let ((match (assoc-default dlink org-file-apps-ex + (let ((match (assoc-default dlink apps-dlink 'string-match))) (if match (progn (setq link-match-data (match-data)) match) (progn (setq in-emacs (or in-emacs line search)) - nil))) ; if we have no match in org-file-apps-ex, + nil))) ; if we have no match in apps-dlink, ; always open the file in emacs if line or search ; is given (for backwards compatibility) (assoc-default dfile (org-apps-regexp-alist apps a-m-a-p) @@ -9274,6 +9243,16 @@ If the file does not exist, an error is thrown." (not (equal old-pos (point)))) (org-mark-ring-push old-pos old-buffer)))) +(defun org-file-apps-entry-uses-grouping-p (entry) + "This function returns non-nil if `entry' uses a regular + expression that has subexpressions, and which org-open-file + should therefore match against the whole link instead of the + filename." + (let ((selector (car entry))) + (if (stringp selector) + (> (regexp-opt-depth selector) 0) + nil))) + (defun org-default-apps () "Return the default applications for this operating system." (cond