Prefer `write-region' to `save-file'

* lisp/ob-haskell.el (org-babel-haskell-export-to-lhs): Use
non-interactive `insert-file-contents' + `write-region' to avoid
triggering various interactive hooks.  Ensure that temp files are
always deleted.
* lisp/org-agenda.el (org-agenda-write):
* lisp/org-table.el: Simplify code using `write-region'.
* lisp/ox-odt.el (org-odt-template): Use `insert-file-contents' +
`write-region' instead of `find-file-noselect' that may trigger
various hooks.  The new approach makes `revert-buffer' not
necessary (and do not trigger `revert-buffer' hooks).  Also, the
problem with backups will no longer exists.

Original idea: https://list.orgmode.org/orgmode/20221002035931.12191-1-dafydd.lukes@gmail.com/
This commit is contained in:
Ihor Radchenko 2023-03-18 12:34:17 +01:00
parent 6f742685d7
commit 2289739ed4
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
4 changed files with 57 additions and 77 deletions

View File

@ -255,26 +255,27 @@ constructs (header arguments, no-web syntax etc...) are ignored."
t t)
(indent-code-rigidly (match-beginning 0) (match-end 0) indentation)))
(save-excursion
;; export to latex w/org and save as .lhs
(require 'ox-latex)
(find-file tmp-org-file)
;; Ensure we do not clutter kill ring with incomplete results.
(let (org-export-copy-to-kill-ring)
(org-export-to-file 'latex tmp-tex-file))
(kill-buffer nil)
(delete-file tmp-org-file)
(find-file tmp-tex-file)
(goto-char (point-min)) (forward-line 2)
(insert "%include polycode.fmt\n")
;; ensure all \begin/end{code} statements start at the first column
(while (re-search-forward "^[ \t]+\\\\begin{code}[^\000]+\\\\end{code}" nil t)
(replace-match (save-match-data (org-remove-indentation (match-string 0)))
t t))
(setq contents (buffer-string))
(save-buffer) (kill-buffer nil))
(delete-file tmp-tex-file)
;; save org exported latex to a .lhs file
(with-temp-file lhs-file (insert contents))
(unwind-protect
(with-temp-buffer
;; Export to latex w/org and save as .lhs
(require 'ox-latex)
(insert-file-contents tmp-org-file)
;; Ensure we do not clutter kill ring with incomplete results.
(let (org-export-copy-to-kill-ring)
(org-export-to-file 'latex tmp-tex-file)))
(delete-file tmp-org-file))
(unwind-protect
(with-temp-buffer
(insert-file-contents tmp-tex-file)
(goto-char (point-min)) (forward-line 2)
(insert "%include polycode.fmt\n")
;; ensure all \begin/end{code} statements start at the first column
(while (re-search-forward "^[ \t]+\\\\begin{code}[^\000]+\\\\end{code}" nil t)
(replace-match (save-match-data (org-remove-indentation (match-string 0)))
t t))
;; save org exported latex to a .lhs file
(write-region nil nil lhs-file))
(delete-file tmp-tex-file)))
(if (not arg)
(find-file lhs-file)
;; process .lhs file with lhs2tex

View File

@ -3667,13 +3667,8 @@ the agenda to write."
"ox-icalendar" (file))
(org-icalendar-export-current-agenda (expand-file-name file)))
(t
(let ((bs (buffer-string)))
(find-file file)
(erase-buffer)
(insert bs)
(save-buffer 0)
(kill-buffer (current-buffer))
(message "Plain text written to %s" file))))))))
(write-region nil nil file)
(message "Plain text written to %s" file)))))))
(set-buffer (or agenda-bufname
;; FIXME: I'm pretty sure called-interactively-p
;; doesn't do what we want here!

View File

@ -4332,14 +4332,8 @@ extension of the given file name, and finally on the variable
(table (org-table-to-lisp)))
(unless (fboundp transform)
(user-error "No such transformation function %s" transform))
(let (buf)
(with-current-buffer (find-file-noselect file)
(setq buf (current-buffer))
(erase-buffer)
(fundamental-mode)
(insert (funcall transform table params) "\n")
(save-buffer))
(kill-buffer buf))
(with-temp-file file
(insert (funcall transform table params) "\n"))
(message "Export done."))
(user-error "TABLE_EXPORT_FORMAT invalid")))))

View File

@ -1365,50 +1365,40 @@ original parsed data. INFO is a plist holding export options."
;; Ensure we have write permissions to this file.
(set-file-modes (concat org-odt-zip-dir "styles.xml") #o600)
;; FIXME: Who is opening an empty styles.xml before this point?
(with-current-buffer
(find-file-noselect (concat org-odt-zip-dir "styles.xml") t)
(revert-buffer t t)
(let ((styles-xml (concat org-odt-zip-dir "styles.xml")))
(with-temp-buffer
(when (file-exists-p styles-xml)
(insert-file-contents styles-xml))
;; Write custom styles for source blocks
;; Save STYLES used for colorizing of source blocks.
;; Update styles.xml with styles that were collected as part of
;; `org-odt-hfy-face-to-css' callbacks.
(let ((styles (mapconcat (lambda (style) (format " %s\n" (cddr style)))
hfy-user-sheet-assoc "")))
(when styles
(goto-char (point-min))
(when (re-search-forward "</office:styles>" nil t)
(goto-char (match-beginning 0))
(insert "\n<!-- Org Htmlfontify Styles -->\n" styles "\n"))))
;; Write custom styles for source blocks
;; Save STYLES used for colorizing of source blocks.
;; Update styles.xml with styles that were collected as part of
;; `org-odt-hfy-face-to-css' callbacks.
(let ((styles (mapconcat (lambda (style) (format " %s\n" (cddr style)))
hfy-user-sheet-assoc "")))
(when styles
(goto-char (point-min))
(when (re-search-forward "</office:styles>" nil t)
(goto-char (match-beginning 0))
(insert "\n<!-- Org Htmlfontify Styles -->\n" styles "\n"))))
;; Update styles.xml - take care of outline numbering
;; Outline numbering is retained only up to LEVEL.
;; To disable outline numbering pass a LEVEL of 0.
;; Update styles.xml - take care of outline numbering
;; Don't make automatic backup of styles.xml file. This setting
;; prevents the backed-up styles.xml file from being zipped in to
;; odt file. This is more of a hackish fix. Better alternative
;; would be to fix the zip command so that the output odt file
;; includes only the needed files and excludes any auto-generated
;; extra files like backups and auto-saves etc etc. Note that
;; currently the zip command zips up the entire temp directory so
;; that any auto-generated files created under the hood ends up in
;; the resulting odt file.
(setq-local backup-inhibited t)
;; Outline numbering is retained only up to LEVEL.
;; To disable outline numbering pass a LEVEL of 0.
(goto-char (point-min))
(let ((regex
"<text:outline-level-style\\([^>]*\\)text:level=\"\\([^\"]*\\)\"\\([^>]*\\)>")
(replacement
"<text:outline-level-style\\1text:level=\"\\2\" style:num-format=\"\">"))
(while (re-search-forward regex nil t)
(unless (let ((sec-num (plist-get info :section-numbers))
(level (string-to-number (match-string 2))))
(if (wholenump sec-num) (<= level sec-num) sec-num))
(replace-match replacement t nil))))
(save-buffer 0)))
(let ((regex
"<text:outline-level-style\\([^>]*\\)text:level=\"\\([^\"]*\\)\"\\([^>]*\\)>")
(replacement
"<text:outline-level-style\\1text:level=\"\\2\" style:num-format=\"\">"))
(goto-char (point-min))
(while (re-search-forward regex nil t)
(unless (let ((sec-num (plist-get info :section-numbers))
(level (string-to-number (match-string 2))))
(if (wholenump sec-num) (<= level sec-num) sec-num))
(replace-match replacement t nil))))
;; Write back the new contents.
(write-region nil nil styles-xml))))
;; Update content.xml.
(let* ( ;; `org-display-custom-times' should be accessed right