[FR] Expose index of the current document through dbus_interface.c
Expose table of contents through dbus
By calling the functions defined in dbus-interface.c, I have been able to write Elisp functions (please see below) in order to be able to reuse Zathura instances when opening Org Mode links of the form [[file:<<filename>>#<<page number>>
(i.e. the same Zathura instance will be used if it is already opening the desired document.)
(defun my/dbus-zathura-use-instance-or-open-new (file link)
"Launch zathura to open FILE or Reuse a running instance.
LINK is provided by Org Mode when this function has been
specified in `org-file-apps'. This function is intended to be
used in `org-file-apps' and shouldn't be called on its own."
(let* ((process-alist (proced-process-attributes))
(pids (mapcar 'car (proced-filter process-alist '((comm . "zathura")))))
(pid
(catch 'found
(cl-loop for pid in pids
when (equal
(dbus-get-property
:session
(concat "org.pwmt.zathura.PID-" (number-to-string pid))
"/org/pwmt/zathura"
"org.pwmt.zathura"
"filename")
file)
do (throw 'found pid))))
(page-number
(or
(progn
;; FIXME: According to the docstring of org-file-apps, we
;; can access capture groups using (match-string n
;; link). However, when I tried it, the capture groups
;; didn't have the entire content. For this reason, I'm
;; running string-match with the same regex that I used
;; in org-file-apps, but (match-string n link) should
;; work as specified in the Org Mode documentation.
(string-match "\\.\\(pdf\\|djvu\\)::\\([0-9]+\\)\\'" link)
(match-string 2 link))
"1")))
(if pid
;; Jump to that page in the existing instance
(dbus-call-method
:session
(concat "org.pwmt.zathura.PID-" (number-to-string pid))
"/org/pwmt/zathura"
"org.pwmt.zathura"
"GotoPage"
(1- (string-to-number page-number)))
;; Open a new instance
(make-process
:name "zathura"
:buffer nil
:command `("zathura" "--page" ,page-number ,file)))))
(setq org-file-apps
'((auto-mode . emacs)
(directory . emacs)
("\\.png\\'" . "mpv %s")
("\\.\\(pdf\\|djvu\\)" . my/dbus-zathura-use-instance-or-open-new)
("\\.\\(pdf\\|djvu\\)::\\([0-9]+\\)\\'" . my/dbus-zathura-use-instance-or-open-new)))
Now, I would like to create a function for Emacs which prompts for an item in the table of contents of the document and jumps to that specific page. Currently, dbus-interface.c expose the page number and the filename and it provides an interface for jumping to an specific page (interface which I used in my Elisp function shown above). However, the table of contents from the current document is not exposed. Therefore, I propose that the index of the document is exposed in some way.
This feature will not only benefit Emacs users but also users of any completion framework (e.g. rofi, dmenu, fzf, vim, etc), since such specialized completion frameworks have more features available (e.g. regex search, movement with operators, fuzzy finding) which, I believe, might require significant effort to incorporate in the zathura index viewer.