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"