branch: externals/polymode commit 32d0d6d3e128a265119e113bf21982364228f8f8 Author: vitalie <vitalie.sp...@adyen.com> Commit: vitalie <vitalie.sp...@adyen.com>
Simplify buffer naming logic and correctly keep track of file and buffer renames fix #346 --- polymode-compat.el | 18 +++++++----------- polymode-core.el | 42 ++++++++++++++++++++++++++++++------------ polymode-methods.el | 17 ++++++----------- 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/polymode-compat.el b/polymode-compat.el index 8bee89c73c..03df3438dd 100644 --- a/polymode-compat.el +++ b/polymode-compat.el @@ -430,32 +430,28 @@ changes." ;;; DESKTOP SAVE #194 #240 -;; NB: desktop-save will not save indirect buffer. -;; For base buffer, if it's hidden as per #34, we will save it unhide by removing left whitespaces. +;; NB: We advice desktop-save functionality to not save indirect buffers and for base buffers, +;; save the buffers with un-hidden name. (defun polymode-fix-desktop-buffer-info (fn buffer) - "Unhide poly-mode base buffer which is hidden as per #34. -This is done by modifying `uniquify-buffer-base-name' to `pm--core-buffer-name'." + "Unhide poly-mode base buffer which is hidden by removing the leading spaces from the name." (with-current-buffer buffer (let ((out (funcall fn buffer))) (when (and polymode-mode (not (buffer-base-buffer)) (not (car out))) - (setf (car out) pm--core-buffer-name)) + (setf (car out) (replace-regexp-in-string "^ +" "" (buffer-name buffer)))) out))) -(declare-function desktop-buffer-info "desktop") -(with-eval-after-load "desktop" - (advice-add #'desktop-buffer-info :around #'polymode-fix-desktop-buffer-info)) - (defun polymode-fix-desktop-save-buffer-p (_ bufname &rest _args) "Dont save polymode buffers which are indirect buffers." (with-current-buffer bufname - (not (and polymode-mode - (buffer-base-buffer))))) + (not (and polymode-mode (buffer-base-buffer))))) +(declare-function desktop-buffer-info "desktop") (declare-function desktop-save-buffer-p "desktop") (with-eval-after-load "desktop" + (advice-add #'desktop-buffer-info :around #'polymode-fix-desktop-buffer-info) (advice-add #'desktop-save-buffer-p :before-while #'polymode-fix-desktop-save-buffer-p)) diff --git a/polymode-core.el b/polymode-core.el index aa400ba839..5cb3f8ad90 100644 --- a/polymode-core.el +++ b/polymode-core.el @@ -104,14 +104,22 @@ (defvar pm-initialization-in-progress nil) (defvar pm-hide-implementation-buffers t) -(defvar-local pm--core-buffer-name nil) +(defvar-local pm--base-buffer-name nil + "Local name of the base buffer in the base buffer. +Currently, we only use it to track renames of the buffer.") -(defun pm--hidden-buffer-name () - (generate-new-buffer-name (concat " " pm--core-buffer-name))) -(defun pm--visible-buffer-name () - (generate-new-buffer-name - (replace-regexp-in-string "^ +" "" pm--core-buffer-name))) +(defun pm--buffer-name (&optional hidden) + (let ((name (if-let ((bbuf (buffer-base-buffer))) + (let ((postfix (replace-regexp-in-string "poly-\\|-mode" "" (symbol-name major-mode))) + (base-name (buffer-local-value 'pm--base-buffer-name bbuf))) + (format "%s[%s]" (replace-regexp-in-string "^ " "" base-name) + (or (cdr (assoc postfix polymode-mode-abbrev-aliases)) + postfix))) + pm--base-buffer-name))) + (when hidden + (setq name (concat " " name))) + (generate-new-buffer-name name))) @@ -1056,10 +1064,10 @@ switch." (when (and own visibly) (run-hook-with-args 'polymode-before-switch-buffer-hook cbuf buffer)) - (pm--move-vars polymode-move-these-vars-from-base-buffer - (pm-base-buffer) buffer) - (pm--move-vars polymode-move-these-vars-from-old-buffer - cbuf buffer) + + (pm--move-vars polymode-move-these-vars-from-base-buffer (pm-base-buffer) buffer) + (pm--move-vars polymode-move-these-vars-from-old-buffer cbuf buffer) + ;; synchronize again just in case (pm--synchronize-points cbuf) (if visibly @@ -1080,7 +1088,7 @@ switch." (hlf header-line-format)) (when pm-hide-implementation-buffers - (rename-buffer (pm--hidden-buffer-name))) + (rename-buffer (pm--buffer-name 'hidden))) (setq pm/current nil) @@ -1109,7 +1117,7 @@ switch." (activate-mark)) (when pm-hide-implementation-buffers - (rename-buffer (pm--visible-buffer-name))) + (rename-buffer (pm--buffer-name))) ;; avoid display jumps (goto-char point) @@ -1447,6 +1455,16 @@ are triggered if present." "Run after-save-hooks in indirect buffers. Only those in `polymode-run-these-after-save-functions-in-other-buffers' are triggered if present." + (unless (equal (buffer-name) pm--base-buffer-name) + (let ((cbuf (current-buffer))) + ;; Ensure we are in the base-buffer by accident + (cl-assert (eq (buffer-base-buffer) nil)) + (setq pm--base-buffer-name (buffer-name)) + ;; Rename indirect buffers (#346) + (dolist (buf (eieio-oref pm/polymode '-buffers)) + (unless (eq buf cbuf) + (with-current-buffer buf + (rename-buffer (pm--buffer-name (not (get-buffer-window buf 'visible))))))))) (pm--run-hooks-in-other-buffers polymode-run-these-after-save-functions-in-other-buffers 'after-save-hook)) diff --git a/polymode-methods.el b/polymode-methods.el index f7bf9b8871..d1f25c380f 100644 --- a/polymode-methods.el +++ b/polymode-methods.el @@ -69,7 +69,7 @@ Ran by the polymode mode function." (pm--mode-setup host-mode) (oset hostmode -buffer (current-buffer)) (oset config -hostmode hostmode) - (setq pm--core-buffer-name (buffer-name) + (setq pm--base-buffer-name (buffer-name) pm/polymode config pm/chunkmode hostmode pm/current t @@ -82,17 +82,13 @@ Ran by the polymode mode function." ;; (run-mode-hooks) ;; FIXME )) + (cl-defmethod pm-initialize ((chunkmode pm-inner-chunkmode) &optional type mode) "Initialization of the innermodes' (indirect) buffers." ;; run in chunkmode indirect buffer (setq mode (or mode (pm--get-innermode-mode chunkmode type))) - (let* ((pm-initialization-in-progress t) - (post-fix (replace-regexp-in-string "poly-\\|-mode" "" (symbol-name mode))) - (core-name (format "%s[%s]" (buffer-name (pm-base-buffer)) - (or (cdr (assoc post-fix polymode-mode-abbrev-aliases)) - post-fix))) - (new-name (generate-new-buffer-name core-name))) - (rename-buffer new-name) + (let* ((pm-initialization-in-progress t)) + (rename-buffer (pm--buffer-name)) ;; FIXME: Mode hooks and local var hacking happens here. Need to move it to ;; the end. But then font-lock is not activated and buffers not installed ;; correctly. @@ -102,8 +98,7 @@ Ran by the polymode mode function." (pm--move-vars '(pm/polymode buffer-file-coding-system) (pm-base-buffer)) ;; FIXME: This breaks if different chunkmodes use same-mode buffer. Even for ;; head/tail the value of pm/type will be wrong for tail - (setq pm--core-buffer-name core-name - pm/chunkmode chunkmode + (setq pm/chunkmode chunkmode pm/type (pm-true-span-type chunkmode type)) ;; FIXME: should not be here? (vc-refresh-state) @@ -115,7 +110,7 @@ Ran by the polymode mode function." ;; If this rename happens before the mode setup font-lock doesn't work in ;; inner buffers. (when pm-hide-implementation-buffers - (rename-buffer (generate-new-buffer-name (concat " " pm--core-buffer-name))))) + (rename-buffer (pm--buffer-name 'hidden)))) (pm--run-init-hooks chunkmode type 'polymode-init-inner-hook) ;; Call polymode mode for the sake of the keymap and hook. Same minor mode ;; which runs in the host buffer but without recursive call to `pm-initialize'.