1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-27 07:37:33 +00:00

(format-encode-run-method): Fix error message to say

`encode' instead of `decode'.  Use save-window-excursion around
shell-command-on-region as in format-decode-run-method because
shell-command-on-region can display a buffer with error output.
(format-decode): Don't record undo information for the decoding.
(format-annotate-function): Add parameter FORMAT-COUNT.  Make
that number part of the temporary buffer name so that more than
one decoding using a temporary buffer can happen safely.
This commit is contained in:
Gerd Moellmann 2000-08-17 20:24:27 +00:00
parent 1fb3862065
commit 10fa00732b

View File

@ -154,14 +154,15 @@ BUFFER should be the buffer that the output originally came from."
(with-current-buffer error-buff
(widen)
(erase-buffer))
(if (and (zerop (shell-command-on-region from to method t t
error-buff))
(if (and (zerop (save-window-excursion
(shell-command-on-region from to method t t
error-buff)))
;; gzip gives zero exit status with bad args, for instance.
(zerop (with-current-buffer error-buff
(buffer-size))))
(bury-buffer error-buff)
(switch-to-buffer-other-window error-buff)
(error "Format decoding failed")))
(error "Format encoding failed")))
(funcall method from to buffer)))
(defun format-decode-run-method (method from to &optional buffer)
@ -190,26 +191,32 @@ a Lisp function. Decoding is done for the given BUFFER."
(point))
(funcall method from to)))
(defun format-annotate-function (format from to orig-buf)
(defun format-annotate-function (format from to orig-buf format-count)
"Return annotations for writing region as FORMAT.
FORMAT is a symbol naming one of the formats defined in `format-alist',
it must be a single symbol, not a list like `buffer-file-format'.
FROM and TO delimit the region to be operated on in the current buffer.
ORIG-BUF is the original buffer that the data came from.
FORMAT-COUNT is an integer specifying how many times this function has
been called in the process of decoding ORIG-BUF.
This function works like a function on `write-region-annotate-functions':
it either returns a list of annotations, or returns with a different buffer
current, which contains the modified text to write.
current, which contains the modified text to write. In the latter case,
this function's value is nil.
For most purposes, consider using `format-encode-region' instead."
;; This function is called by write-region (actually build-annotations)
;; for each element of buffer-file-format.
;; This function is called by write-region (actually
;; build_annotations) for each element of buffer-file-format.
(let* ((info (assq format format-alist))
(to-fn (nth 4 info))
(modify (nth 5 info)))
(if to-fn
(if modify
;; To-function wants to modify region. Copy to safe place.
(let ((copy-buf (get-buffer-create " *Format Temp*")))
(let ((copy-buf (get-buffer-create (format " *Format Temp %d*"
format-count))))
(copy-to-buffer copy-buf from to)
(set-buffer copy-buf)
(format-insert-annotations write-region-annotations-so-far from)
@ -236,45 +243,52 @@ Returns the new length of the decoded region.
For most purposes, consider using `format-decode-region' instead."
(let ((mod (buffer-modified-p))
(begin (point))
(begin (point))
(end (+ (point) length)))
(if (null format)
;; Figure out which format it is in, remember list in `format'.
(let ((try format-alist))
(while try
(let* ((f (car try))
(regexp (nth 2 f))
(p (point)))
(if (and regexp (looking-at regexp)
(< (match-end 0) (+ begin length)))
(progn
(setq format (cons (car f) format))
;; Decode it
(if (nth 3 f)
(setq end (format-decode-run-method (nth 3 f) begin end)))
;; Call visit function if required
(if (and visit-flag (nth 6 f)) (funcall (nth 6 f) 1))
;; Safeguard against either of the functions changing pt.
(goto-char p)
;; Rewind list to look for another format
(setq try format-alist))
(setq try (cdr try))))))
;; Deal with given format(s)
(or (listp format) (setq format (list format)))
(let ((do format) f)
(while do
(or (setq f (assq (car do) format-alist))
(error "Unknown format" (car do)))
;; Decode:
(if (nth 3 f)
(setq end (format-decode-run-method (nth 3 f) begin end)))
;; Call visit function if required
(if (and visit-flag (nth 6 f)) (funcall (nth 6 f) 1))
(setq do (cdr do)))))
(if visit-flag
(setq buffer-file-format format))
(set-buffer-modified-p mod)
;; Return new length of region
(unwind-protect
(progn
;; Don't record undo information for the decoding.
(setq buffer-undo-list t)
(if (null format)
;; Figure out which format it is in, remember list in `format'.
(let ((try format-alist))
(while try
(let* ((f (car try))
(regexp (nth 2 f))
(p (point)))
(if (and regexp (looking-at regexp)
(< (match-end 0) (+ begin length)))
(progn
(setq format (cons (car f) format))
;; Decode it
(if (nth 3 f)
(setq end (format-decode-run-method (nth 3 f) begin end)))
;; Call visit function if required
(if (and visit-flag (nth 6 f)) (funcall (nth 6 f) 1))
;; Safeguard against either of the functions changing pt.
(goto-char p)
;; Rewind list to look for another format
(setq try format-alist))
(setq try (cdr try))))))
;; Deal with given format(s)
(or (listp format) (setq format (list format)))
(let ((do format) f)
(while do
(or (setq f (assq (car do) format-alist))
(error "Unknown format" (car do)))
;; Decode:
(if (nth 3 f)
(setq end (format-decode-run-method (nth 3 f) begin end)))
;; Call visit function if required
(if (and visit-flag (nth 6 f)) (funcall (nth 6 f) 1))
(setq do (cdr do)))))
(if visit-flag
(setq buffer-file-format format)))
(set-buffer-modified-p mod)
(setq buffer-undo-list nil))
;; Return new length of region
(- end begin)))
;;;