* Org mode links: Open a PDF file at a given page and highlight a given string @ 2021-03-02 20:07 Rodrigo Morales 2021-03-02 22:36 ` Kyle Meyer ` (3 more replies) 0 siblings, 4 replies; 18+ messages in thread From: Rodrigo Morales @ 2021-03-02 20:07 UTC (permalink / raw) To: emacs-orgmode I want to be able to + create a Org link to specific pages of a PDF. I've managed to accomplish this by setting the following value. #+begin_src emacs-lisp :results silent (setq org-file-apps '(("\\.pdf::\\([0-9]+\\)\\'" . "zathura -P %1 %s"))) #+end_src The following links open the PDF at the given page. [[file:~/Downloads/grub.pdf::10]] [[file:~/Downloads/grub.pdf::20]] [[file:~/Downloads/grub.pdf::30]] + create a Org link to specific pages of a PDF and highlight a given string. #+begin_src emacs-lisp :results silent (setq org-file-apps '(("\\.pdf::\\([0-9]+\\)::\\([^:]+\\)\\'" . "zathura -P %1 -f %2 %s"))) #+end_src The following link must open the PDF at a given page and highlight the given string. However, I'm getting the following error (see the =#+begin_example= block below.) [[file:~/Downloads/grub.pdf::95::do]] #+begin_example Debugger entered--Lisp error: (wrong-type-argument stringp nil) replace-match(nil t t "zathura -P 95 -f %2 /home/username/Downloads/grub....") org-open-file("~/Downloads/grub.pdf" nil nil "95::do") apply(org-open-file "~/Downloads/grub.pdf" nil (nil "95::do")) org-link-open((link (:type "file" :path "~/Downloads/grub.pdf" :format bracket :raw-link "file:~/Downloads/grub.pdf::95::do" :application nil :search-option "95::do" :begin 821 :end 858 :contents-begin nil :contents-end nil :post-blank 0 :parent (paragraph (:begin 821 :end 860 :contents-begin 821 :contents-end 859 :post-blank 1 :post-affiliated 821 :parent nil)))) nil) org-open-at-point(nil) funcall-interactively(org-open-at-point nil) call-interactively(org-open-at-point nil nil) command-execute(org-open-at-point) #+end_example Note that the following accomplishes what I'm looking for #+begin_src bash zathura -P 95 -f do ~/Downloads/grub.pdf #+end_src My question is: How can I get rid of that error so that the PDF is opened at a given page and the string is highlighted? PS: If you want a PDF to test the link presented in this message, you can download the following PDF (564K). It was the smallest PDF in gnu.org I was able to find. #+begin_src bash :dir ~/Downloads :results silent wget 'https://www.gnu.org/software/grub/manual/grub/grub.pdf' #+end_src -- Greetings, Rodrigo Morales. IRC: rdrg109 (freenode) ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2021-03-02 20:07 Org mode links: Open a PDF file at a given page and highlight a given string Rodrigo Morales @ 2021-03-02 22:36 ` Kyle Meyer 2021-03-03 12:37 ` Maxim Nikulin 2021-09-27 16:39 ` Max Nikulin 2021-03-03 2:31 ` Juan Manuel Macías ` (2 subsequent siblings) 3 siblings, 2 replies; 18+ messages in thread From: Kyle Meyer @ 2021-03-02 22:36 UTC (permalink / raw) To: Rodrigo Morales; +Cc: emacs-orgmode Rodrigo Morales writes: [...] > + create a Org link to specific pages of a PDF and highlight a given > string. > > #+begin_src emacs-lisp :results silent > (setq org-file-apps > '(("\\.pdf::\\([0-9]+\\)::\\([^:]+\\)\\'" . "zathura -P %1 -f %2 %s"))) > #+end_src > > The following link must open the PDF at a given page and highlight the > given string. However, I'm getting the following error (see the > =#+begin_example= block below.) > > [[file:~/Downloads/grub.pdf::95::do]] > > #+begin_example > Debugger entered--Lisp error: (wrong-type-argument stringp nil) > replace-match(nil t t "zathura -P 95 -f %2 /home/username/Downloads/grub....") I haven't looked at this closely or tried to trigger the error, but an in-flight patch is touching this area (<https://orgmode.org/list/87mtw8fupl.fsf@kyleam.com>). I've yet to revisit it to address Maxim's helpful feedback, but I hope to soon and will look at this error then too. Thanks for reporting. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2021-03-02 22:36 ` Kyle Meyer @ 2021-03-03 12:37 ` Maxim Nikulin 2021-09-27 16:39 ` Max Nikulin 1 sibling, 0 replies; 18+ messages in thread From: Maxim Nikulin @ 2021-03-03 12:37 UTC (permalink / raw) To: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 1993 bytes --] On 03/03/2021 05:36, Kyle Meyer wrote: > Rodrigo Morales writes: > > [...] >> + create a Org link to specific pages of a PDF and highlight a given >> string. >> >> #+begin_src emacs-lisp :results silent >> (setq org-file-apps >> '(("\\.pdf::\\([0-9]+\\)::\\([^:]+\\)\\'" . "zathura -P %1 -f %2 %s"))) >> #+end_src >> >> The following link must open the PDF at a given page and highlight the >> given string. However, I'm getting the following error (see the >> =#+begin_example= block below.) >> >> [[file:~/Downloads/grub.pdf::95::do]] Correct link should be [[info:grub#true]] (a joke, at least a kind of). Actually I never considered search string for highlighting of particular text, so thank you for the hint. Browsers could generate (mutually incompatible) link to particular rectangle. With xpopple (fork of old xpdf) it is possible to send command to select region. However I think it is better to use logical links instead of page numbers: okular --find do ~/Downloads/grub.pdf'#true' xpdf ~/Downloads/grub.pdf +true Unfortunately firefox replaces "#" to percent-encoded sequence in command line argument and could not find the file. It requires editing in address bar. >> #+begin_example >> Debugger entered--Lisp error: (wrong-type-argument stringp nil) >> replace-match(nil t t "zathura -P 95 -f %2 /home/username/Downloads/grub....") > > I haven't looked at this closely or tried to trigger the error, but an > in-flight patch is touching this area > (<https://orgmode.org/list/87mtw8fupl.fsf@kyleam.com>). I've yet to > revisit it to address Maxim's helpful feedback, but I hope to soon and > will look at this error then too. Kyle, your patch works for such handlers. This case is another argument to replace all substitutions in a single pass. Global state (match data) is the source of the problem. I am attaching informal single-line patch for quick plumbing. Alternative is to use save-match-data around string-match inside the loop. [-- Attachment #2: org-open-file-multi-subst.patch --] [-- Type: text/x-patch, Size: 568 bytes --] diff --git a/lisp/org.el b/lisp/org.el index fd6226702..f45adb308 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -8757,8 +8757,8 @@ If the file does not exist, throw an error." (save-match-data (let ((match-index 1) (number-of-groups (- (/ (length link-match-data) 2) 1))) - (set-match-data link-match-data) (while (<= match-index number-of-groups) + (set-match-data link-match-data) (let ((regex (concat "%" (number-to-string match-index))) (replace-with (match-string match-index dlink))) (while (string-match regex cmd) ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2021-03-02 22:36 ` Kyle Meyer 2021-03-03 12:37 ` Maxim Nikulin @ 2021-09-27 16:39 ` Max Nikulin 1 sibling, 0 replies; 18+ messages in thread From: Max Nikulin @ 2021-09-27 16:39 UTC (permalink / raw) To: orgmode; +Cc: Kyle Meyer On 03/03/2021 05:36, Kyle Meyer wrote: > Rodrigo Morales writes: > > [...] >> + create a Org link to specific pages of a PDF and highlight a given >> string. >> >> #+begin_src emacs-lisp :results silent >> (setq org-file-apps >> '(("\\.pdf::\\([0-9]+\\)::\\([^:]+\\)\\'" . "zathura -P %1 -f %2 %s"))) >> #+end_src >> >> The following link must open the PDF at a given page and highlight the >> given string. However, I'm getting the following error (see the >> =#+begin_example= block below.) >> >> [[file:~/Downloads/grub.pdf::95::do]] >> >> #+begin_example >> Debugger entered--Lisp error: (wrong-type-argument stringp nil) >> replace-match(nil t t "zathura -P 95 -f %2 /home/username/Downloads/grub....") > > I haven't looked at this closely or tried to trigger the error, but an > in-flight patch is touching this area > (<https://orgmode.org/list/87mtw8fupl.fsf@kyleam.com>). I've yet to > revisit it to address Maxim's helpful feedback, but I hope to soon and > will look at this error then too. I suppose, it deserves to be tracked on updates.orgmode.org ("org-open-file & org-file-apps multiple substitution bug") ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2021-03-02 20:07 Org mode links: Open a PDF file at a given page and highlight a given string Rodrigo Morales 2021-03-02 22:36 ` Kyle Meyer @ 2021-03-03 2:31 ` Juan Manuel Macías 2021-03-03 14:51 ` Maxim Nikulin 2022-09-03 13:00 ` Max Nikulin 2022-10-04 6:45 ` Ihor Radchenko 3 siblings, 1 reply; 18+ messages in thread From: Juan Manuel Macías @ 2021-03-03 2:31 UTC (permalink / raw) To: Rodrigo Morales; +Cc: orgmode Hi Rodrigo, Rodrigo Morales <moralesrodrigo1100@gmail.com> writes: > I want to be able to > > + create a Org link to specific pages of a PDF. I've managed to > accomplish this by setting the following value. > [ ... ] > + create a Org link to specific pages of a PDF and highlight a given > string. A possible alternative, which gives you more control over the link, is `org-link-set-parameters'. For example: #+begin_src emacs-lisp (org-link-set-parameters "pdf-pag" :follow (lambda (path) (let ((pag (if (string-match "::\\([1-9]+\\):*:*\\(.*\\)" path) (match-string 1 path) (error "no pages"))) (clean-path (expand-file-name (replace-regexp-in-string "::.+" "" path))) (str (when (string-match "::\\([1-9]+\\)::\\(.+\\)" path) (match-string 2 path)))) (start-process-shell-command "zathura" nil (concat "zathura " clean-path " -P " pag (when str (format " -f '%s' " str))))))) #+end_src And then: #+begin_src org [[pdf-pag:~/Downloads/grub.pdf::95::do]] #+end_src Best regards, Juan Manuel ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2021-03-03 2:31 ` Juan Manuel Macías @ 2021-03-03 14:51 ` Maxim Nikulin 2021-03-03 16:11 ` Juan Manuel Macías 0 siblings, 1 reply; 18+ messages in thread From: Maxim Nikulin @ 2021-03-03 14:51 UTC (permalink / raw) To: emacs-orgmode On 03/03/2021 09:31, Juan Manuel Macías wrote: > (start-process-shell-command "zathura" nil (concat "zathura " > clean-path > " -P " > pag > (when str > (format " -f '%s' " str))))))) Please, do not forget to pass stings coming from user input through shell-quote-argument. There is combine-and-quote-strings function but its docstring tells that it is not safe enough. Ideally shell should be completely avoided in such cases and arguments should be passed as a list directly to exec. https://xkcd.com/327/ ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2021-03-03 14:51 ` Maxim Nikulin @ 2021-03-03 16:11 ` Juan Manuel Macías 2021-03-05 13:02 ` Maxim Nikulin 0 siblings, 1 reply; 18+ messages in thread From: Juan Manuel Macías @ 2021-03-03 16:11 UTC (permalink / raw) To: Maxim Nikulin; +Cc: orgmode Hi Maxim Thanks for your advice, which I appreciate very much. Maxim Nikulin <manikulin@gmail.com> writes: > On 03/03/2021 09:31, Juan Manuel Macías wrote: >> (start-process-shell-command "zathura" nil (concat "zathura " >> clean-path >> " -P " >> pag >> (when str >> (format " -f '%s' " str))))))) > > Please, do not forget to pass stings coming from user input through > shell-quote-argument. There is combine-and-quote-strings function but > its docstring tells that it is not safe enough. Ideally shell should > be completely avoided in such cases and arguments should be passed as > a list directly to exec. https://xkcd.com/327/ So, maybe it would look better like this (`start-process' instead of `start-process-shell-command')?: #+begin_src emacs-lisp (org-link-set-parameters "pdf-pag" :follow (lambda (path) (let ((pag (if (string-match "::\\([1-9]+\\):*:*\\(.*\\)" path) (format "--page=%s" (match-string 1 path)) (error "no pages"))) (clean-path (expand-file-name (replace-regexp-in-string "::.+" "" path))) (str (when (string-match "::\\([1-9]+\\)::\\(.+\\)" path) (format "--find=%s" (match-string 2 path))))) (if str (start-process "zathura" nil "/usr/bin/zathura" clean-path pag str) (start-process "zathura" nil "/usr/bin/zathura" clean-path pag))))) #+end_src Best reagards, Juan Manuel ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2021-03-03 16:11 ` Juan Manuel Macías @ 2021-03-05 13:02 ` Maxim Nikulin 0 siblings, 0 replies; 18+ messages in thread From: Maxim Nikulin @ 2021-03-05 13:02 UTC (permalink / raw) To: emacs-orgmode On 03/03/2021 23:11, Juan Manuel Macías wrote: > Maxim Nikulin writes: >> >> Please, do not forget to pass stings coming from user input through >> shell-quote-argument. > > So, maybe it would look better like this (`start-process' instead of > `start-process-shell-command')?: My intention was just to warn you against of opening a door to shell injections. Personally, as a workaround I would add an org-file-apps entry with a single argument combining page and search string and would write a tiny script that splits such argument and invokes the viewer. I consider it as a better option in the sense of forward compatibility since it allows to avoid custom link types. I expect that the bug will be fixed soon. I still suppose that it is serious limitation that such link format does not support named link targets inside PDF files. Maybe the part before second "::" could be considered as a named target if it does not look like a number. I am unsure concerning search strings containing "::", they may require more accurate regexp or using e.g. percent encoding as in URLs. > #+begin_src emacs-lisp > (org-link-set-parameters > "pdf-pag" > :follow (lambda (path) > (let ((pag (if (string-match "::\\([1-9]+\\):*:*\\(.*\\)" path) > (format "--page=%s" (match-string 1 path)) > (error "no pages"))) > (clean-path (expand-file-name (replace-regexp-in-string "::.+" "" path))) > (str (when (string-match "::\\([1-9]+\\)::\\(.+\\)" path) > (format "--find=%s" (match-string 2 path))))) > (if str > (start-process "zathura" nil "/usr/bin/zathura" > clean-path > pag > str) > (start-process "zathura" nil "/usr/bin/zathura" > clean-path > pag))))) > #+end_src If your are asking my opinion on your function, I think that the variant with start-process is a better one. There is a low level alternative make-process but it requires more code, so it is less convenient. As to the style of lisp code, I am not a proper person to make suggestions. I suspect that your function has a problem with page numbers like 10. I do not like repetition of the regexp and tend to think that minor variations are unintended. On the other hand a variant I could offer is not shorter despite just one regexp and just one call of a match function. #+begin_src elisp (defun wa-pdf-destination-zathura-args (target) (let ((suffix (string-match "::\\(?:\\([0-9]+\\)?\\(?:::\\(.+\\)\\)?\\|\\(.*\\)\\)$" target))) (if (not suffix) (list (expand-file-name target)) (let* ((invalid (match-string 3 target)) (file (cond ((zerop suffix) (error "No file path in '%s'" target)) (invalid (error "Invalid destination within file: '%s'" invalid)) (t (substring target 0 suffix)))) (page (match-string 1 target)) (search (match-string 2 target))) (seq-remove #'null (list (and page "--page") page (and search "--find") search (expand-file-name file))))))) (defun wa-launch-pdf-viewer (target) (let ((viewer "zathura") (command (wa-pdf-destination-zathura-args target)) ;; Do not allocate a pty. Really required only if the application ;; spawns background children and exits (xdg-open, gio open, ;; kde-open5), see Emacs Bug #44824. (process-connection-type nil)) (apply #'start-process viewer "*Messages*" viewer command))) #+end_src #+begin_src elisp :results value list (mapcar #'wa-pdf-destination-zathura-args '( "~/Download/grub.pdf::95::do" "file.pdf::95" "file.pdf::::do" "file.pdf" ;; "::" ;; "::95" ;; "file.pdf::a" ;; "file.pdf::95:do" )) #+end_src ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2021-03-02 20:07 Org mode links: Open a PDF file at a given page and highlight a given string Rodrigo Morales 2021-03-02 22:36 ` Kyle Meyer 2021-03-03 2:31 ` Juan Manuel Macías @ 2022-09-03 13:00 ` Max Nikulin 2022-09-20 11:54 ` Ihor Radchenko 2022-10-04 6:45 ` Ihor Radchenko 3 siblings, 1 reply; 18+ messages in thread From: Max Nikulin @ 2022-09-03 13:00 UTC (permalink / raw) To: emacs-orgmode On 03/03/2021 03:07, Rodrigo Morales wrote: > > #+begin_src emacs-lisp :results silent > (setq org-file-apps > '(("\\.pdf::\\([0-9]+\\)::\\([^:]+\\)\\'" . "zathura -P %1 -f %2 %s"))) > #+end_src I am going to respond to a message from another thread containing discussion of a patch, but I suppose the following considerations are more appropriate in the thread discussing combined specifier for location withing a PDF document. For me it is more convenient to test ideas using okular, I hope, changing code for zathura or other PDF viewer is trivial. Ihor Radchenko. Re: [PATCH] org.el: Fix percent substitutions in `org-open-file' Fri, 02 Sep 2022 20:08:17 +0800. https://list.orgmode.org/87tu5qm11q.fsf@localhost >> + ;; Page and search string, >> + ;; e.g. <file:///usr/share/doc/bash/bashref.pdf::34::order of redirections>. >> + (\"\\\\.pdf::\\\\([0-9]+\\\\)::\\\\(.+\\\\)\\\\\\='\" >> + . \"okular --page %1 --find %2 %s\") >> + ;; Internal anchor and search string, >> + ;; e.g. <file:///usr/share/doc/bash/bashref.pdf::Redirections::allocate a file>. >> + (\"\\\\.pdf::\\\\(.+\\\\)::\\\\(.+\\\\)\\\\\\='\" >> + . \"okular --find %2 file://%s\\\\\\\\#%1\") >> + ;; Page number, e.g. <file:///usr/share/doc/bash/bashref.pdf::34>. >> + (\"\\\\.pdf::\\\\([0-9]+\\\\)\\\\\\='\" . \"okular --page %1 %s\") >> + ;; Internal reference, e.g. <file:///usr/share/doc/bash/bashref.pdf::Redirections>. >> + (\"\\\\.pdf::\\\\(.+\\\\)\\\\\\='\" . \"okular file://%s\\\\\\\\#%1\") >> + ;; No location within the file, optionally followed by \"::\", >> + ;; e.g. <file:///usr/share/doc/bash/bashref.pdf>. >> + (\"\\\\.pdf\\\\(?:::\\\\)?\\\\\\='\" . \"okular %s\") > > This is a nice set of examples, but it probably does not belong to this > docstring. I'd rather see this in `org-file-apps' docstring or even in > the manual. It is a part of docstring, so number of slashes is doubled. First of all, I overlooked possibility to distinguish text search "file:text.pdf::patttern" and cross reference target within the document "file:text.pdf::#anchor". Secondly, I forgot that PDF viewers may support compressed files. Currently I believe that instead of injecting up to 6 entries into `org-file-apps' for various combinations of page, anchor, and search pattern, it is better to add single record with function handler. Notice that the approach presented above is not affected by the bug with multiple regexp group. Its additional advantage is that shell is not involved, so peculiar file names can not cause execution of some code when quoting and escaping are messed up. I think a set of functions for popular PDF viewers (evince, zathura, okular, xpdf, xpopple, firefox, chromium & Co., etc.) should be defined in some package, but I am in doubts if it suitable for Org core. Proof of concept implementation. Configuration: (add-to-list 'org-file-apps `(("\\.pdf\\(?:\\.gz\\|\\.bz2\\|\\.xz\\)?\\(?:::.*\\)?\\'" . ,#'my-open-file-pdf-okular))) Helper functions: (defun my--parse-file-link-search (suffix-re link) "Parse PDF file LINK for page number, cross reference anchor, search string. Return nil if it is not a link to some PDF file. Any element may be nil." (let ((case-fold-search t)) ; Handle files having .PDF suffix as well (and (string-match (concat suffix-re (rx (optional "::" (or (group (+ digit)) (group "#" (+ (not (any ?:)))) (optional "#"))) (optional "::" (optional (group (+ anything)))) string-end)) link) (mapcar (lambda (i) (match-string i link)) '(1 2 3))))) (defun my-launch-viewer (command arguments) "Launch external application COMMAND with ARGUMENTS. The function allows to avoid intermediate shell and so escaping of arguments that otherwise might be considered as shell specialls and run arbitrary commands. The function launches viewer process using shoot ant forget method like `browse-url-xdg-open', so the application may run even after quit from Emacs." (apply #'call-process command nil 0 nil args)) (defun my-open-file-pdf-okular (file link) "PDF files handler for usage as a command in `org-file-apps' alist. Customize `org-file-apps' to add the following entry: \\='(\"\\\\.pdf\\\\(?:\\\\.gz\\\\|\\\\.bz2\\\\|\\\\.xz\\\\)?\\\\(?:::.*\\\\)?\\\\\\='\" . #\\='my-open-file-pdf-okular) Open FILE at the location specified by LINK (page, internal reference, search string). Supported link search options (side note: in the particular case of bash manual <info:bash#Redirections> link may be used instead): - Page number <file:///usr/share/doc/bash/bashref.pdf::34>. - Page number and search text <file:///usr/share/doc/bash/bashref.pdf::34::order of redirections>. - Cross reference anchor <file:///usr/share/doc/bash/bashref.pdf::#Redirections>. - Cross reference anchor and search text <file:///usr/share/doc/bash/bashref.pdf::#Redirections::allocate a file>. - Search text <file:///usr/share/doc/bash/bashref.pdf::allocate a file>. Optionally the FILE may be compressed by gzip, bzip2, or xz." (pcase-let* ((pdf-re (rx ".pdf" ;; .Z and .zip are not supported by okular (optional (or ".gz" ".bz2" ".xz")))) (`(,page ,ref ,find) (or (my--parse-file-link-search pdf-re link) (error "Not a PDF file link: %S" link))) (args (list "--" (if (org-string-nw-p ref) (concat file ref) file)))) ;; Protect against file names starting from a dash that might be ;; considered as an option despite `org-open-file' passes absolute ;; file name and it is not strictly necessary. (when find (push find args) (push "--find" args)) (when page (push page args) (push "--page" args)) (my-launch-viewer "okular" args))) And some tests (ert-deftest test-my/parse-file-link-search () (let ((pdf-re (rx ".pdf" ;; .Z and .zip are not supported by okular (optional (or ".gz" ".bz2" ".xz"))))) (should-not (my--parse-file-link-search pdf-re "/no-match.doc")) (should-not (my--parse-file-link-search pdf-re "/no-match.doc::#ref")) (should (equal '(nil nil nil) (my--parse-file-link-search pdf-re "/just-file.pdf"))) (should (equal '(nil nil nil) (my--parse-file-link-search pdf-re "/just-file-upper-case.PDF"))) (should (equal '("21" nil nil) (my--parse-file-link-search pdf-re "/page.pdf::21"))) (should (equal '(nil "#ref" nil) (my--parse-file-link-search pdf-re "/anchor.pdf::#ref"))) (should (equal '(nil nil "some text") (my--parse-file-link-search pdf-re "/search-string.pdf::some text"))) (should (equal '(nil nil "in gzipped file") (my--parse-file-link-search pdf-re "/compressed-search-string.pdf.GZ::in gzipped file"))) (should (equal '("32" nil "page text") (my--parse-file-link-search pdf-re "/page-search.pdf::32::page text"))) (should (equal '(nil "#ref" "anchor text") (my--parse-file-link-search pdf-re "/anchor-search.pdf::#ref::anchor text"))) (should (equal '(nil nil "::") (my--parse-file-link-search pdf-re "/search-quad.pdf::::::"))) (should (equal '(nil nil nil) (my--parse-file-link-search pdf-re "/nothing-1.pdf::"))) (should (equal '(nil nil nil) (my--parse-file-link-search pdf-re "/nothing-2.PDF::::"))) (should (equal '(nil nil nil) (my--parse-file-link-search pdf-re "/empty-anchor-1.pdf::#"))) (should (equal '(nil nil nil) (my--parse-file-link-search pdf-re "/empty-anchor-2.pdf::#::"))) (should (equal '(nil nil "empty anchor text") (my--parse-file-link-search pdf-re "/empty-anchor-1.pdf::#::empty anchor text"))))) ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2022-09-03 13:00 ` Max Nikulin @ 2022-09-20 11:54 ` Ihor Radchenko 2022-09-20 17:03 ` Max Nikulin 0 siblings, 1 reply; 18+ messages in thread From: Ihor Radchenko @ 2022-09-20 11:54 UTC (permalink / raw) To: Max Nikulin; +Cc: emacs-orgmode Max Nikulin <manikulin@gmail.com> writes: > Currently I believe that instead of injecting up to 6 entries into > `org-file-apps' for various combinations of page, anchor, and search > pattern, it is better to add single record with function handler. Notice > that the approach presented above is not affected by the bug with > multiple regexp group. Its additional advantage is that shell is not > involved, so peculiar file names can not cause execution of some code > when quoting and escaping are messed up. > > I think a set of functions for popular PDF viewers (evince, zathura, > okular, xpdf, xpopple, firefox, chromium & Co., etc.) should be defined > in some package, but I am in doubts if it suitable for Org core. > > Proof of concept implementation. Thanks for taking time to implement this proof of concept! I think that it is a very good idea for Org core to support search terms in file links that are handled by Free Software. Moreover, I think that we should, by default, auto-detect and use Free Software to open file links, when such software is installed on user machine (unless the user explicitly instruct otherwise). I see Free Software support as dedicated files like ol-evince, ol-okular, etc. The file functionality and common function may probably be factored out into ol-file library. -- Ihor Radchenko, Org mode contributor, Learn more about Org mode at https://orgmode.org/. Support Org development at https://liberapay.com/org-mode, or support my work at https://liberapay.com/yantar92 ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2022-09-20 11:54 ` Ihor Radchenko @ 2022-09-20 17:03 ` Max Nikulin 2022-09-21 8:17 ` Ihor Radchenko 2022-09-21 8:18 ` Ihor Radchenko 0 siblings, 2 replies; 18+ messages in thread From: Max Nikulin @ 2022-09-20 17:03 UTC (permalink / raw) To: emacs-orgmode On 20/09/2022 18:54, Ihor Radchenko wrote: > Max Nikulin writes: > >> Currently I believe that instead of injecting up to 6 entries into >> `org-file-apps' for various combinations of page, anchor, and search >> pattern, it is better to add single record with function handler. Notice >> that the approach presented above is not affected by the bug with >> multiple regexp group. Its additional advantage is that shell is not >> involved, so peculiar file names can not cause execution of some code >> when quoting and escaping are messed up. >> >> I think a set of functions for popular PDF viewers (evince, zathura, >> okular, xpdf, xpopple, firefox, chromium & Co., etc.) should be defined >> in some package, but I am in doubts if it suitable for Org core. >> >> Proof of concept implementation. > > Thanks for taking time to implement this proof of concept! I have realized that it misses customization of application binary (exact name or full path to non-standard location). > I think that it is a very good idea for Org core to support search terms > in file links that are handled by Free Software. Maybe I misunderstand something, but your stress on Free Software here surprised me. I did not mention explicitly any proprietary application such as Adobe Reader. On the other hand support of Chromium (that is free) unavoidably assumes Google Chrome and likely MS Edge with other derived products with same customization as chromium vs. chromium-browser command name discrepancy in Linux distros. > Moreover, I think that we should, by default, auto-detect and use Free > Software to open file links, when such software is installed on user > machine (unless the user explicitly instruct otherwise). Could you, please, elaborate? E.g. for PDF file default is docview mode. Unless a user has an override in `org-file-apps', likely it should be used. Perhaps system-wide handler may be considered as a candidate, but on linux it means XDG MIME handlers that is not supported by Emacs, so only mailcap remains. Both XDG database and mailcap have no notion of location within the file to open. > I see Free Software support as dedicated files like ol-evince, > ol-okular, etc. The file functionality and common function may probably > be factored out into ol-file library. I am considering a single package, something like org-pdfviewer, that has definitions for all popular viewers: evince, okular, firefox, chromium, etc. I believed that user should explicitly configure preferred viewer by either adding an entry with supplied function to `org-file-apps' or this package has its own defcustoms and the entry injected to some variable as you suggested in Ihor Radchenko. Re: [PATCH v2] org.el: Fix percent substitutions in `org-open-file' Mon, 05 Sep 2022 13:46:41 +0800. https://list.orgmode.org/875yi2xtj2.fsf@localhost The point of defcustoms in the package instead of (or in addition to) `org-file-apps' is that evince and okular support more formats than PDF. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2022-09-20 17:03 ` Max Nikulin @ 2022-09-21 8:17 ` Ihor Radchenko 2022-09-21 8:18 ` Ihor Radchenko 1 sibling, 0 replies; 18+ messages in thread From: Ihor Radchenko @ 2022-09-21 8:17 UTC (permalink / raw) To: Max Nikulin; +Cc: emacs-orgmode Max Nikulin <manikulin@gmail.com> writes: >> I think that it is a very good idea for Org core to support search terms >> in file links that are handled by Free Software. > > Maybe I misunderstand something, but your stress on Free Software here > surprised me. I did not mention explicitly any proprietary application > such as Adobe Reader. On the other hand support of Chromium (that is > free) unavoidably assumes Google Chrome and likely MS Edge with other > derived products with same customization as chromium vs. > chromium-browser command name discrepancy in Linux distros. I was referring to GPL-compatible software. If we have better integration with Libre/Free Software, it is suitable for Org core. IMHO. >> Moreover, I think that we should, by default, auto-detect and use Free >> Software to open file links, when such software is installed on user >> machine (unless the user explicitly instruct otherwise). > > Could you, please, elaborate? E.g. for PDF file default is docview mode. > Unless a user has an override in `org-file-apps', likely it should be > used. Perhaps system-wide handler may be considered as a candidate, but > on linux it means XDG MIME handlers that is not supported by Emacs, so > only mailcap remains. Both XDG database and mailcap have no notion of > location within the file to open. I am referring to cdr of the org-file-apps entries. docview will correspond to `emacs' command. XDG will correspond to `system'. And we have `default', which could detect Libre Software, if installed. >> I see Free Software support as dedicated files like ol-evince, >> ol-okular, etc. The file functionality and common function may probably >> be factored out into ol-file library. > > I am considering a single package, something like org-pdfviewer, that > has definitions for all popular viewers: evince, okular, firefox, > chromium, etc. I believed that user should explicitly configure > preferred viewer by either adding an entry with supplied function to > `org-file-apps' or this package has its own defcustoms and the entry > injected to some variable as you suggested in > Ihor Radchenko. Re: [PATCH v2] org.el: Fix percent substitutions in > `org-open-file' Mon, 05 Sep 2022 13:46:41 +0800. > https://list.orgmode.org/875yi2xtj2.fsf@localhost > > The point of defcustoms in the package instead of (or in addition to) > `org-file-apps' is that evince and okular support more formats than PDF. I understand your idea. What I am suggesting is to implement support for a subset of popular viewers (the Libre ones) and add it to Org core. Support for non-Libre viewers could be added ad third-party packages based on the Org core implementation. The default viewer may be customized by user according to, say, org-file-apps-default-pdf-viewer defaulting to 'auto (detect). This customization will only take effect when the PDF file entry in org-file-apps sets the command to `default'. Hope I made my idea more clear. -- Ihor Radchenko, Org mode contributor, Learn more about Org mode at https://orgmode.org/. Support Org development at https://liberapay.com/org-mode, or support my work at https://liberapay.com/yantar92 ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2022-09-20 17:03 ` Max Nikulin 2022-09-21 8:17 ` Ihor Radchenko @ 2022-09-21 8:18 ` Ihor Radchenko 2023-01-25 11:46 ` AW 1 sibling, 1 reply; 18+ messages in thread From: Ihor Radchenko @ 2022-09-21 8:18 UTC (permalink / raw) To: Max Nikulin; +Cc: emacs-orgmode Max Nikulin <manikulin@gmail.com> writes: >> I think that it is a very good idea for Org core to support search terms >> in file links that are handled by Free Software. > > Maybe I misunderstand something, but your stress on Free Software here > surprised me. I did not mention explicitly any proprietary application > such as Adobe Reader. On the other hand support of Chromium (that is > free) unavoidably assumes Google Chrome and likely MS Edge with other > derived products with same customization as chromium vs. > chromium-browser command name discrepancy in Linux distros. I was referring to GPL-compatible software. If we have better integration with Libre/Free Software, it is suitable for Org core. IMHO. >> Moreover, I think that we should, by default, auto-detect and use Free >> Software to open file links, when such software is installed on user >> machine (unless the user explicitly instruct otherwise). > > Could you, please, elaborate? E.g. for PDF file default is docview mode. > Unless a user has an override in `org-file-apps', likely it should be > used. Perhaps system-wide handler may be considered as a candidate, but > on linux it means XDG MIME handlers that is not supported by Emacs, so > only mailcap remains. Both XDG database and mailcap have no notion of > location within the file to open. I am referring to cdr of the org-file-apps entries. docview will correspond to `emacs' command. XDG will correspond to `system'. And we have `default', which could detect Libre Software, if installed. >> I see Free Software support as dedicated files like ol-evince, >> ol-okular, etc. The file functionality and common function may probably >> be factored out into ol-file library. > > I am considering a single package, something like org-pdfviewer, that > has definitions for all popular viewers: evince, okular, firefox, > chromium, etc. I believed that user should explicitly configure > preferred viewer by either adding an entry with supplied function to > `org-file-apps' or this package has its own defcustoms and the entry > injected to some variable as you suggested in > Ihor Radchenko. Re: [PATCH v2] org.el: Fix percent substitutions in > `org-open-file' Mon, 05 Sep 2022 13:46:41 +0800. > https://list.orgmode.org/875yi2xtj2.fsf@localhost > > The point of defcustoms in the package instead of (or in addition to) > `org-file-apps' is that evince and okular support more formats than PDF. I understand your idea. What I am suggesting is to implement support for a subset of popular viewers (the Libre ones) and add it to Org core. Support for non-Libre viewers could be added ad third-party packages based on the Org core implementation. The default viewer may be customized by user according to, say, org-file-apps-default-pdf-viewer defaulting to 'auto (detect). This customization will only take effect when the PDF file entry in org-file-apps sets the command to `default'. Hope I made my idea more clear. -- Ihor Radchenko, Org mode contributor, Learn more about Org mode at https://orgmode.org/. Support Org development at https://liberapay.com/org-mode, or support my work at https://liberapay.com/yantar92 ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2022-09-21 8:18 ` Ihor Radchenko @ 2023-01-25 11:46 ` AW 2023-01-25 11:55 ` Ihor Radchenko ` (2 more replies) 0 siblings, 3 replies; 18+ messages in thread From: AW @ 2023-01-25 11:46 UTC (permalink / raw) To: emacs-orgmode Am Mittwoch, 21. September 2022, 10:18:41 CET schrieb Ihor Radchenko: > Max Nikulin <manikulin@gmail.com> writes: > >> I think that it is a very good idea for Org core to support search terms > >> in file links that are handled by Free Software. > > > > Maybe I misunderstand something, but your stress on Free Software here > > surprised me. I did not mention explicitly any proprietary application > > such as Adobe Reader. On the other hand support of Chromium (that is > > free) unavoidably assumes Google Chrome and likely MS Edge with other > > derived products with same customization as chromium vs. > > chromium-browser command name discrepancy in Linux distros. > > I was referring to GPL-compatible software. > If we have better integration with Libre/Free Software, it is suitable > for Org core. IMHO. [...] > > I am considering a single package, something like org-pdfviewer, that > > has definitions for all popular viewers: evince, okular, firefox, > > chromium, etc. I believed that user should explicitly configure > > preferred viewer by either adding an entry with supplied function to > > `org-file-apps' or this package has its own defcustoms and the entry > > injected to some variable as you suggested in > > Ihor Radchenko. Re: [PATCH v2] org.el: Fix percent substitutions in > > `org-open-file' Mon, 05 Sep 2022 13:46:41 +0800. > > https://list.orgmode.org/875yi2xtj2.fsf@localhost > > > > The point of defcustoms in the package instead of (or in addition to) > > `org-file-apps' is that evince and okular support more formats than PDF. > > I understand your idea. What I am suggesting is to implement support for > a subset of popular viewers (the Libre ones) and add it to Org core. > Support for non-Libre viewers could be added ad third-party packages > based on the Org core implementation. > Has this been done? I'm struggeling (again), how to link to a certain page of a PDF, being opened in okular. ./link/xyz.pdf::123 does not open the pdf at p. 123 ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2023-01-25 11:46 ` AW @ 2023-01-25 11:55 ` Ihor Radchenko 2023-01-25 12:35 ` Max Nikulin 2023-01-25 14:33 ` Jean Louis 2 siblings, 0 replies; 18+ messages in thread From: Ihor Radchenko @ 2023-01-25 11:55 UTC (permalink / raw) To: AW; +Cc: emacs-orgmode AW <alexander.willand@t-online.de> writes: >> I understand your idea. What I am suggesting is to implement support for >> a subset of popular viewers (the Libre ones) and add it to Org core. >> Support for non-Libre viewers could be added ad third-party packages >> based on the Org core implementation. >> > > Has this been done? I'm struggeling (again), how to link to a certain page of > a PDF, being opened in okular. > > ./link/xyz.pdf::123 does not open the pdf at p. 123 Patches welcome :) -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2023-01-25 11:46 ` AW 2023-01-25 11:55 ` Ihor Radchenko @ 2023-01-25 12:35 ` Max Nikulin 2023-01-25 14:33 ` Jean Louis 2 siblings, 0 replies; 18+ messages in thread From: Max Nikulin @ 2023-01-25 12:35 UTC (permalink / raw) To: AW, emacs-orgmode On 25/01/2023 18:46, AW wrote: > Has this been done? I'm struggeling (again), how to link to a certain page of > a PDF, being opened in okular. > > ./link/xyz.pdf::123 does not open the pdf at p. 123 It is still at the stage of proof of concept. Currently you need to adjust your init.el, see Max Nikulin. Sat, 3 Sep 2022 20:00:47 +0700. https://list.orgmode.org/tevj61$17d8$1@ciao.gmane.io and the `org-file-apps' docstring. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2023-01-25 11:46 ` AW 2023-01-25 11:55 ` Ihor Radchenko 2023-01-25 12:35 ` Max Nikulin @ 2023-01-25 14:33 ` Jean Louis 2 siblings, 0 replies; 18+ messages in thread From: Jean Louis @ 2023-01-25 14:33 UTC (permalink / raw) To: AW; +Cc: emacs-orgmode * AW <alexander.willand@t-online.de> [2023-01-25 14:48]: > Has this been done? I'm struggeling (again), how to link to a certain page of > a PDF, being opened in okular. > > ./link/xyz.pdf::123 does not open the pdf at p. 123 Simply do elisp: links with the below function: [[elisp:(rcd-okular "/home/user/my-file" 2 "small percentage")][small percentage]] (defun rcd-okular (file &optional page query-string) "Open `okular' on PDF FILE. PAGE is optional page number QUERY-STRING will be eventually found highlighted." (let* ((okular (executable-find "okular")) (args (list file)) (args (if page (append (list "-p" (format "%s" page)) args) args)) (args (if query-string (append (list "--find" query-string) args) args)) (name "*Okular*") (buffer (generate-new-buffer-name name))) (cond (okular (apply #'start-process name buffer okular args)) (t (user-error "Program `okular' not found"))))) -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Org mode links: Open a PDF file at a given page and highlight a given string 2021-03-02 20:07 Org mode links: Open a PDF file at a given page and highlight a given string Rodrigo Morales ` (2 preceding siblings ...) 2022-09-03 13:00 ` Max Nikulin @ 2022-10-04 6:45 ` Ihor Radchenko 3 siblings, 0 replies; 18+ messages in thread From: Ihor Radchenko @ 2022-10-04 6:45 UTC (permalink / raw) To: Rodrigo Morales; +Cc: emacs-orgmode Rodrigo Morales <moralesrodrigo1100@gmail.com> writes: > Debugger entered--Lisp error: (wrong-type-argument stringp nil) I can no longer reproduce on the latest main. Closing the bug report. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> Fixed. ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2023-01-25 14:37 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-03-02 20:07 Org mode links: Open a PDF file at a given page and highlight a given string Rodrigo Morales 2021-03-02 22:36 ` Kyle Meyer 2021-03-03 12:37 ` Maxim Nikulin 2021-09-27 16:39 ` Max Nikulin 2021-03-03 2:31 ` Juan Manuel Macías 2021-03-03 14:51 ` Maxim Nikulin 2021-03-03 16:11 ` Juan Manuel Macías 2021-03-05 13:02 ` Maxim Nikulin 2022-09-03 13:00 ` Max Nikulin 2022-09-20 11:54 ` Ihor Radchenko 2022-09-20 17:03 ` Max Nikulin 2022-09-21 8:17 ` Ihor Radchenko 2022-09-21 8:18 ` Ihor Radchenko 2023-01-25 11:46 ` AW 2023-01-25 11:55 ` Ihor Radchenko 2023-01-25 12:35 ` Max Nikulin 2023-01-25 14:33 ` Jean Louis 2022-10-04 6:45 ` Ihor Radchenko
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).