Skip to content

Commit d33052d

Browse files
committed
Respect display-buffer-alist on first ghostel buffer
Fixes #179
1 parent 7c3fa5b commit d33052d

2 files changed

Lines changed: 51 additions & 8 deletions

File tree

lisp/ghostel.el

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3397,19 +3397,27 @@ prevent redraw flicker."
33973397

33983398
;;; Entry point
33993399

3400+
(defun ghostel--prepare-buffer (buffer &optional identity)
3401+
"Put BUFFER into `ghostel-mode' and record its terminal identity.
3402+
IDENTITY, if given, is stored as `ghostel--buffer-identity' so the
3403+
buffer can be found again after title-tracking renames it."
3404+
(with-current-buffer buffer
3405+
(unless (derived-mode-p 'ghostel-mode)
3406+
(ghostel-mode)
3407+
(setq ghostel--managed-buffer-name (buffer-name))
3408+
(setq ghostel--buffer-identity (or identity (buffer-name))))))
3409+
34003410
(defun ghostel--init-buffer (buffer &optional identity)
3401-
"Initialize BUFFER as a ghostel terminal if it isn't one already.
3411+
"Initialize BUFFER as a ghostel terminal if no terminal handle exists yet.
34023412
Terminal dimensions come from BUFFER's displayed window when one
34033413
exists, otherwise from the selected window. The terminal resizes
34043414
itself via `window-size-change-functions' once the buffer is
34053415
displayed, so a mismatch at creation time self-corrects.
34063416
IDENTITY, if given, is stored as `ghostel--buffer-identity' so the
34073417
buffer can be found again after title-tracking renames it."
34083418
(with-current-buffer buffer
3409-
(unless (derived-mode-p 'ghostel-mode)
3410-
(ghostel-mode)
3411-
(setq ghostel--managed-buffer-name (buffer-name))
3412-
(setq ghostel--buffer-identity (or identity (buffer-name)))
3419+
(unless ghostel--term
3420+
(ghostel--prepare-buffer buffer identity)
34133421
(let* ((w (or (get-buffer-window buffer t) (selected-window)))
34143422
(height (if (window-live-p w) (window-body-height w) 24))
34153423
(width (if (window-live-p w) (window-max-chars-per-line w) 80)))
@@ -3448,6 +3456,8 @@ The name of the buffer is determined by the value of `ghostel-buffer-name'."
34483456
(generate-new-buffer ghostel-buffer-name)
34493457
(or (ghostel--find-buffer-by-identity identity)
34503458
(get-buffer-create identity)))))
3459+
(unless (with-current-buffer buffer (derived-mode-p 'ghostel-mode))
3460+
(ghostel--prepare-buffer buffer identity))
34513461
(pop-to-buffer buffer (append display-buffer--same-window-action
34523462
'((category . comint))))
34533463
(ghostel--init-buffer buffer identity)))
@@ -3471,9 +3481,7 @@ Signals `user-error' if BUFFER already has a live ghostel process."
34713481
(buffer-name buffer)))
34723482
(let ((window (or (get-buffer-window buffer t) (selected-window))))
34733483
(with-current-buffer buffer
3474-
(unless (derived-mode-p 'ghostel-mode)
3475-
(ghostel-mode))
3476-
(setq ghostel--managed-buffer-name (buffer-name))
3484+
(ghostel--prepare-buffer buffer nil)
34773485
(let* ((height (max 1 (window-body-height window)))
34783486
(width (max 1 (window-max-chars-per-line window)))
34793487
(remote-p (file-remote-p default-directory)))

test/ghostel-test.el

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5217,6 +5217,40 @@ hand nil to the native module."
52175217
(buffer-local-value 'ghostel--buffer-identity buf))))
52185218
(kill-buffer buf))))
52195219

5220+
(ert-deftest ghostel-test-first-creation-respects-display-buffer-alist ()
5221+
"First `ghostel' creation exposes `ghostel-mode' to display rules."
5222+
(let ((saved (current-window-configuration))
5223+
(origin (generate-new-buffer " *ghostel-test-origin*"))
5224+
(ghostel-buffer-name "*ghostel-test-display*"))
5225+
(unwind-protect
5226+
(progn
5227+
(delete-other-windows)
5228+
(switch-to-buffer origin)
5229+
(let ((display-buffer-alist
5230+
`((,(lambda (buf _action)
5231+
(with-current-buffer buf
5232+
(derived-mode-p 'ghostel-mode)))
5233+
(display-buffer-pop-up-window)))))
5234+
(cl-letf (((symbol-function 'ghostel--load-module) #'ignore)
5235+
((symbol-function 'ghostel--new)
5236+
(lambda (&rest _) 'fake-term))
5237+
((symbol-function 'ghostel--apply-palette) #'ignore)
5238+
((symbol-function 'ghostel--start-process) #'ignore))
5239+
(ghostel)))
5240+
(let ((created (get-buffer ghostel-buffer-name)))
5241+
(should (buffer-live-p created))
5242+
(should (with-current-buffer created
5243+
(derived-mode-p 'ghostel-mode)))
5244+
(should (get-buffer-window origin))
5245+
(should (get-buffer-window created))
5246+
(should (not (eq (get-buffer-window origin)
5247+
(get-buffer-window created))))))
5248+
(when (get-buffer ghostel-buffer-name)
5249+
(kill-buffer ghostel-buffer-name))
5250+
(when (buffer-live-p origin)
5251+
(kill-buffer origin))
5252+
(set-window-configuration saved))))
5253+
52205254
;; -----------------------------------------------------------------------
52215255
;; Test: ghostel-copy-all copies to kill ring
52225256
;; -----------------------------------------------------------------------
@@ -7239,6 +7273,7 @@ while :; do sleep 0.1; done'\n")
72397273
ghostel-test-reuses-identity-match-after-rename
72407274
ghostel-test-project-reuses-identity-match-after-rename
72417275
ghostel-test-init-buffer-sets-identity
7276+
ghostel-test-first-creation-respects-display-buffer-alist
72427277
ghostel-test-copy-all
72437278
ghostel-test-copy-mode-buffer-navigation
72447279
ghostel-test-compile-module-invokes-zig-build

0 commit comments

Comments
 (0)