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'.

Reply via email to