changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate emacs/lib/corfu-terminal.el

changeset 633: 88a3f078c185
author: Richard Westhaver <ellis@rwest.io>
date: Sun, 01 Sep 2024 21:00:12 -0400
permissions: -rw-r--r--
description: add corfu-terminal
633
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; corfu-terminal.el --- Corfu popup on terminal -*- lexical-binding: t; -*-
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;; Copyright (C) 2022 Akib Azmain Turja.
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;; Author: Akib Azmain Turja <akib@disroot.org>
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 ;; Created: 2022-04-11
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 ;; Version: 0.7
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
 ;; Package-Requires: ((emacs "26.1") (corfu "0.36") (popon "0.13"))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
 ;; Keywords: convenience
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
 ;; Homepage: https://codeberg.org/akib/emacs-corfu-terminal
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
 ;; This file is not part of GNU Emacs.
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
 ;; This file is free software; you can redistribute it and/or modify
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
 ;; it under the terms of the GNU General Public License as published by
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
 ;; the Free Software Foundation; either version 3, or (at your option)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
 ;; any later version.
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
 ;; This program is distributed in the hope that it will be useful,
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
 ;; GNU General Public License for more details.
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
 ;; For a full copy of the GNU General Public License
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
 ;; see <https://www.gnu.org/licenses/>.
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
 ;;; Commentary:
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
 ;; Corfu uses child frames to display candidates.  This makes Corfu
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
 ;; unusable on terminal.  This package replaces that with popup/popon,
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
 ;; which works everywhere.  Use M-x corfu-terminal-mode to enable.
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
 ;; You'll probably want to enable it only on terminal.  In that case,
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
 ;; put the following in your init file:
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
 ;;   (unless (display-graphic-p)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
 ;;     (corfu-terminal-mode +1))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
 ;;; Code:
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
 (require 'subr-x)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
 (require 'corfu)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
 (require 'popon)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
 (require 'cl-lib)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
 (defgroup corfu-terminal nil
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
   "Corfu popup on terminal."
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
   :group 'convenience
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
   :link '(url-link "https://codeberg.org/akib/emacs-corfu-terminal")
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
   :prefix "corfu-terminal-")
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
51
 (defcustom corfu-terminal-enable-on-minibuffer t
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
52
   "Non-nil means enable corfu-terminal on minibuffer."
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
53
   :type 'boolean)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
54
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
55
 (defcustom corfu-terminal-resize-minibuffer t
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
56
   "Non-nil means resize minibuffer to show popup."
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
57
   :type 'boolean)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
58
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
59
 (defcustom corfu-terminal-position-right-margin 0
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
60
   "Number of columns of margin at the right of window.
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
61
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
62
 Always keep the popup this many columns away from the right edge of
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
63
 the window.
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
64
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
65
 Note: If the popup breaks or crosses the right edge of window, you may
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
66
 set this variable to warkaround it.  But remember, that's a *bug*, so
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
67
 if that ever happens to you please report the issue at
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
68
 https://codeberg.org/akib/emacs-corfu-terminal/issues."
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
69
   :type 'integer)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
70
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
71
 (defcustom corfu-terminal-disable-on-gui t
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
72
   "Don't use popon UI on GUI."
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
73
   :type '(choice (const :tag "Yes" t)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
74
                  (const :tag "No" nil)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
75
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
76
 (defvar corfu-terminal--popon nil
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
77
   "Popon object.")
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
78
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
79
 (defvar corfu-terminal--last-position nil
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
80
   "Position of last popon, and some data to make sure that's valid.")
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
81
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
82
 (cl-defmethod corfu--popup-support-p (&context (corfu-terminal-mode
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
83
                                                 (eql t)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
84
   "Return whether corfu-terminal supports showing popon now."
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
85
   (or (not (minibufferp))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
86
       corfu-terminal-enable-on-minibuffer
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
87
       (and corfu-terminal-disable-on-gui
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
88
            (display-graphic-p))))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
89
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
90
 (cl-defmethod corfu--popup-hide (&context (corfu-terminal-mode
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
91
                                            (eql t)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
92
   "Hide popup.
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
93
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
94
 If `corfu-terminal-disable-on-gui' is non-nil and  `display-graphic-p'
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
95
 returns non-nil then call FN instead, where FN should be the original
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
96
 definition in Corfu."
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
97
   (if (and corfu-terminal-disable-on-gui
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
98
            (display-graphic-p))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
99
       (cl-call-next-method)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
100
     (when corfu-terminal--popon
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
101
       (setq corfu-terminal--popon
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
102
             (popon-kill corfu-terminal--popon)))))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
103
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
104
 (cl-defmethod corfu--popup-show ( pos off width lines
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
105
                                   &context (corfu-terminal-mode
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
106
                                             (eql t))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
107
                                   &optional curr lo bar)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
108
   "Show popup at OFF columns before POS.
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
109
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
110
 Show LINES, a list of lines.  Highlight CURRth line as current
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
111
 selection.  Show a vertical scroll bar of size BAR + 1 from LOth line.
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
112
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
113
 If `corfu-terminal-disable-on-gui' is non-nil and  `display-graphic-p'
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
114
 returns non-nil then call FN instead, where FN should be the original
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
115
 definition in Corfu."
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
116
   (if (and corfu-terminal-disable-on-gui
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
117
            (display-graphic-p))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
118
       (cl-call-next-method)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
119
     (corfu--popup-hide) ; Hide the popup first.
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
120
     (when (and (window-minibuffer-p)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
121
                (< (/ (window-body-height nil 'pixelwise)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
122
                      (default-font-height))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
123
                   (1+ (length lines)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
124
                corfu-terminal-resize-minibuffer
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
125
                (not (frame-root-window-p (selected-window))))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
126
       (window-resize nil (- (1+ (length lines))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
127
                             (/ (window-body-height nil 'pixelwise)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
128
                                (default-font-height)))))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
129
     (let* ((bar-width (ceiling (* (default-font-width)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
130
                                   corfu-bar-width)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
131
            (margin-left-width (ceiling (* (default-font-width)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
132
                                           corfu-left-margin-width)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
133
            (margin-right-width (max (ceiling
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
134
                                      (* (default-font-width)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
135
                                         corfu-right-margin-width))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
136
                                     bar-width))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
137
            (scroll-bar
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
138
             (when (< 0 bar-width)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
139
               (if (display-graphic-p)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
140
                   (concat
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
141
                    (propertize
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
142
                     " " 'display
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
143
                     `(space
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
144
                       :width (,(- margin-right-width bar-width))))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
145
                    (propertize " " 'display
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
146
                                `(space :width (,bar-width))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
147
                                'face 'corfu-bar))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
148
                 (concat
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
149
                  (make-string (- margin-right-width bar-width) ?\ )
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
150
                  (propertize (make-string bar-width ?\ ) 'face
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
151
                              'corfu-bar)))))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
152
            (margin-left
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
153
             (when (> margin-left-width 0)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
154
               (if (display-graphic-p)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
155
                   (propertize
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
156
                    " " 'display `(space :width (,margin-left-width)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
157
                 (make-string margin-left-width ?\ ))))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
158
            (margin-right
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
159
             (when (> margin-right-width 0)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
160
               (if (display-graphic-p)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
161
                   (propertize
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
162
                    " " 'display `(space :width (,margin-right-width)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
163
                 (make-string margin-right-width ?\ ))))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
164
            (popon-width
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
165
             (if (display-graphic-p)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
166
                 (+ width (round (/ (+ margin-left-width
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
167
                                       margin-right-width)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
168
                                    (default-font-width))))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
169
               (+ width margin-left-width margin-right-width)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
170
            (popon-pos
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
171
             (if (equal (cdr corfu-terminal--last-position)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
172
                        (list (posn-point pos) popon-width
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
173
                              (window-start) (buffer-modified-tick)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
174
                 (car corfu-terminal--last-position)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
175
               (let ((x-y (popon-x-y-at-posn pos)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
176
                 (cons
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
177
                  (max
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
178
                   (min (- (car x-y) (+ off margin-left-width))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
179
                        (- (window-max-chars-per-line)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
180
                           corfu-terminal-position-right-margin
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
181
                           popon-width))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
182
                   0)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
183
                  (if (and (< (/ (window-body-height nil 'pixelwise)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
184
                                 (default-font-height))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
185
                              (+ (1+ (cdr x-y)) (length lines)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
186
                           (>= (cdr x-y) (length lines)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
187
                      (- (cdr x-y) (length lines))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
188
                    (1+ (cdr x-y))))))))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
189
       (setq corfu-terminal--last-position
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
190
             (list popon-pos (posn-point pos) popon-width
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
191
                   (window-start) (buffer-modified-tick)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
192
       (setq corfu-terminal--popon
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
193
             (popon-create
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
194
              (cons
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
195
               (string-join
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
196
                (seq-map-indexed
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
197
                 (lambda (line line-number)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
198
                   (let ((str
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
199
                          (concat
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
200
                           margin-left line
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
201
                           (make-string (- width (string-width line))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
202
                                        ?\ )
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
203
                           (if (and lo (<= lo line-number (+ lo bar)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
204
                               scroll-bar
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
205
                             margin-right))))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
206
                     (add-face-text-property 0 (length str)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
207
                                             (if (eq line-number curr)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
208
                                                 'corfu-current
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
209
                                               'corfu-default)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
210
                                             t str)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
211
                     str))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
212
                 lines)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
213
                "\n")
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
214
               popon-width)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
215
              popon-pos))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
216
       nil)))
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
217
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
218
 ;;;###autoload
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
219
 (define-minor-mode corfu-terminal-mode
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
220
   "Corfu popup on terminal."
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
221
   :global t
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
222
   :group 'corfu-terminal)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
223
 
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
224
 (provide 'corfu-terminal)
88a3f078c185 add corfu-terminal
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
225
 ;;; corfu-terminal.el ends here