summaryrefslogtreecommitdiffhomepage
path: root/lib/eos/jao-buffers.el
blob: c3f406362733deae854b8d466d945b037326d1b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
;;; jao-buffers.el --- deal with buffers and windows  -*- lexical-binding: t; -*-

;; Copyright (C) 2026  Jose Antonio Ortega Ruiz

;; Author: Jose Antonio Ortega Ruiz <mail@jao.io>
;; Keywords: files

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <https://www.gnu.org/licenses/>.

;;; Code:

(require 'eldoc)

;;;; lines

;;;###autoload
(defun jao-goto-visible-line (n)
  (interactive "NGo to line: ")
  (goto-char (point-min))
  (forward-visible-line n))

;;;; attached buffers
(defun jao-display-buffer-below-selected (buffer alist)
  (delete-other-windows-vertically)
  (display-buffer-below-selected buffer alist))

(defun jao-display-below-eldoc (buffer alist)
  (let ((w (selected-window)))
    (pop-to-buffer (eldoc-doc-buffer) nil t)
    (jao-display-buffer-below-selected buffer alist)
    (select-window w t)))

(defun jao-attached-buffer-entry (name-rx height)
  `(,name-rx (display-buffer-reuse-window
              jao-display-buffer-below-selected)
             (window-height . ,(or height 25))))

;;;###autoload
(defmacro jao-with-attached-buffer (name-rx height &rest body)
  (declare (indent defun))
  `(let ((display-buffer-alist '(,(jao-attached-buffer-entry name-rx height))))
     ,@body))

;;;###autoload
(defun jao-define-attached-buffer (name-rx &optional height)
  (add-to-list 'display-buffer-alist
               (jao-attached-buffer-entry name-rx height)))

;;;; eldoc
;;;###autoload
(defun jao-eldoc-toggle ()
  "Toggle eldoc's documentation buffer."
  (interactive)
  (let ((buffer (eldoc-doc-buffer)))
    (if-let* ((w (and buffer (get-buffer-window buffer))))
        (delete-window w)
      (eldoc-doc-buffer t))))

;;;###autoload
(add-to-list 'display-buffer-alist
             '("\\*eldoc\\( .*\\)?\\*"
               (display-buffer-reuse-window)
               (dedicated . t)))

(defsubst jao-eldoc-window () (get-buffer-window (eldoc-doc-buffer)))

;;;###autoload
(defun jao-clear-below-eldoc ()
  "Delete any windows below the eldoc buffer, if visible"
  (interactive)
  (unless (jao-eldoc-window) (jao-eldoc-toggle))
  (delete-other-windows-vertically (jao-eldoc-window)))

;;;###autoload
(defun jao-attach-below-eldoc (rx &optional h)
  (add-to-list 'display-buffer-alist
               `(,rx
                 (display-buffer-reuse-window jao-display-below-eldoc)
                 (height . (or ,h 0.5)))))

;;;; same mode
;;;###autoload
(defun jao-buffer-same-mode (&optional mode pre-fn switch-fn)
  (interactive)
  (let* ((mode (or mode major-mode))
         (modes (if (symbolp mode) (list mode) mode))
         (pred `(lambda (b)
                  (let ((b (get-buffer (if (consp b) (car b) b))))
                    (member (buffer-local-value 'major-mode b)
                            ',modes))))
         (buff (read-buffer "Buffer: " nil t pred)))
    (when pre-fn (funcall pre-fn))
    (if switch-fn (funcall switch-fn buff) (switch-to-buffer buff))))

;;;###autoload
(defun jao-buffer-same-mode-cmd (&optional pop)
  (interactive "P")
  (jao-buffer-same-mode nil nil (and pop #'pop-to-buffer)))

(provide 'jao-buffers)
;;; jao-buffers.el ends here