branch: master
commit 0e315c7fbeed081addf369fd42e7206d83580bc5
Author: Vangelis Evangelou <[email protected]>
Commit: Ikumi Keita <[email protected]>

    Support indirect buffer
    
    * tex.el (TeX-buffer-file-name): New wrapper function for
    `buffer-file-name'.  It returns base buffer's file name in indirect
    buffer.
    (TeX-master-file, TeX-normal-mode): Wrap the body in
    `with-current-buffer' in case called in indirect buffer.
    Omit an unused return value in `save-excursion' form.
    (TeX-master-directory): Omit redundant optional argument for
    `expand-file-name'.
    * bib-cite.el:
    * latex.el:
    * preview.el.in:
    * style/catchfilebetweentags.el:
    * style/pdfsync.el:
    * tex-info.el:
    * tex.el:
    * toolbar-x.el:
    Replace call to `buffer-file-name' and reference to `buffer-file-name'
    with call to `TeX-buffer-file-name' (or equivalent form).
    
    Copyright-paperwork-exempt: yes
---
 bib-cite.el                   |   2 +-
 doc/changes.texi              |  12 +++
 latex.el                      |   4 +-
 preview.el.in                 |   8 +-
 style/catchfilebetweentags.el |   2 +-
 style/pdfsync.el              |   2 +-
 tex-info.el                   |   2 +-
 tex.el                        | 223 ++++++++++++++++++++++--------------------
 toolbar-x.el                  |   6 +-
 9 files changed, 142 insertions(+), 119 deletions(-)

diff --git a/bib-cite.el b/bib-cite.el
index 5a7de98f..7b425cac 100644
--- a/bib-cite.el
+++ b/bib-cite.el
@@ -1903,7 +1903,7 @@ If no master file, then return current default."
                     ;; rather than            \input file
                     (re-search-forward "^[ \t]*\\\\\\(include\\|input\\){"
                                        nil t))))
-           (buffer-file-name))
+           (TeX-buffer-file-name))
           (t
            nil))))
     (cond
diff --git a/doc/changes.texi b/doc/changes.texi
index cae91aa2..0d57a654 100644
--- a/doc/changes.texi
+++ b/doc/changes.texi
@@ -11,6 +11,18 @@
 @heading News in 14.1
 
 @itemize @bullet
+@item
+@AUCTeX{} can be used with indirect buffers cloned from buffers visiting a
+file.  This feature allows having different perspectives of the same
+buffer (narrowing, folding, previewing, etc).  The indirect buffer has the
+same master file as its base buffer.
+
+In indirect buffer, @previewlatex{} works naturally for region preview
+such as @code{preview-region} (@kbd{C-c C-p C-r}), but document preview
+@code{preview-document} (@kbd{C-c C-p C-d}) puts preview images in the
+base buffer, not in the indirect buffer itself.  We expect this behavior
+doesn't matter because of the users' intent.
+
 @item
 @AUCTeX{} changes major mode names.  Its primary purpose is to avoid
 conflicts with Emacs built-in @TeX{} major modes.  It also improves
diff --git a/latex.el b/latex.el
index c5965b05..9e769e97 100644
--- a/latex.el
+++ b/latex.el
@@ -2569,7 +2569,7 @@ string."
 Initial input is the name of the file being visited in the
 current buffer, with extension.  If OPTIONAL is non-nil, insert
 it as an optional argument.  Use PROMPT as the prompt string."
-  (let ((name (file-name-nondirectory buffer-file-name)))
+  (let ((name (file-name-nondirectory (TeX-buffer-file-name))))
     (TeX-argument-insert
      (TeX-read-string
       (TeX-argument-prompt optional
@@ -2590,7 +2590,7 @@ current buffer, without extension.  If OPTIONAL is 
non-nil,
 insert it as an optional argument.  Use PROMPT as the prompt
 string."
   (let ((name (file-name-sans-extension
-               (file-name-nondirectory buffer-file-name))))
+               (file-name-nondirectory (TeX-buffer-file-name)))))
     (TeX-argument-insert
      (TeX-read-string
       (TeX-argument-prompt optional
diff --git a/preview.el.in b/preview.el.in
index 12500011..7b59a3de 100644
--- a/preview.el.in
+++ b/preview.el.in
@@ -3079,8 +3079,8 @@ pp")
        #'desktop-buffer-preview-misc-data)
   (add-hook 'pre-command-hook #'preview-mark-point nil t)
   (add-hook 'post-command-hook #'preview-move-point nil t)
-  (when buffer-file-name
-    (let* ((filename (expand-file-name buffer-file-name))
+  (when (TeX-buffer-file-name)
+    (let* ((filename (expand-file-name (TeX-buffer-file-name)))
            format-cons)
       (when (string-match (concat "\\." TeX-default-extension "\\'")
                           filename)
@@ -4128,8 +4128,8 @@ The function bound to this variable will be called inside
                          (if preview-preprocess-function
                              (funcall preview-preprocess-function str)
                            str))
-                       (if buffer-file-name
-                           (file-name-nondirectory buffer-file-name)
+                       (if (TeX-buffer-file-name)
+                           (file-name-nondirectory (TeX-buffer-file-name))
                          "<none>")
                        (TeX-current-offset begin)))
   (setq TeX-current-process-region-p t)
diff --git a/style/catchfilebetweentags.el b/style/catchfilebetweentags.el
index 6354f15f..fb63bb7d 100644
--- a/style/catchfilebetweentags.el
+++ b/style/catchfilebetweentags.el
@@ -67,7 +67,7 @@ ENVIRONMENT is ignored."
   ;; several external files to a singular one.
   (let* ((file (file-name-sans-extension
                 (file-name-nondirectory
-                 (buffer-file-name (current-buffer)))))
+                 (TeX-buffer-file-name (current-buffer)))))
          (fn (when LaTeX-catchfilebetweentags-use-numeric-label
                (LaTeX-catchfilebetweentags-counter-inc)))
          (tag (concat file ":"
diff --git a/style/pdfsync.el b/style/pdfsync.el
index 122f0eb9..e52baf4d 100644
--- a/style/pdfsync.el
+++ b/style/pdfsync.el
@@ -37,7 +37,7 @@
   (let* ((line (line-number-at-pos))
          (master (TeX-active-master))
          (file (file-name-sans-extension
-                (file-relative-name (buffer-file-name)
+                (file-relative-name (TeX-buffer-file-name)
                                     (file-name-directory master))))
          (pdfsync-file (concat master ".pdfsync"))
          (buf-live-p (get-file-buffer pdfsync-file))
diff --git a/tex-info.el b/tex-info.el
index 9f919ee3..2a65c3a9 100644
--- a/tex-info.el
+++ b/tex-info.el
@@ -700,7 +700,7 @@ value of `Texinfo-mode-hook'."
   (set (make-local-variable 'TeX-style-hook-dialect) :texinfo)
 
   (add-hook 'find-file-hook (lambda ()
-                              (unless (file-exists-p (buffer-file-name))
+                              (unless (file-exists-p (TeX-buffer-file-name))
                                 (TeX-master-file nil nil t)))
             nil t)
 
diff --git a/tex.el b/tex.el
index 985cb71e..325f883b 100644
--- a/tex.el
+++ b/tex.el
@@ -673,7 +673,7 @@ string."
     ;; case the file is in a different subdirectory
     ("%b" TeX-current-file-name-master-relative)
     ;; Okular forward PDF search requires absolute path.
-    ("%a" (lambda nil (prin1-to-string (expand-file-name (buffer-file-name)))))
+    ("%a" (lambda nil (prin1-to-string (expand-file-name 
(TeX-buffer-file-name)))))
     ;; the following is for preview-latex.
     ("%m" preview-create-subdirectory)
     ;; LaTeXMk support
@@ -1251,7 +1251,7 @@ viewer."
            (format "/org/%s/%s/Window/0" de app)
            (format "org.%s.%s.Window" de app)
            "SyncView"
-           (buffer-file-name)
+           (TeX-buffer-file-name)
            (list :struct :int32 (1+ (TeX-current-offset))
                  ;; FIXME: Using `current-column' here is dubious.
                  ;; Most of CJK letters count as occupying 2 columns,
@@ -1820,7 +1820,7 @@ Else, return nil."
       (when (re-search-forward "!offset(\\([---0-9]+\\))" nil t)
         (let ((offset (string-to-number (match-string-no-properties 1))))
           (when TeX-region-orig-buffer
-            (list (expand-file-name (buffer-file-name TeX-region-orig-buffer))
+            (list (expand-file-name (TeX-buffer-file-name 
TeX-region-orig-buffer))
                   (+ line offset) col)))))))
 
 (defcustom TeX-raise-frame-function #'raise-frame
@@ -2040,11 +2040,11 @@ enabled and the `synctex' binary is available."
   "Return the page corresponding to the position in the current buffer.
 This method assumes that the document was compiled with SyncTeX
 enabled and the `synctex' binary is available."
-  (let* ((file (file-relative-name (buffer-file-name)
+  (let* ((file (file-relative-name (TeX-buffer-file-name)
                                    (file-name-directory
                                     (TeX-active-master))))
          (abs-file (concat (expand-file-name (or (file-name-directory 
(TeX-active-master))
-                                                 (file-name-directory 
(buffer-file-name))))
+                                                 (file-name-directory 
(TeX-buffer-file-name))))
                            "./" file)))
     ;; It's known that depending on synctex version one of
     ;; /absolute/path/./foo/bar.tex, foo/bar.tex, or ./foo/bar.tex (relative to
@@ -2379,7 +2379,7 @@ this variable to \"<none>\"."
              (TeX-add-local-master))
             ((or
               ;; Default `read-file-name' proposes and buffer visits a file.
-              (string= (expand-file-name name) (buffer-file-name))
+              (string= (expand-file-name name) (TeX-buffer-file-name))
               ;; Default of `read-file-name' and buffer does not visit a file.
               (string= name default-directory)
               ;; User typed <RET> in an empty minibuffer.
@@ -2406,80 +2406,84 @@ name of master file if it cannot be determined 
otherwise."
   (interactive)
   (if (eq extension t)
       (setq extension TeX-default-extension))
-  (let ((my-name (if (buffer-file-name)
-                     (TeX-strip-extension nil (list TeX-default-extension) t)
-                   "<none>")))
-    (save-excursion
-      (save-restriction
-        (widen)
-        (goto-char (point-min))
-        (cond
-         ((and TeX-transient-master
-               (or (not TeX-master) (eq TeX-master 'shared)))
-          (setq TeX-master TeX-transient-master))
-         ;; Special value 't means it is own master (a free file).
-         ((equal TeX-master my-name)
-          (setq TeX-master t))
-
-         ;; For files shared between many documents.
-         ((and (eq 'shared TeX-master) ask)
-          (setq TeX-master
-                (let* ((default (TeX-dwim-master))
-                       (name (read-file-name
-                              (format "Master file (default %s): "
-                                      (or default "this file"))
-                              nil default)))
-                  (cond ((string= name default)
-                         default)
-                        ((or
-                          ;; Default `read-file-name' proposes and
-                          ;; buffer visits a file.
-                          (string= (expand-file-name name)
-                                   (buffer-file-name))
-                          ;; Default of `read-file-name' and
-                          ;; buffer does not visit a file.
-                          (string= name default-directory)
-                          ;; User typed <RET> in an empty minibuffer.
-                          (string= name ""))
-                         t)
-                        (t
-                         (TeX-strip-extension
-                          name (list TeX-default-extension) 'path))))))
-
-         ;; We might already know the name.
-         ((or (eq TeX-master t) (stringp TeX-master)) TeX-master)
-
-         ;; Ask the user (but add it as a local variable).
-         (ask (TeX-master-file-ask)))))
-
-    (let ((name (if (stringp TeX-master)
-                    TeX-master
-                  my-name)))
-
-      (if (TeX-match-extension name)
-          ;; If it already has an extension...
-          (if (equal extension TeX-default-extension)
-              ;; Use instead of the default extension
-              (setq extension nil)
-            ;; Otherwise drop it.
-            (setq name (TeX-strip-extension name))))
-
-      (let* ((reg (TeX--clean-extensions-regexp t))
-             (is-output-ext (and reg
-                                 (or (string-match-p reg (concat "." 
extension))
-                                     (string= "prv" extension))))
-             (output-dir (and is-output-ext
-                              (TeX--master-output-dir
-                               (file-name-directory name)
-                               nondirectory))))
-        (if output-dir
-            (setq name (concat output-dir (file-name-nondirectory name)))
-          ;; Remove directory if needed.
-          (if nondirectory
-              (setq name (file-name-nondirectory name)))))
-      (if extension
-          (concat name "." extension)
-        name))))
+  (with-current-buffer
+    ;; In case this is an indirect buffer:
+      (or (buffer-base-buffer) (current-buffer))
+    (let ((my-name (if (TeX-buffer-file-name)
+                       (TeX-strip-extension nil (list TeX-default-extension) t)
+                     "<none>")))
+      (save-excursion
+        (save-restriction
+          (widen)
+          (goto-char (point-min))
+          (cond
+           ((and TeX-transient-master
+                 (or (not TeX-master) (eq TeX-master 'shared)))
+            (setq TeX-master TeX-transient-master))
+
+           ;; Special value 't means it is own master (a free file).
+           ((equal TeX-master my-name)
+            (setq TeX-master t))
+
+           ;; For files shared between many documents.
+           ((and (eq 'shared TeX-master) ask)
+            (setq TeX-master
+                  (let* ((default (TeX-dwim-master))
+                         (name (read-file-name
+                                (format "Master file (default %s): "
+                                        (or default "this file"))
+                                nil default)))
+                    (cond ((string= name default)
+                           default)
+                          ((or
+                            ;; Default `read-file-name' proposes and
+                            ;; buffer visits a file.
+                            (string= (expand-file-name name)
+                                     (TeX-buffer-file-name))
+                            ;; Default of `read-file-name' and
+                            ;; buffer does not visit a file.
+                            (string= name default-directory)
+                            ;; User typed <RET> in an empty minibuffer.
+                            (string= name ""))
+                           t)
+                          (t
+                           (TeX-strip-extension
+                            name (list TeX-default-extension) 'path))))))
+
+           ;; We might already know the name.
+           ((or (eq TeX-master t) (stringp TeX-master)))
+
+           ;; Ask the user (but add it as a local variable).
+           (ask (TeX-master-file-ask)))))
+
+      (let ((name (if (stringp TeX-master)
+                      TeX-master
+                    my-name)))
+
+        (if (TeX-match-extension name)
+            ;; If it already has an extension...
+            (if (equal extension TeX-default-extension)
+                ;; Use instead of the default extension
+                (setq extension nil)
+              ;; Otherwise drop it.
+              (setq name (TeX-strip-extension name))))
+
+        (let* ((reg (TeX--clean-extensions-regexp t))
+               (is-output-ext (and reg
+                                   (or (string-match-p reg (concat "." 
extension))
+                                       (string= "prv" extension))))
+               (output-dir (and is-output-ext
+                                (TeX--master-output-dir
+                                 (file-name-directory name)
+                                 nondirectory))))
+          (if output-dir
+              (setq name (concat output-dir (file-name-nondirectory name)))
+            ;; Remove directory if needed.
+            (if nondirectory
+                (setq name (file-name-nondirectory name)))))
+        (if extension
+            (concat name "." extension)
+          name)))))
 
 (defun TeX-master-directory ()
   "Directory of master file."
@@ -2488,17 +2492,15 @@ name of master file if it cannot be determined 
otherwise."
     (substitute-in-file-name
      (expand-file-name
       (let ((dir (file-name-directory (TeX-master-file))))
-        (if dir (directory-file-name dir) "."))
-      (and buffer-file-name
-           (file-name-directory buffer-file-name)))))))
+        (if dir (directory-file-name dir) ".")))))))
 
 (defun TeX-add-local-master ()
   "Add local variable for `TeX-master'.
 
 Get `major-mode' from master file and enable it."
-  (when (and (buffer-file-name)
+  (when (and (TeX-buffer-file-name)
              (string-match TeX-one-master
-                           (file-name-nondirectory (buffer-file-name)))
+                           (file-name-nondirectory (TeX-buffer-file-name)))
              (not buffer-read-only))
     (goto-char (point-max))
     (if (re-search-backward "^\\([^\n]+\\)Local Variables:"
@@ -3087,9 +3089,9 @@ FORCE is not nil."
     (TeX-run-style-hooks (TeX-strip-extension nil nil t))
     ;; Run parent style hooks if it has a single parent that isn't itself.
     (if (or (not (memq TeX-master '(nil t)))
-            (and (buffer-file-name)
+            (and (TeX-buffer-file-name)
                  (string-match TeX-one-master
-                               (file-name-nondirectory (buffer-file-name)))))
+                               (file-name-nondirectory 
(TeX-buffer-file-name)))))
         (TeX-run-style-hooks (TeX-master-file)))
     (if (and TeX-parse-self
              (null (cdr-safe (assoc (TeX-strip-extension nil nil t)
@@ -3881,7 +3883,7 @@ Not intended for direct use for user."
   (add-hook 'find-file-hook
             (lambda ()
               ;; Check if we are looking at a new or shared file.
-              (when (or (not (file-exists-p (buffer-file-name)))
+              (when (or (not (file-exists-p (TeX-buffer-file-name)))
                         (eq TeX-master 'shared))
                 (TeX-master-file nil nil t))
               (TeX-update-style t)) nil t))
@@ -4637,7 +4639,7 @@ STRING defaults to the name of the current buffer.
 EXTENSIONS defaults to `TeX-file-extensions'."
 
   (if (null string)
-      (setq string (or (buffer-file-name) "<none>")))
+      (setq string (or (TeX-buffer-file-name) "<none>")))
 
   (if (null extensions)
       (setq extensions TeX-file-extensions))
@@ -4920,7 +4922,7 @@ to look backward for."
 (defun TeX-current-file-name-master-relative ()
   "Return current filename, relative to master directory."
   (file-relative-name
-   (buffer-file-name)
+   (TeX-buffer-file-name)
    (TeX-master-directory)))
 
 (defun TeX-near-bobp ()
@@ -6269,18 +6271,21 @@ this list.")
 Save buffer first including style information.
 With optional argument ARG, also reload the style hooks."
   (interactive "*P")
-  (if arg
-      (dolist (var TeX-normal-mode-reset-list)
-        (set var nil)))
-  (let ((gc-cons-percentage 0.5))
-    (let ((TeX-auto-save t))
-      (if (buffer-modified-p)
-          (save-buffer)
-        (TeX-auto-write)))
-    (normal-mode)
-    ;; See also addition to `find-file-hook' in `TeX-mode'.
-    (when (eq TeX-master 'shared) (TeX-master-file nil nil t))
-    (TeX-update-style t)))
+  (with-current-buffer
+  ;; In case this is an indirect buffer:
+      (or (buffer-base-buffer) (current-buffer))
+    (if arg
+        (dolist (var TeX-normal-mode-reset-list)
+          (set var nil)))
+    (let ((gc-cons-percentage 0.5))
+      (let ((TeX-auto-save t))
+        (if (buffer-modified-p)
+            (save-buffer)
+          (TeX-auto-write)))
+      (normal-mode)
+      ;; See also addition to `find-file-hook' in `TeX-mode'.
+      (when (eq TeX-master 'shared) (TeX-master-file nil nil t))
+      (TeX-update-style t))))
 
 (defgroup TeX-quote nil
   "Quoting in AUCTeX."
@@ -6730,7 +6735,7 @@ NAME may be a package, a command, or a document."
         (buffers (buffer-list)))
     (while buffers
       (let* ((buffer (car buffers))
-             (name (buffer-file-name buffer)))
+             (name (TeX-buffer-file-name buffer)))
         (setq buffers (cdr buffers))
         (when (and name (string-match regexp name))
           (save-excursion (switch-to-buffer buffer) (ispell-buffer))
@@ -7096,7 +7101,7 @@ pinned region will get unpinned and vice versa."
                   TeX-region-extra)))
     (TeX-region-create (TeX-region-file TeX-default-extension)
                        (buffer-substring-no-properties begin end)
-                       (file-name-nondirectory (buffer-file-name))
+                       (file-name-nondirectory (TeX-buffer-file-name))
                        (TeX-current-offset begin))))
 
 (defun TeX-command-region (&optional override-confirm)
@@ -7588,14 +7593,14 @@ ORIGINALS which are modified but not saved yet."
                 (setq existingoriginals (cons filepath existingoriginals)))))))
     (while buffers
       (let* ((buffer (car buffers))
-             (name (buffer-file-name buffer)))
+             (name (TeX-buffer-file-name buffer)))
         (setq buffers (cdr buffers))
         (if (and name (member name existingoriginals))
             (progn
               (and (buffer-modified-p buffer)
                    (or (not TeX-save-query)
                        (y-or-n-p (concat "Save file "
-                                         (buffer-file-name buffer)
+                                         (TeX-buffer-file-name  buffer)
                                          "? ")))
                    (with-current-buffer buffer (save-buffer)))))))
     (dolist (eo existingoriginals)
@@ -10430,6 +10435,12 @@ warnings and bad boxes"
                               #'TeX-master-file))))
     (error "Unable to find what command to run")))
 
+(defun TeX-buffer-file-name (&optional BUFFER)
+  "Return name of file BUFFER is visiting, or nil if none.
+No argument or nil as argument means use the current buffer.
+If BUFFER is indirect, return the file that the base buffer is visiting."
+  (buffer-file-name (or (buffer-base-buffer BUFFER) BUFFER)))
+
 (provide 'tex)
 
 ;; Local Variables:
diff --git a/toolbar-x.el b/toolbar-x.el
index d97035fd..f8e8ae91 100644
--- a/toolbar-x.el
+++ b/toolbar-x.el
@@ -1462,11 +1462,11 @@ line of buttons.  The only property supported for this 
button is
                  :command save-buffer
                  :enable (and
                            (buffer-modified-p)
-                           (buffer-file-name)
+                           (buffer-file-name (buffer-base-buffer))
                            (not (window-minibuffer-p
                                  (frame-selected-window menu-updating-frame))))
                  :help "Save current buffer to its file"
-                 :visible (or buffer-file-name
+                 :visible (or (buffer-file-name (buffer-base-buffer))
                               (not (eq 'special
                                        (get major-mode 'mode-class)))))
 
@@ -1476,7 +1476,7 @@ line of buttons.  The only property supported for this 
button is
                          (window-minibuffer-p
                           (frame-selected-window menu-updating-frame)))
                 :help "Write current buffer to another file"
-                :visible (or buffer-file-name
+                :visible (or (buffer-file-name (buffer-base-buffer))
                              (not (eq 'special (get major-mode 'mode-class)))))
 
     (undo :image "undo"

Reply via email to