From 55b9f2f7989ecb876b93436df484827de0387179 Mon Sep 17 00:00:00 2001 From: Raphael Roberts Date: Thu, 3 Oct 2019 01:28:31 -0500 Subject: [PATCH] Added neat custom function to save buffer modifying functions to file --- python-conf.el | 52 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/python-conf.el b/python-conf.el index 60f3de8..b6f330d 100644 --- a/python-conf.el +++ b/python-conf.el @@ -19,8 +19,48 @@ (setcar venv-partition-name (1+ (apply 'max (mapcar #'car venv-conflicts))))) (rlbr/join-venv-with-number venv-partition-name))) +;; We'll save using file-precious-flag, so avoid destroying +;; symlinks. (If we're not already visiting the buffer, this is +;; handled by find-file-visit-truename, above.) +(defun rlbr/save-buffer-func-to-file (visit-file func args) + "Rip off of custom-save-all" + (let* ((filename visit-file) + (recentf-exclude (if recentf-mode + (append + `(,(concat "\\`" (regexp-quote (recentf-expand-file-name visit-file)) "\\'") + ,(concat "\\`" (regexp-quote (file-truename (recentf-expand-file-name visit-file))) "\\'")) + recentf-exclude))) + (old-buffer (find-buffer-visiting filename)) + old-buffer-name) + (with-current-buffer + (let ((find-file-visit-truename t)) + (or old-buffer + (let ((delay-mode-hooks t)) + (find-file-noselect filename)))) + (when old-buffer + (setq old-buffer-name + (buffer-file-name)) + (set-visited-file-name + (file-chase-links filename))) + (unless (eq major-mode + 'emacs-lisp-mode) + (delay-mode-hooks + (emacs-lisp-mode))) + (let ((inhibit-read-only t) + (print-length nil) + (print-level nil)) + (apply func args)) + (let ((file-precious-flag t)) + (save-buffer)) + (if old-buffer + (progn + (set-visited-file-name + old-buffer-name) + (set-buffer-modified-p nil)) + (kill-buffer (current-buffer)))))) + (defun rlbr/setup-python-venv-dirlocals (&optional library-root) - "Setup .dir-locals file inf library root and tell vc system to ignore .dir-locals file" + "Setup .dir-locals file in library root and tell vc system to ignore .dir-locals file" (let* ((library-root (if library-root library-root (elpy-library-root))) @@ -29,14 +69,8 @@ ".dir-locals.el")) (venv-name (rlbr/get-venv-name library-root))) - (message default-directory) - (find-file dir-locals-path) - (add-dir-local-variable - 'python-mode - 'pyvenv-workon - venv-name) - (save-buffer) - (kill-buffer))) + (rlbr/save-buffer-func-to-file dir-locals-path 'add-dir-local-variable + `(python-mode pyvenv-workon ,venv-name)))) (defun rlbr/init-python-venv-in-library-root (&optional library-root) "If no venv is specified in the library root .dir-locals file, prompt to either create one or use default"