branch: externals/auctex commit cef38f9946042b8ce26cf9a4deea0e5c54c35f06 Author: Tassilo Horn <t...@gnu.org> Commit: Tassilo Horn <t...@gnu.org>
Handle TeX-region in backward search with both PDF Tools and Evince * tex.el (TeX-source-correlate-handle-TeX-region): New function. (TeX-source-correlate-sync-source): Use it. (TeX-PDF-mode): Set `pdf-sync-correlate-tex-refine-function' to `TeX-source-correlate-sync-source'. --- ChangeLog | 7 ++++ tex.el | 110 +++++++++++++++++++++++++++++++----------------------------- 2 files changed, 64 insertions(+), 53 deletions(-) diff --git a/ChangeLog b/ChangeLog index cc381f2..c641f53 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2015-02-06 Tassilo Horn <t...@gnu.org> + + * tex.el (TeX-source-correlate-handle-TeX-region): New function. + (TeX-source-correlate-sync-source): Use it. + (TeX-PDF-mode): Set `pdf-sync-correlate-tex-refine-function' to + `TeX-source-correlate-sync-source'. + 2015-02-05 Tassilo Horn <t...@gnu.org> * tex.el (TeX-pdf-tools-sync-view): New function to use PDF Tools diff --git a/tex.el b/tex.el index 3aace79..2a00d5b 100644 --- a/tex.el +++ b/tex.el @@ -1096,8 +1096,6 @@ search are checked, too." (cdr (caar (cdr elem))))) spec)))))))) -(defvar url-unreserved-chars) - (defun TeX-pdf-tools-sync-view () "Focus the focused page/paragraph in `pdf-view-mode'. Used by default for the PDF Tools viewer entry in @@ -1112,6 +1110,8 @@ default for the PDF Tools viewer entry in (pdf-sync-display-pdf) (pop-to-buffer doc)))) +(defvar url-unreserved-chars) + (defun TeX-evince-sync-view () "Focus the focused page/paragraph in Evince with the position of point in emacs by using Evince's DBUS API. Used by default @@ -1316,8 +1316,8 @@ are evaluated positively is chosen." (mapc (lambda (spec) (add-to-list 'list `(const ,(car spec)))) - (append TeX-view-program-list - TeX-view-program-list-builtin)) + (append TeX-view-program-list + TeX-view-program-list-builtin)) (sort list (lambda (a b) (string< (downcase (cadr a)) @@ -1616,6 +1616,25 @@ If this is nil, an empty string will be returned." "Keymap for `TeX-source-correlate-mode'. You could use this for unusual mouse bindings.") +(defun TeX-source-correlate-handle-TeX-region (file line col &rest more) + "Translate backward search info with respect to `TeX-region'. +That is, if FILE is `TeX-region', update FILE to the real tex +file and LINE to (+ LINE offset-of-region). Else, return the +list of arguments unchanged." + (if (string-equal TeX-region (file-name-base file)) + (with-current-buffer (or (find-buffer-visiting file) + (find-file-noselect file)) + (goto-char 0) + (if (re-search-forward "!offset(\\([[:digit:]]+\\))" nil t) + (let ((offset (string-to-int (match-string-no-properties 1)))) + (if TeX-region-orig-buffer + (apply #'list + (expand-file-name (buffer-file-name TeX-region-orig-buffer)) + (+ line offset) col more) + (apply #'list file line col more))) + (apply #'list file line col more))) + (apply #'list file line col more))) + (defun TeX-source-correlate-sync-source (file linecol &rest ignored) "Show TeX FILE with point at LINECOL. This function is called when emacs receives a SyncSource signal @@ -1625,55 +1644,36 @@ or newer." ;; FILE may be given as relative path to the TeX-master root document or as ;; absolute file:// URL. In the former case, the tex file has to be already ;; opened. - (let* ((line (car linecol)) - (col (cadr linecol)) - (region (string= TeX-region (file-name-sans-extension - (file-name-nondirectory file)))) - (region-search-string nil) - (buf (let ((f (condition-case nil - (progn - (require 'url-parse) - (require 'url-util) - (url-unhex-string (aref (url-generic-parse-url file) 6))) - ;; For Emacs 21 compatibility, which doesn't have the - ;; url package. - (file-error (replace-regexp-in-string "^file://" "" file))))) - (cond - ;; Copy the text referenced by syntex relative in the region - ;; file so that we can search it in the original file. - (region (let ((region-buf (get-buffer (file-name-nondirectory file)))) - (when region-buf - (with-current-buffer region-buf - (goto-char (point-min)) - (forward-line (1- line)) - (let* ((p (point)) - (bound (save-excursion - (re-search-backward "\\\\message{[^}]+}" nil t) - (end-of-line) - (point))) - (start (save-excursion - (while (< (- p (point)) 250) - (backward-paragraph)) - (point)))) - (setq region-search-string (buffer-substring-no-properties - (if (< start bound) bound start) - (point)))) - ;; TeX-region-create stores the original buffer - ;; locally as TeX-region-orig-buffer. - (get-buffer TeX-region-orig-buffer))))) - ((file-name-absolute-p f) (find-file f)) - (t (get-buffer (file-name-nondirectory file))))))) - (if (null buf) - (message "No buffer for %s." file) - (switch-to-buffer buf) - (push-mark (point) 'nomsg) - (goto-char (point-min)) - (if region - (search-forward region-search-string nil t) - (forward-line (1- line))) - (unless (= col -1) - (move-to-column col)) - (raise-frame)))) + (let* ((file (condition-case nil + (progn + (require 'url-parse) + (require 'url-util) + (url-unhex-string (aref (url-generic-parse-url file) 6))) + ;; For Emacs 21 compatibility, which doesn't have the + ;; url package. + (file-error (replace-regexp-in-string "^file://" "" file)))) + (flc (apply #'TeX-source-correlate-handle-TeX-region file linecol)) + (file (car flc)) + (line (cadr flc)) + (col (nth 2 flc))) + (pop-to-buffer (or (find-buffer-visiting file) + (find-file-noselect file))) + (push-mark nil 'nomsg) + (let ((pos + (when (> line 0) + (save-excursion + (save-restriction + (widen) + (goto-char 1) + (forward-line (1- line)) + (when (> col 0) + (forward-char (1- col))) + (point)))))) + (when pos + (when (or (< pos (point-min)) + (> pos (point-max))) + (widen)) + (goto-char pos))))) (define-minor-mode TeX-source-correlate-mode "Minor mode for forward and inverse search. @@ -1861,6 +1861,10 @@ function `TeX-global-PDF-mode' for toggling this value." (setq TeX-PDF-mode nil)) (setq TeX-PDF-mode-parsed nil) (TeX-set-mode-name nil nil t) + (when (and TeX-PDF-mode + (boundp 'pdf-sync-correlate-tex-refine-function)) + (setq pdf-sync-correlate-tex-refine-function + #'TeX-source-correlate-handle-TeX-region)) (setq TeX-output-extension (if TeX-PDF-mode "pdf" "dvi"))) (add-to-list 'minor-mode-alist '(TeX-PDF-mode ""))