tp/tp-tests-utils.el
2025-10-13 00:15:18 +08:00

60 lines
2.0 KiB
EmacsLisp

(defvar pop-buffer-insert-buffer
"*pop-buffer-insert*")
(defvar pop-buffer-win-conf nil)
(defun my-pop-to-buffer (buffer-or-name &optional action norecord)
(declare (indent defun))
(let ((buffer (pop-to-buffer buffer-or-name action norecord)))
(with-current-buffer buffer
(local-set-key "q" 'pop-buffer-quit))
buffer))
(defun remove-from-list (list-var element)
(set list-var (delete element (symbol-value list-var))))
(defun pop-buffer-quit ()
(interactive)
(let ((win-conf pop-buffer-win-conf))
(local-unset-key "q")
(setq-local pop-buffer-win-conf nil)
(remove-from-list 'margin-work-modes 'quick-buffer-mode)
(set-window-configuration win-conf)))
(defmacro with-pop-buffer (buffer-or-name height &rest body)
(declare (indent defun))
`(let* ((win-conf (current-window-configuration))
(height ,height)
(buffer (my-pop-to-buffer ,buffer-or-name
`(,@(if height
`(display-buffer-at-bottom
(cons window-height height))
`(display-buffer-full-frame))))))
(add-to-list 'margin-work-modes 'quick-buffer-mode)
(with-current-buffer buffer
(setq major-mode 'quick-buffer-mode)
(setq-local pop-buffer-win-conf win-conf)
(let ((inhibit-read-only t))
(erase-buffer)
,@body)
(read-only-mode 1))))
(defun pop-buffer-insert (height &rest body)
(declare (indent defun))
(if (member pop-buffer-insert-buffer
(mapcar #'buffer-name (window-buffers)))
(let ((inhibit-read-only t))
(select-window (get-buffer-window
pop-buffer-insert-buffer))
(erase-buffer)
(apply #'insert body))
(with-pop-buffer pop-buffer-insert-buffer height
(apply #'insert body))))
(defmacro pop-buffer-do (height &rest body)
(declare (indent defun))
`(with-pop-buffer ,pop-buffer-insert-buffer ,height
,@body))
(provide 'tp-tests-utils)