From 8d8884bb6be0ba7cb7f9662f067d42b53393e92e Mon Sep 17 00:00:00 2001 Message-Id: <8d8884bb6be0ba7cb7f9662f067d42b53393e92e.1679139580.git.yantar92@posteo.net> From: Ihor Radchenko Date: Sat, 18 Mar 2023 12:34:17 +0100 Subject: [PATCH] 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/ --- lisp/ob-haskell.el | 41 ++++++++++++------------ lisp/org-agenda.el | 9 ++---- lisp/org-table.el | 10 ++---- lisp/ox-odt.el | 78 ++++++++++++++++++++-------------------------- 4 files changed, 59 insertions(+), 79 deletions(-) diff --git a/lisp/ob-haskell.el b/lisp/ob-haskell.el index 2b1441c2a..3e64c1657 100644 --- a/lisp/ob-haskell.el +++ b/lisp/ob-haskell.el @@ -255,26 +255,27 @@ (defun org-babel-haskell-export-to-lhs (&optional arg) 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 diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index 3da0967f0..859a80c47 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -3667,13 +3667,8 @@ (defun org-agenda-write (file &optional open nosettings agenda-bufname) "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! diff --git a/lisp/org-table.el b/lisp/org-table.el index 5116b1127..97120fffd 100644 --- a/lisp/org-table.el +++ b/lisp/org-table.el @@ -4332,14 +4332,8 @@ (defun org-table-export (&optional file format) (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"))))) diff --git a/lisp/ox-odt.el b/lisp/ox-odt.el index cf217c9e7..8fc34a749 100644 --- a/lisp/ox-odt.el +++ b/lisp/ox-odt.el @@ -1365,50 +1365,40 @@ (defun org-odt-template (contents info) ;; 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) - - ;; 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 "" nil t) - (goto-char (match-beginning 0)) - (insert "\n\n" styles "\n")))) - - ;; 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:level=\"\\([^\"]*\\)\"\\([^>]*\\)>") - (replacement - "")) - (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 ((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 "" nil t) + (goto-char (match-beginning 0)) + (insert "\n\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. + + (let ((regex + "]*\\)text:level=\"\\([^\"]*\\)\"\\([^>]*\\)>") + (replacement + "")) + (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 -- 2.39.1