60 lines
2.0 KiB
EmacsLisp
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)
|