-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathcodex-ide-session-list.el
More file actions
147 lines (123 loc) · 5.5 KB
/
Copy pathcodex-ide-session-list.el
File metadata and controls
147 lines (123 loc) · 5.5 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
;;; codex-ide-session-list.el --- Shared tabulated session list UI -*- lexical-binding: t; -*-
;;; Commentary:
;; Shared `tabulated-list-mode' helpers used by Codex session list buffers.
;;; Code:
(require 'codex-ide)
(require 'hl-line)
(require 'tabulated-list)
(defvar codex-ide-display-buffer-pop-up-action)
(defvar codex-ide--display-buffer-other-window-pop-up-action)
(defface codex-ide-session-list-primary-face
'((t :inherit default :weight semibold))
"Face used for the primary column in Codex list views."
:group 'codex-ide)
(defface codex-ide-session-list-secondary-face
'((t :inherit shadow))
"Face used for secondary columns in Codex list views."
:group 'codex-ide)
(defface codex-ide-session-list-id-face
'((t :inherit font-lock-constant-face))
"Face used for thread and identifier columns in Codex list views."
:group 'codex-ide)
(defface codex-ide-session-list-status-face
'((t :inherit font-lock-keyword-face :weight semibold))
"Face used for status columns in Codex list views."
:group 'codex-ide)
(defface codex-ide-session-list-time-face
'((t :inherit font-lock-doc-face))
"Face used for timestamp columns in Codex list views."
:group 'codex-ide)
(defface codex-ide-session-list-current-row-face
'((((class color) (background light))
:background "#f2f5e9")
(((class color) (background dark))
:background "#2a3126"))
"Face used to highlight the current row in Codex list views."
:group 'codex-ide)
(defvar-local codex-ide-session-list--entries-function nil
"Function that returns `tabulated-list-entries' for the current buffer.")
(defvar-local codex-ide-session-list--visit-function nil
"Function called with the current row id when visiting an entry.")
(defvar codex-ide-session-list-mode-map
(make-sparse-keymap)
"Keymap for `codex-ide-session-list-mode'.")
(set-keymap-parent codex-ide-session-list-mode-map tabulated-list-mode-map)
(define-key codex-ide-session-list-mode-map
(kbd "RET")
#'codex-ide-session-list-display-session-at-point)
(define-key codex-ide-session-list-mode-map
(kbd "M-<return>")
#'codex-ide-session-list-display-session-at-point-other-window)
(define-key codex-ide-session-list-mode-map
(kbd "C-M-j")
#'codex-ide-session-list-display-session-at-point-other-window)
(define-derived-mode codex-ide-session-list-mode tabulated-list-mode "Codex-Session-List"
"Parent mode for Codex session list buffers.")
(defun codex-ide-session-list-cell (text face)
"Return TEXT propertized with FACE for a tabulated list cell."
(propertize (or text "") 'face face))
(defun codex-ide-session-list--tabulated-entries ()
"Return tabulated list entries for the current buffer."
(unless (functionp codex-ide-session-list--entries-function)
(error "No Codex session list entries function configured"))
(funcall codex-ide-session-list--entries-function))
(defun codex-ide-session-list-display-session-at-point ()
"Display the session for the row at point."
(interactive)
(unless (functionp codex-ide-session-list--visit-function)
(user-error "Nothing to visit in this list"))
(let ((id (tabulated-list-get-id)))
(unless id
(user-error "No list entry at point"))
(funcall codex-ide-session-list--visit-function id)))
(defun codex-ide-session-list-display-session-at-point-other-window ()
"Display the session for the row at point in another window."
(interactive)
(let ((codex-ide-display-buffer-pop-up-action
codex-ide--display-buffer-other-window-pop-up-action))
(codex-ide-session-list-display-session-at-point)))
(defun codex-ide-session-list-selected-ids ()
"Return ids from the current row or every row touched by the active region."
(if (use-region-p)
(let ((ids nil)
(end (max (region-beginning) (1- (region-end)))))
(save-excursion
(goto-char (region-beginning))
(beginning-of-line)
(while (<= (point) end)
(when-let* ((id (tabulated-list-get-id)))
(push id ids))
(forward-line 1)))
(or (nreverse ids)
(user-error "No list entries in region")))
(let ((id (tabulated-list-get-id)))
(unless id
(user-error "No list entry at point"))
(list id))))
(defun codex-ide-session-list--setup
(buffer-name mode format entries-function visit-function
&optional sort-key setup-function)
"Create and return a session list buffer.
BUFFER-NAME names the buffer. MODE is the major mode function to call.
FORMAT is assigned to `tabulated-list-format'. ENTRIES-FUNCTION computes
the rows, and VISIT-FUNCTION handles session display commands. SORT-KEY initializes
`tabulated-list-sort-key' when non-nil. SETUP-FUNCTION is called in the
buffer before the first render when non-nil."
(let ((buffer (get-buffer-create buffer-name)))
(with-current-buffer buffer
(funcall mode)
(setq tabulated-list-format format
tabulated-list-padding 2
tabulated-list-sort-key sort-key
hl-line-face 'codex-ide-session-list-current-row-face
codex-ide-session-list--entries-function entries-function
codex-ide-session-list--visit-function visit-function
tabulated-list-entries #'codex-ide-session-list--tabulated-entries)
(hl-line-mode 1)
(when (functionp setup-function)
(funcall setup-function))
(tabulated-list-init-header)
(tabulated-list-print t))
buffer))
(provide 'codex-ide-session-list)
;;; codex-ide-session-list.el ends here