Yee Cheng Chin | e700dde | 2025-02-20 21:58:21 +0100 | [diff] [blame] | 1 | *popup.txt* For Vim version 9.1. Last change: 2025 Feb 20 |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 2 | |
| 3 | |
| 4 | VIM REFERENCE MANUAL by Bram Moolenaar |
| 5 | |
| 6 | |
Bram Moolenaar | 9135901 | 2019-11-30 17:57:03 +0100 | [diff] [blame] | 7 | Displaying text in a floating window. *popup* *popup-window* *popupwin* |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 8 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 9 | |
| 10 | 1. Introduction |popup-intro| |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 11 | Window position and size |popup-position| |
| 12 | Closing the popup window |popup-close| |
| 13 | Popup buffer and window |popup-buffer| |
Bram Moolenaar | 560979e | 2020-02-04 22:53:05 +0100 | [diff] [blame] | 14 | Terminal in popup window |popup-terminal| |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 15 | 2. Functions |popup-functions| |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 16 | Details |popup-function-details| |
| 17 | 3. Usage |popup-usage| |
| 18 | popup_create() arguments |popup_create-arguments| |
| 19 | Popup text properties |popup-props| |
Bram Moolenaar | 12034e2 | 2019-08-25 22:25:02 +0200 | [diff] [blame] | 20 | Position popup with textprop |popup-textprop-pos| |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 21 | Popup filter |popup-filter| |
| 22 | Popup callback |popup-callback| |
| 23 | Popup scrollbar |popup-scrollbar| |
| 24 | Popup mask |popup-mask| |
| 25 | 4. Examples |popup-examples| |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 26 | |
| 27 | |
Bram Moolenaar | 4ceaa3a | 2019-12-03 22:49:09 +0100 | [diff] [blame] | 28 | {not available if the |+popupwin| feature was disabled at compile time} |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 29 | |
| 30 | ============================================================================== |
| 31 | 1. Introduction *popup-intro* |
| 32 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 33 | We are talking about popup windows here, text that goes on top of the regular |
| 34 | windows and is under control of a plugin. You cannot edit the text in the |
| 35 | popup window like with regular windows. |
| 36 | |
| 37 | A popup window can be used for such things as: |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 38 | - briefly show a message without overwriting the command line |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 39 | - prompt the user with a dialog |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 40 | - display contextual information while typing |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 41 | - give extra information for auto-completion |
| 42 | |
| 43 | The text in the popup window can be colored with |text-properties|. It is |
| 44 | also possible to use syntax highlighting. |
| 45 | |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 46 | The default color used is "Pmenu". If you prefer something else use the |
| 47 | "highlight" argument or the 'wincolor' option, e.g.: > |
| 48 | hi MyPopupColor ctermbg=lightblue guibg=lightblue |
| 49 | call setwinvar(winid, '&wincolor', 'MyPopupColor') |
| 50 | |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 51 | 'hlsearch' highlighting is not displayed in a popup window. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 52 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 53 | A popup window has a window-ID like other windows, but behaves differently. |
| 54 | The size can be up to the whole Vim window and it overlaps other windows. |
Bram Moolenaar | fc06cbb | 2019-06-15 14:14:31 +0200 | [diff] [blame] | 55 | Popup windows can also overlap each other. The "zindex" property specifies |
| 56 | what goes on top of what. |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 57 | *E366* |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 58 | The popup window contains a buffer, and that buffer is always associated with |
Bram Moolenaar | fc06cbb | 2019-06-15 14:14:31 +0200 | [diff] [blame] | 59 | the popup window. The window cannot be in Normal, Visual or Insert mode, it |
| 60 | does not get keyboard focus. You can use functions like `setbufline()` to |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 61 | change the text in the buffer. There are more differences from how this |
| 62 | window and buffer behave compared to regular windows and buffers, see |
| 63 | |popup-buffer|. |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 64 | |
| 65 | If this is not what you are looking for, check out other popup functionality: |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 66 | - popup menu, see |popup-menu| |
| 67 | - balloon, see |balloon-eval| |
| 68 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 69 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 70 | WINDOW POSITION AND SIZE *popup-position* |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 71 | |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 72 | The height of the window is normally equal to the number of, possibly |
| 73 | wrapping, lines in the buffer. It can be limited with the "maxheight" |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 74 | property. You can use empty lines to increase the height or the "minheight" |
| 75 | property. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 76 | |
Bram Moolenaar | e7b1ea0 | 2020-08-07 19:54:59 +0200 | [diff] [blame] | 77 | The width of the window is normally equal to the longest visible line in the |
| 78 | buffer. It can be limited with the "maxwidth" property. You can use spaces |
| 79 | to increase the width or use the "minwidth" property. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 80 | |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 81 | By default the 'wrap' option is set, so that no text disappears. Otherwise, |
| 82 | if there is not enough space then the window is shifted left in order to |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 83 | display more text. When right-aligned the window is shifted right to display |
| 84 | more text. The shifting can be disabled with the "fixed" property. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 85 | |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 86 | Vim tries to show the popup in the location you specify. In some cases, e.g. |
| 87 | when the popup would go outside of the Vim window, it will show it somewhere |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 88 | nearby. E.g. if you use `popup_atcursor()` the popup normally shows just above |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 89 | the current cursor position, but if the cursor is close to the top of the Vim |
| 90 | window it will be placed below the cursor position. |
| 91 | |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 92 | When the screen scrolls up for output of an Ex command, popups move too, so |
| 93 | that they will not cover the output. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 94 | |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 95 | The current cursor position is displayed even when it is under a popup window. |
| 96 | That way you can still see where it is, even though you cannot see the text |
| 97 | that it is in. |
Bram Moolenaar | 868b7b6 | 2019-05-29 21:44:40 +0200 | [diff] [blame] | 98 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 99 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 100 | CLOSING THE POPUP WINDOW *popup-close* |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 101 | |
| 102 | Normally the plugin that created the popup window is also in charge of closing |
| 103 | it. If somehow a popup hangs around, you can close all of them with: > |
Bram Moolenaar | 4466ad6 | 2020-11-21 13:16:30 +0100 | [diff] [blame] | 104 | call popup_clear(1) |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 105 | Some popups, such as notifications, close after a specified time. This can be |
| 106 | set with the "time" property on `popup_create()`. |
| 107 | Otherwise, a popup can be closed by clicking on the X in the top-right corner |
| 108 | or by clicking anywhere inside the popup. This must be enabled with the |
| 109 | "close" property. It is set by default for notifications. |
| 110 | |
| 111 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 112 | POPUP BUFFER AND WINDOW *popup-buffer* |
| 113 | |
| 114 | If a popup function is called to create a popup from text, a new buffer is |
| 115 | created to hold the text and text properties of the popup window. The buffer |
| 116 | is always associated with the popup window and manipulation is restricted: |
| 117 | - the buffer has no name |
| 118 | - 'buftype' is "popup" |
| 119 | - 'swapfile' is off |
| 120 | - 'bufhidden' is "hide" |
| 121 | - 'buflisted' is off |
| 122 | - 'undolevels' is -1: no undo at all |
| 123 | - all other buffer-local and window-local options are set to their Vim default |
| 124 | value. |
| 125 | |
| 126 | It is possible to change the specifically mentioned options, but anything |
| 127 | might break then, so better leave them alone. |
| 128 | |
Bram Moolenaar | 06fe74a | 2019-08-31 16:20:32 +0200 | [diff] [blame] | 129 | The window does have a cursor position, but the cursor is not displayed. In |
| 130 | fact, the cursor in the underlying window is displayed, as if it peeks through |
| 131 | the popup, so you can see where it is. |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 132 | |
| 133 | To execute a command in the context of the popup window and buffer use |
| 134 | `win_execute()`. Example: > |
| 135 | call win_execute(winid, 'syntax enable') |
| 136 | |
| 137 | Options can be set on the window with `setwinvar()`, e.g.: > |
| 138 | call setwinvar(winid, '&wrap', 0) |
| 139 | And options can be set on the buffer with `setbufvar()`, e.g.: > |
| 140 | call setbufvar(winbufnr(winid), '&filetype', 'java') |
Bram Moolenaar | e0d749a | 2019-09-25 22:14:48 +0200 | [diff] [blame] | 141 | You can also use `win_execute()` with a ":setlocal" command. |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 142 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 143 | |
Bram Moolenaar | 560979e | 2020-02-04 22:53:05 +0100 | [diff] [blame] | 144 | TERMINAL IN POPUP WINDOW *popup-terminal* |
| 145 | |
| 146 | A special case is running a terminal in a popup window. Many rules are then |
| 147 | different: *E863* |
| 148 | - The popup window always has focus, it is not possible to switch to another |
| 149 | window. |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 150 | - When the job ends, the popup window shows the buffer in Terminal-Normal |
| 151 | mode. Use `:q` to close it or use "term_finish" value "close". |
Bram Moolenaar | 11ec807 | 2020-02-20 20:12:29 +0100 | [diff] [blame] | 152 | - The popup window can be closed with `popup_close()`, the terminal buffer |
| 153 | then becomes hidden. |
Bram Moolenaar | b5383b1 | 2020-05-18 19:46:48 +0200 | [diff] [blame] | 154 | - It is not possible to open a second popup window with a terminal. *E861* |
Bram Moolenaar | 560979e | 2020-02-04 22:53:05 +0100 | [diff] [blame] | 155 | - The default Pmenu color is only used for the border and padding. To change |
Bram Moolenaar | 191acfd | 2020-03-27 20:42:43 +0100 | [diff] [blame] | 156 | the color of the terminal itself set the Terminal highlight group before |
| 157 | creating the terminal. Setting 'wincolor' later can work but requires the |
| 158 | program in the terminal to redraw everything. |
Bram Moolenaar | ff78155 | 2020-03-19 20:37:11 +0100 | [diff] [blame] | 159 | - The default minimal size is 5 lines of 20 characters; Use the "minwidth" and |
| 160 | "minheight" parameters to set a different value. |
Bram Moolenaar | 191acfd | 2020-03-27 20:42:43 +0100 | [diff] [blame] | 161 | - The terminal size will grow if the program running in the terminal writes |
| 162 | text. Set "maxheight" and "maxwidth" to restrict the size. |
Bram Moolenaar | 560979e | 2020-02-04 22:53:05 +0100 | [diff] [blame] | 163 | |
| 164 | To run a terminal in a popup window, first create the terminal hidden. Then |
| 165 | pass the buffer number to popup_create(). Example: > |
Bram Moolenaar | 191acfd | 2020-03-27 20:42:43 +0100 | [diff] [blame] | 166 | hi link Terminal Search |
Bram Moolenaar | 560979e | 2020-02-04 22:53:05 +0100 | [diff] [blame] | 167 | let buf = term_start(['picker', 'Something'], #{hidden: 1, term_finish: 'close'}) |
| 168 | let winid = popup_create(buf, #{minwidth: 50, minheight: 20}) |
Bram Moolenaar | 560979e | 2020-02-04 22:53:05 +0100 | [diff] [blame] | 169 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 170 | ============================================================================== |
| 171 | 2. Functions *popup-functions* |
| 172 | |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 173 | Creating a popup window: |
| 174 | |popup_create()| centered in the screen |
| 175 | |popup_atcursor()| just above the cursor position, closes when |
| 176 | the cursor moves away |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 177 | |popup_beval()| at the position indicated by v:beval_ |
| 178 | variables, closes when the mouse moves away |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 179 | |popup_notification()| show a notification for three seconds |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 180 | |popup_dialog()| centered with padding and border |
| 181 | |popup_menu()| prompt for selecting an item from a list |
| 182 | |
| 183 | Manipulating a popup window: |
| 184 | |popup_hide()| hide a popup temporarily |
| 185 | |popup_show()| show a previously hidden popup |
| 186 | |popup_move()| change the position and size of a popup |
| 187 | |popup_setoptions()| override options of a popup |
Bram Moolenaar | dc2ce58 | 2019-06-16 15:32:14 +0200 | [diff] [blame] | 188 | |popup_settext()| replace the popup buffer contents |
Christian Brabandt | fbc37f1 | 2024-06-18 20:50:58 +0200 | [diff] [blame] | 189 | |popup_setbuf()| set the buffer for the popup window |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 190 | |
| 191 | Closing popup windows: |
| 192 | |popup_close()| close one popup |
| 193 | |popup_clear()| close all popups |
| 194 | |
| 195 | Filter functions: |
| 196 | |popup_filter_menu()| select from a list of items |
| 197 | |popup_filter_yesno()| blocks until 'y' or 'n' is pressed |
| 198 | |
| 199 | Other: |
| 200 | |popup_getoptions()| get current options for a popup |
| 201 | |popup_getpos()| get actual position and size of a popup |
Bram Moolenaar | b4f0628 | 2019-07-12 21:07:54 +0200 | [diff] [blame] | 202 | |popup_locate()| find popup window at a screen position |
Bram Moolenaar | ef6b979 | 2020-05-13 16:34:15 +0200 | [diff] [blame] | 203 | |popup_list()| get list of all popups |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 204 | |
| 205 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 206 | DETAILS *popup-function-details* |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 207 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 208 | popup_atcursor({what}, {options}) *popup_atcursor()* |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 209 | Show the {what} above the cursor, and close it when the cursor |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 210 | moves. This works like: > |
Bram Moolenaar | 4c6d904 | 2019-07-16 22:04:02 +0200 | [diff] [blame] | 211 | call popup_create({what}, #{ |
Bram Moolenaar | 396e829 | 2019-07-13 23:04:31 +0200 | [diff] [blame] | 212 | \ pos: 'botleft', |
| 213 | \ line: 'cursor-1', |
| 214 | \ col: 'cursor', |
| 215 | \ moved: 'WORD', |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 216 | \ }) |
| 217 | < Use {options} to change the properties. |
Bram Moolenaar | 4dd8fe0 | 2019-11-09 15:33:31 +0100 | [diff] [blame] | 218 | If "pos" is passed as "topleft" then the default for "line" |
| 219 | becomes "cursor+1". |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 220 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 221 | Can also be used as a |method|: > |
| 222 | GetText()->popup_atcursor({}) |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 223 | < |
| 224 | Return type: |Number| |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 225 | |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 226 | |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 227 | popup_beval({what}, {options}) *popup_beval()* |
| 228 | Show the {what} above the position from 'ballooneval' and |
| 229 | close it when the mouse moves. This works like: > |
| 230 | let pos = screenpos(v:beval_winnr, v:beval_lnum, v:beval_col) |
Bram Moolenaar | 4c6d904 | 2019-07-16 22:04:02 +0200 | [diff] [blame] | 231 | call popup_create({what}, #{ |
Bram Moolenaar | 396e829 | 2019-07-13 23:04:31 +0200 | [diff] [blame] | 232 | \ pos: 'botleft', |
| 233 | \ line: pos.row - 1, |
| 234 | \ col: pos.col, |
| 235 | \ mousemoved: 'WORD', |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 236 | \ }) |
| 237 | < Use {options} to change the properties. |
Bram Moolenaar | 8fe1000 | 2019-09-11 22:56:44 +0200 | [diff] [blame] | 238 | See |popup_beval_example| for an example. |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 239 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 240 | Can also be used as a |method|: > |
| 241 | GetText()->popup_beval({}) |
| 242 | < |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 243 | Return type: |Number| |
| 244 | |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 245 | *popup_clear()* |
Bram Moolenaar | 03a9f84 | 2020-05-13 13:40:16 +0200 | [diff] [blame] | 246 | popup_clear([{force}]) |
| 247 | Emergency solution to a misbehaving plugin: close all popup |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 248 | windows for the current tab and global popups. |
Bram Moolenaar | 03a9f84 | 2020-05-13 13:40:16 +0200 | [diff] [blame] | 249 | Close callbacks are not invoked. |
| 250 | When {force} is not present this will fail if the current |
| 251 | window is a popup. |
| 252 | When {force} is present and |TRUE| the popup is also closed |
| 253 | when it is the current window. If a terminal is running in a |
| 254 | popup it is killed. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 255 | |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 256 | Return type: |Number| |
| 257 | |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 258 | |
| 259 | popup_close({id} [, {result}]) *popup_close()* |
Christian Brabandt | 1f045f3 | 2025-01-08 14:09:02 +0100 | [diff] [blame] | 260 | Close popup {id}. The window will be deleted. The associated |
| 261 | buffer will be deleted, if the popup created a new buffer. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 262 | |
| 263 | If the popup has a callback it will be called just before the |
| 264 | popup window is deleted. If the optional {result} is present |
| 265 | it will be passed as the second argument of the callback. |
| 266 | Otherwise zero is passed to the callback. |
| 267 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 268 | Can also be used as a |method|: > |
| 269 | GetPopup()->popup_close() |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 270 | < |
| 271 | Return type: |Number| |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 272 | |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 273 | |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 274 | popup_create({what}, {options}) *popup_create()* |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 275 | Open a popup window showing {what}, which is either: *E450* |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 276 | - a buffer number |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 277 | - a string |
| 278 | - a list of strings |
| 279 | - a list of text lines with text properties |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 280 | When {what} is not a buffer number, a buffer is created with |
| 281 | 'buftype' set to "popup". That buffer will be wiped out once |
| 282 | the popup closes. |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 283 | |
Bram Moolenaar | 188639d | 2022-04-04 16:57:21 +0100 | [diff] [blame] | 284 | if {what} is a buffer number and loading the buffer runs into |
| 285 | an existing swap file, it is silently opened read-only, as if |
| 286 | a |SwapExists| autocommand had set |v:swapchoice| to 'o'. |
| 287 | This is because we assume the buffer is only used for viewing. |
| 288 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 289 | {options} is a dictionary with many possible entries. |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 290 | See |popup_create-arguments| for details. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 291 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 292 | Returns a window-ID, which can be used with other popup |
| 293 | functions. Use `winbufnr()` to get the number of the buffer |
| 294 | in the window: > |
| 295 | let winid = popup_create('hello', {}) |
| 296 | let bufnr = winbufnr(winid) |
| 297 | call setbufline(bufnr, 2, 'second line') |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 298 | < In case of failure zero is returned. |
| 299 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 300 | Can also be used as a |method|: > |
| 301 | GetText()->popup_create({}) |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 302 | < |
| 303 | Return type: |Number| |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 304 | |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 305 | |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 306 | popup_dialog({what}, {options}) *popup_dialog()* |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 307 | Just like |popup_create()| but with these default options: > |
Bram Moolenaar | 4c6d904 | 2019-07-16 22:04:02 +0200 | [diff] [blame] | 308 | call popup_create({what}, #{ |
Bram Moolenaar | 396e829 | 2019-07-13 23:04:31 +0200 | [diff] [blame] | 309 | \ pos: 'center', |
| 310 | \ zindex: 200, |
| 311 | \ drag: 1, |
| 312 | \ border: [], |
| 313 | \ padding: [], |
Bram Moolenaar | 749fa0a | 2019-08-03 16:18:07 +0200 | [diff] [blame] | 314 | \ mapping: 0, |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 315 | \}) |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 316 | < Use {options} to change the properties. E.g. add a 'filter' |
Bram Moolenaar | a42d945 | 2019-06-15 21:46:30 +0200 | [diff] [blame] | 317 | option with value 'popup_filter_yesno'. Example: > |
Bram Moolenaar | 4c6d904 | 2019-07-16 22:04:02 +0200 | [diff] [blame] | 318 | call popup_create('do you want to quit (Yes/no)?', #{ |
Bram Moolenaar | 396e829 | 2019-07-13 23:04:31 +0200 | [diff] [blame] | 319 | \ filter: 'popup_filter_yesno', |
| 320 | \ callback: 'QuitCallback', |
Bram Moolenaar | a42d945 | 2019-06-15 21:46:30 +0200 | [diff] [blame] | 321 | \ }) |
| 322 | |
| 323 | < By default the dialog can be dragged, so that text below it |
| 324 | can be read if needed. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 325 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 326 | Can also be used as a |method|: > |
| 327 | GetText()->popup_dialog({}) |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 328 | < |
| 329 | Return type: |Number| |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 330 | |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 331 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 332 | popup_filter_menu({id}, {key}) *popup_filter_menu()* |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 333 | Filter that can be used for a popup. These keys can be used: |
Bram Moolenaar | 014f698 | 2021-01-04 13:18:30 +0100 | [diff] [blame] | 334 | j <Down> <C-N> select item below |
| 335 | k <Up> <C-P> select item above |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 336 | <Space> <Enter> accept current selection |
| 337 | x Esc CTRL-C cancel the menu |
| 338 | Other keys are ignored. |
Bram Moolenaar | cb80aa2 | 2020-10-26 21:12:46 +0100 | [diff] [blame] | 339 | Always returns |v:true|. |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 340 | |
| 341 | A match is set on that line to highlight it, see |
| 342 | |popup_menu()|. |
| 343 | |
| 344 | When the current selection is accepted the "callback" of the |
| 345 | popup menu is invoked with the index of the selected line as |
| 346 | the second argument. The first entry has index one. |
| 347 | Cancelling the menu invokes the callback with -1. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 348 | |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 349 | To add shortcut keys, see the example here: |
| 350 | |popup_menu-shortcut-example| |
| 351 | |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 352 | Return type: |Number| |
| 353 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 354 | |
| 355 | popup_filter_yesno({id}, {key}) *popup_filter_yesno()* |
| 356 | Filter that can be used for a popup. It handles only the keys |
| 357 | 'y', 'Y' and 'n' or 'N'. Invokes the "callback" of the |
| 358 | popup menu with the 1 for 'y' or 'Y' and zero for 'n' or 'N' |
Bram Moolenaar | a42d945 | 2019-06-15 21:46:30 +0200 | [diff] [blame] | 359 | as the second argument. Pressing Esc and 'x' works like |
| 360 | pressing 'n'. CTRL-C invokes the callback with -1. Other |
| 361 | keys are ignored. |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 362 | See the example here: |popup_dialog-example| |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 363 | |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 364 | Return type: |Number| |
| 365 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 366 | |
Bram Moolenaar | bdc09a1 | 2022-10-07 14:31:45 +0100 | [diff] [blame] | 367 | popup_findecho() *popup_findecho()* |
| 368 | Get the |window-ID| for the popup that shows messages for the |
| 369 | `:echowindow` command. Return zero if there is none. |
| 370 | Mainly useful to hide the popup. |
| 371 | |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 372 | Return type: |Number| |
| 373 | |
Bram Moolenaar | bdc09a1 | 2022-10-07 14:31:45 +0100 | [diff] [blame] | 374 | |
Bram Moolenaar | c7c5f10 | 2019-08-21 18:31:03 +0200 | [diff] [blame] | 375 | popup_findinfo() *popup_findinfo()* |
| 376 | Get the |window-ID| for the popup info window, as it used by |
| 377 | the popup menu. See |complete-popup|. The info popup is |
| 378 | hidden when not used, it can be deleted with |popup_clear()| |
Bram Moolenaar | 96f45c0 | 2019-10-26 19:53:45 +0200 | [diff] [blame] | 379 | and |popup_close()|. Use |popup_show()| to reposition it to |
| 380 | the item in the popup menu. |
| 381 | Returns zero if there is none. |
Bram Moolenaar | c7c5f10 | 2019-08-21 18:31:03 +0200 | [diff] [blame] | 382 | |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 383 | Return type: |Number| |
| 384 | |
Bram Moolenaar | c7c5f10 | 2019-08-21 18:31:03 +0200 | [diff] [blame] | 385 | |
| 386 | popup_findpreview() *popup_findpreview()* |
| 387 | Get the |window-ID| for the popup preview window. |
| 388 | Return zero if there is none. |
| 389 | |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 390 | Return type: |Number| |
| 391 | |
| 392 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 393 | popup_getoptions({id}) *popup_getoptions()* |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 394 | Return the {options} for popup {id} in a Dict. |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 395 | A zero value means the option was not set. For "zindex" the |
| 396 | default value is returned, not zero. |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 397 | |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 398 | The "moved" entry is a list with line number, minimum and |
| 399 | maximum column, [0, 0, 0] when not set. |
| 400 | |
| 401 | The "mousemoved" entry is a list with screen row, minimum and |
| 402 | maximum screen column, [0, 0, 0] when not set. |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 403 | |
Bram Moolenaar | 06fe74a | 2019-08-31 16:20:32 +0200 | [diff] [blame] | 404 | "firstline" is the property set on the popup, unlike the |
| 405 | "firstline" obtained with |popup_getpos()| which is the actual |
| 406 | buffer line at the top of the popup window. |
| 407 | |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 408 | "border" and "padding" are not included when all values are |
| 409 | zero. When all values are one then an empty list is included. |
| 410 | |
| 411 | "borderhighlight" is not included when all values are empty. |
Bram Moolenaar | df9c6ca | 2019-07-18 13:46:42 +0200 | [diff] [blame] | 412 | "scrollbarhighlight" and "thumbhighlight" are only included |
Bram Moolenaar | f9c85f5 | 2019-06-29 07:41:35 +0200 | [diff] [blame] | 413 | when set. |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 414 | |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 415 | "tabpage" will be -1 for a global popup, zero for a popup on |
| 416 | the current tabpage and a positive number for a popup on |
| 417 | another tabpage. |
| 418 | |
Bram Moolenaar | 12034e2 | 2019-08-25 22:25:02 +0200 | [diff] [blame] | 419 | "textprop", "textpropid" and "textpropwin" are only present |
| 420 | when "textprop" was set. |
| 421 | |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 422 | If popup window {id} is not found an empty Dict is returned. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 423 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 424 | Can also be used as a |method|: > |
| 425 | GetPopup()->popup_getoptions() |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 426 | < |
| 427 | Return type: dict<any> |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 428 | |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 429 | |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 430 | popup_getpos({id}) *popup_getpos()* |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 431 | Return the position and size of popup {id}. Returns a Dict |
| 432 | with these entries: |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 433 | col screen column of the popup, one-based |
| 434 | line screen line of the popup, one-based |
Bram Moolenaar | 2fd8e35 | 2019-06-01 20:16:48 +0200 | [diff] [blame] | 435 | width width of the whole popup in screen cells |
| 436 | height height of the whole popup in screen cells |
| 437 | core_col screen column of the text box |
| 438 | core_line screen line of the text box |
| 439 | core_width width of the text box in screen cells |
| 440 | core_height height of the text box in screen cells |
Bram Moolenaar | 68acb41 | 2019-06-26 03:40:36 +0200 | [diff] [blame] | 441 | firstline line of the buffer at top (1 unless scrolled) |
Bram Moolenaar | 2e693a8 | 2019-10-16 22:35:02 +0200 | [diff] [blame] | 442 | (not the value of the "firstline" property) |
Bram Moolenaar | 4dd8fe0 | 2019-11-09 15:33:31 +0100 | [diff] [blame] | 443 | lastline line of the buffer at the bottom (updated when |
| 444 | the popup is redrawn) |
Bram Moolenaar | 68acb41 | 2019-06-26 03:40:36 +0200 | [diff] [blame] | 445 | scrollbar non-zero if a scrollbar is displayed |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 446 | visible one if the popup is displayed, zero if hidden |
Bram Moolenaar | bc13354 | 2019-05-29 20:26:46 +0200 | [diff] [blame] | 447 | Note that these are the actual screen positions. They differ |
| 448 | from the values in `popup_getoptions()` for the sizing and |
| 449 | positioning mechanism applied. |
Bram Moolenaar | 2fd8e35 | 2019-06-01 20:16:48 +0200 | [diff] [blame] | 450 | |
| 451 | The "core_" values exclude the padding and border. |
| 452 | |
Bram Moolenaar | bc13354 | 2019-05-29 20:26:46 +0200 | [diff] [blame] | 453 | If popup window {id} is not found an empty Dict is returned. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 454 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 455 | Can also be used as a |method|: > |
| 456 | GetPopup()->popup_getpos() |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 457 | < |
| 458 | Return type: dict<number> or dict<any> |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 459 | |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 460 | |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 461 | popup_hide({id}) *popup_hide()* |
| 462 | If {id} is a displayed popup, hide it now. If the popup has a |
| 463 | filter it will not be invoked for so long as the popup is |
| 464 | hidden. |
| 465 | If window {id} does not exist nothing happens. If window {id} |
| 466 | exists but is not a popup window an error is given. *E993* |
Bram Moolenaar | ebdf3c9 | 2020-02-15 21:41:42 +0100 | [diff] [blame] | 467 | If popup window {id} contains a terminal an error is given. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 468 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 469 | Can also be used as a |method|: > |
| 470 | GetPopup()->popup_hide() |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 471 | < |
| 472 | Return type: |Number| |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 473 | |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 474 | |
Bram Moolenaar | ef6b979 | 2020-05-13 16:34:15 +0200 | [diff] [blame] | 475 | popup_list() *popup_list()* |
| 476 | Return a List with the |window-ID| of all existing popups. |
| 477 | |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 478 | Return type: list<number> or list<any> |
| 479 | |
Bram Moolenaar | ef6b979 | 2020-05-13 16:34:15 +0200 | [diff] [blame] | 480 | |
Bram Moolenaar | b4f0628 | 2019-07-12 21:07:54 +0200 | [diff] [blame] | 481 | popup_locate({row}, {col}) *popup_locate()* |
Bram Moolenaar | df9c6ca | 2019-07-18 13:46:42 +0200 | [diff] [blame] | 482 | Return the |window-ID| of the popup at screen position {row} |
Bram Moolenaar | b4f0628 | 2019-07-12 21:07:54 +0200 | [diff] [blame] | 483 | and {col}. If there are multiple popups the one with the |
| 484 | highest zindex is returned. If there are no popups at this |
| 485 | position then zero is returned. |
| 486 | |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 487 | Return type: |Number| |
| 488 | |
Bram Moolenaar | b4f0628 | 2019-07-12 21:07:54 +0200 | [diff] [blame] | 489 | |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 490 | popup_menu({what}, {options}) *popup_menu()* |
| 491 | Show the {what} near the cursor, handle selecting one of the |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 492 | items with cursorkeys, and close it an item is selected with |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 493 | Space or Enter. {what} should have multiple lines to make this |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 494 | useful. This works like: > |
Bram Moolenaar | 4c6d904 | 2019-07-16 22:04:02 +0200 | [diff] [blame] | 495 | call popup_create({what}, #{ |
Bram Moolenaar | 396e829 | 2019-07-13 23:04:31 +0200 | [diff] [blame] | 496 | \ pos: 'center', |
| 497 | \ zindex: 200, |
| 498 | \ drag: 1, |
| 499 | \ wrap: 0, |
| 500 | \ border: [], |
Bram Moolenaar | df9c6ca | 2019-07-18 13:46:42 +0200 | [diff] [blame] | 501 | \ cursorline: 1, |
Bram Moolenaar | 0346413 | 2019-07-14 16:28:13 +0200 | [diff] [blame] | 502 | \ padding: [0,1,0,1], |
Bram Moolenaar | 396e829 | 2019-07-13 23:04:31 +0200 | [diff] [blame] | 503 | \ filter: 'popup_filter_menu', |
Bram Moolenaar | 749fa0a | 2019-08-03 16:18:07 +0200 | [diff] [blame] | 504 | \ mapping: 0, |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 505 | \ }) |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 506 | < The current line is highlighted with a match using |
Yee Cheng Chin | e700dde | 2025-02-20 21:58:21 +0100 | [diff] [blame] | 507 | |hl-PopupSelected| which is linked to "PmenuSel" by default. |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 508 | |
| 509 | Use {options} to change the properties. Should at least set |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 510 | "callback" to a function that handles the selected item. |
Bram Moolenaar | 749fa0a | 2019-08-03 16:18:07 +0200 | [diff] [blame] | 511 | Example: > |
| 512 | func ColorSelected(id, result) |
| 513 | " use a:result |
| 514 | endfunc |
| 515 | call popup_menu(['red', 'green', 'blue'], #{ |
| 516 | \ callback: 'ColorSelected', |
| 517 | \ }) |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 518 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 519 | < Can also be used as a |method|: > |
| 520 | GetChoices()->popup_menu({}) |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 521 | < |
| 522 | Return type: |Number| |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 523 | |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 524 | |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 525 | popup_move({id}, {options}) *popup_move()* |
Bram Moolenaar | b53fb31 | 2019-06-13 23:59:52 +0200 | [diff] [blame] | 526 | Move popup {id} to the position specified with {options}. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 527 | {options} may contain the items from |popup_create()| that |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 528 | specify the popup position: |
| 529 | line |
| 530 | col |
| 531 | pos |
| 532 | maxheight |
| 533 | minheight |
| 534 | maxwidth |
| 535 | minwidth |
| 536 | fixed |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 537 | For {id} see `popup_hide()`. |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 538 | For other options see |popup_setoptions()|. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 539 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 540 | Can also be used as a |method|: > |
| 541 | GetPopup()->popup_move(options) |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 542 | < |
| 543 | Return type: |Number| |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 544 | |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 545 | |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 546 | popup_notification({what}, {options}) *popup_notification()* |
| 547 | Show the {what} for 3 seconds at the top of the Vim window. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 548 | This works like: > |
Bram Moolenaar | 4c6d904 | 2019-07-16 22:04:02 +0200 | [diff] [blame] | 549 | call popup_create({what}, #{ |
Bram Moolenaar | 396e829 | 2019-07-13 23:04:31 +0200 | [diff] [blame] | 550 | \ line: 1, |
| 551 | \ col: 10, |
| 552 | \ minwidth: 20, |
| 553 | \ time: 3000, |
| 554 | \ tabpage: -1, |
| 555 | \ zindex: 300, |
| 556 | \ drag: 1, |
| 557 | \ highlight: 'WarningMsg', |
| 558 | \ border: [], |
| 559 | \ close: 'click', |
| 560 | \ padding: [0,1,0,1], |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 561 | \ }) |
Yee Cheng Chin | e700dde | 2025-02-20 21:58:21 +0100 | [diff] [blame] | 562 | < The |hl-PopupNotification| highlight group is used instead of |
Bram Moolenaar | dfa97f2 | 2019-06-15 14:31:55 +0200 | [diff] [blame] | 563 | WarningMsg if it is defined. |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 564 | |
Bram Moolenaar | 581ba39 | 2019-09-03 22:08:33 +0200 | [diff] [blame] | 565 | Without the |+timers| feature the popup will not disappear |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 566 | automatically, the user has to click in it. |
Bram Moolenaar | 75fb085 | 2019-06-25 05:15:58 +0200 | [diff] [blame] | 567 | |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 568 | The position will be adjusted to avoid overlap with other |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 569 | notifications. |
| 570 | Use {options} to change the properties. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 571 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 572 | Can also be used as a |method|: > |
| 573 | GetText()->popup_notification({}) |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 574 | < |
| 575 | Return type: |Number| |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 576 | |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 577 | |
Christian Brabandt | fbc37f1 | 2024-06-18 20:50:58 +0200 | [diff] [blame] | 578 | popup_setbuf({id}, {buf}) *popup_setbuf()* |
| 579 | Set buffer {buf} to be displayed in popup win {id}. For the |
| 580 | use of {buf}, see |bufname()| function. |
| 581 | May change window size or position to adjust for the size |
| 582 | of the buffer text. |
| 583 | |
| 584 | Can also be used as a |method|: > |
| 585 | GetPopup()->popup_setbuf(bufnr('foobar')) |
| 586 | < |
| 587 | Return type: |vim9-boolean| |
| 588 | |
| 589 | |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 590 | popup_setoptions({id}, {options}) *popup_setoptions()* |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 591 | Override options in popup {id} with entries in {options}. |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 592 | These options can be set: |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 593 | border |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 594 | borderchars |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 595 | borderhighlight |
| 596 | callback |
| 597 | close |
Bram Moolenaar | df9c6ca | 2019-07-18 13:46:42 +0200 | [diff] [blame] | 598 | cursorline |
Bram Moolenaar | 749fa0a | 2019-08-03 16:18:07 +0200 | [diff] [blame] | 599 | drag |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 600 | filter |
| 601 | firstline |
| 602 | flip |
| 603 | highlight |
Bram Moolenaar | 749fa0a | 2019-08-03 16:18:07 +0200 | [diff] [blame] | 604 | mapping |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 605 | mask |
| 606 | moved |
| 607 | padding |
Bram Moolenaar | 749fa0a | 2019-08-03 16:18:07 +0200 | [diff] [blame] | 608 | resize |
Bram Moolenaar | 75fb085 | 2019-06-25 05:15:58 +0200 | [diff] [blame] | 609 | scrollbar |
Bram Moolenaar | f9c85f5 | 2019-06-29 07:41:35 +0200 | [diff] [blame] | 610 | scrollbarhighlight |
| 611 | thumbhighlight |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 612 | time |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 613 | title |
| 614 | wrap |
| 615 | zindex |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 616 | The options from |popup_move()| can also be used. |
Bram Moolenaar | 2c7f8c5 | 2020-04-20 19:52:53 +0200 | [diff] [blame] | 617 | Generally, setting an option to zero or an empty string resets |
| 618 | it to the default value, but there are exceptions. |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 619 | For "hidden" use |popup_hide()| and |popup_show()|. |
| 620 | "tabpage" cannot be changed. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 621 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 622 | Can also be used as a |method|: > |
| 623 | GetPopup()->popup_setoptions(options) |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 624 | < |
| 625 | Return type: |Number| |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 626 | |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 627 | |
Bram Moolenaar | dc2ce58 | 2019-06-16 15:32:14 +0200 | [diff] [blame] | 628 | popup_settext({id}, {text}) *popup_settext()* |
Christian Brabandt | fbc37f1 | 2024-06-18 20:50:58 +0200 | [diff] [blame] | 629 | Set the text of the buffer in popup win {id}. {text} is |
| 630 | a string or a list of strings to be displayed in the popup. |
Bram Moolenaar | dc2ce58 | 2019-06-16 15:32:14 +0200 | [diff] [blame] | 631 | Does not change the window size or position, other than caused |
| 632 | by the different text. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 633 | |
Bram Moolenaar | 6a124e6 | 2019-09-04 18:15:19 +0200 | [diff] [blame] | 634 | Can also be used as a |method|: > |
| 635 | GetPopup()->popup_settext('hello') |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 636 | < |
| 637 | Return type: |Number| |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 638 | |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 639 | |
| 640 | popup_show({id}) *popup_show()* |
| 641 | If {id} is a hidden popup, show it now. |
| 642 | For {id} see `popup_hide()`. |
| 643 | If {id} is the info popup it will be positioned next to the |
| 644 | current popup menu item. |
| 645 | |
Christian Brabandt | 5674c9a | 2024-06-09 00:13:43 +0200 | [diff] [blame] | 646 | Return type: |Number| |
| 647 | |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 648 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 649 | ============================================================================== |
| 650 | 3. Usage *popup-usage* |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 651 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 652 | POPUP_CREATE() ARGUMENTS *popup_create-arguments* |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 653 | |
Bram Moolenaar | dc2ce58 | 2019-06-16 15:32:14 +0200 | [diff] [blame] | 654 | The first argument of |popup_create()| (and the second argument to |
Bram Moolenaar | 6c1e157 | 2019-06-22 02:13:00 +0200 | [diff] [blame] | 655 | |popup_settext()|) specifies the text to be displayed, and optionally text |
Bram Moolenaar | 2ecbe53 | 2022-07-29 21:36:21 +0100 | [diff] [blame] | 656 | properties. It is in one of four forms: *E1284* |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 657 | - a buffer number |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 658 | - a string |
| 659 | - a list of strings |
| 660 | - a list of dictionaries, where each dictionary has these entries: |
| 661 | text String with the text to display. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 662 | props A list of text properties. Optional. |
| 663 | Each entry is a dictionary, like the third argument of |
| 664 | |prop_add()|, but specifying the column in the |
| 665 | dictionary with a "col" entry, see below: |
| 666 | |popup-props|. |
| 667 | |
Bram Moolenaar | e0d749a | 2019-09-25 22:14:48 +0200 | [diff] [blame] | 668 | If you want to create a new buffer yourself use |bufadd()| and pass the buffer |
| 669 | number to popup_create(). |
Bram Moolenaar | e0d749a | 2019-09-25 22:14:48 +0200 | [diff] [blame] | 670 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 671 | The second argument of |popup_create()| is a dictionary with options: |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 672 | line Screen line where to position the popup. Can use a |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 673 | number or "cursor", "cursor+1" or "cursor-1" to use |
| 674 | the line of the cursor and add or subtract a number of |
Bram Moolenaar | 2c7f8c5 | 2020-04-20 19:52:53 +0200 | [diff] [blame] | 675 | lines. If omitted or zero the popup is vertically |
| 676 | centered. The first line is 1. |
Bram Moolenaar | 12034e2 | 2019-08-25 22:25:02 +0200 | [diff] [blame] | 677 | When using "textprop" the number is relative to the |
| 678 | text property and can be negative. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 679 | col Screen column where to position the popup. Can use a |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 680 | number or "cursor" to use the column of the cursor, |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 681 | "cursor+9" or "cursor-9" to add or subtract a number |
Bram Moolenaar | 2c7f8c5 | 2020-04-20 19:52:53 +0200 | [diff] [blame] | 682 | of columns. If omitted or zero the popup is |
| 683 | horizontally centered. The first column is 1. |
Bram Moolenaar | 12034e2 | 2019-08-25 22:25:02 +0200 | [diff] [blame] | 684 | When using "textprop" the number is relative to the |
| 685 | text property and can be negative. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 686 | pos "topleft", "topright", "botleft" or "botright": |
| 687 | defines what corner of the popup "line" and "col" are |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 688 | used for. When not set "topleft" is used. |
| 689 | Alternatively "center" can be used to position the |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 690 | popup in the center of the Vim window, in which case |
| 691 | "line" and "col" are ignored. |
Bram Moolenaar | 4dd8fe0 | 2019-11-09 15:33:31 +0100 | [diff] [blame] | 692 | posinvert When FALSE the value of "pos" is always used. When |
| 693 | TRUE (the default) and the popup does not fit |
| 694 | vertically and there is more space on the other side |
| 695 | then the popup is placed on the other side of the |
| 696 | position indicated by "line". |
Bram Moolenaar | 12034e2 | 2019-08-25 22:25:02 +0200 | [diff] [blame] | 697 | textprop When present the popup is positioned next to a text |
| 698 | property with this name and will move when the text |
| 699 | property moves. Use an empty string to remove. See |
| 700 | |popup-textprop-pos|. |
| 701 | textpropwin What window to search for the text property. When |
Bram Moolenaar | 942db23 | 2021-02-13 18:14:48 +0100 | [diff] [blame] | 702 | omitted or invalid the current window is used. Used |
| 703 | when "textprop" is present. |
Bram Moolenaar | 12034e2 | 2019-08-25 22:25:02 +0200 | [diff] [blame] | 704 | textpropid Used to identify the text property when "textprop" is |
| 705 | present. Use zero to reset. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 706 | fixed When FALSE (the default), and: |
| 707 | - "pos" is "botleft" or "topleft", and |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 708 | - the popup would be truncated at the right edge of |
| 709 | the screen, then |
| 710 | the popup is moved to the left so as to fit the |
| 711 | contents on the screen. Set to TRUE to disable this. |
| 712 | flip When TRUE (the default) and the position is relative |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 713 | to the cursor, flip to below or above the cursor to |
| 714 | avoid overlap with the |popupmenu-completion| or |
Bram Moolenaar | dc2ce58 | 2019-06-16 15:32:14 +0200 | [diff] [blame] | 715 | another popup with a higher "zindex". When there is |
| 716 | no space above/below the cursor then show the popup to |
| 717 | the side of the popup or popup menu. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 718 | {not implemented yet} |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 719 | maxheight Maximum height of the contents, excluding border and |
| 720 | padding. |
| 721 | minheight Minimum height of the contents, excluding border and |
| 722 | padding. |
Bram Moolenaar | 5477506 | 2019-07-31 21:07:14 +0200 | [diff] [blame] | 723 | maxwidth Maximum width of the contents, excluding border, |
| 724 | padding and scrollbar. |
| 725 | minwidth Minimum width of the contents, excluding border, |
| 726 | padding and scrollbar. |
Bram Moolenaar | 8d24104 | 2019-06-12 23:40:01 +0200 | [diff] [blame] | 727 | firstline First buffer line to display. When larger than one it |
| 728 | looks like the text scrolled up. When out of range |
| 729 | the last buffer line will at the top of the window. |
Bram Moolenaar | 06fe74a | 2019-08-31 16:20:32 +0200 | [diff] [blame] | 730 | Set to zero to leave the position as set by commands. |
Bram Moolenaar | 75fb085 | 2019-06-25 05:15:58 +0200 | [diff] [blame] | 731 | Also see "scrollbar". |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 732 | hidden When TRUE the popup exists but is not displayed; use |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 733 | `popup_show()` to unhide it. |
Bram Moolenaar | 6c1e157 | 2019-06-22 02:13:00 +0200 | [diff] [blame] | 734 | tabpage When -1: display the popup on all tab pages. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 735 | When 0 (the default): display the popup on the current |
Bram Moolenaar | fc06cbb | 2019-06-15 14:14:31 +0200 | [diff] [blame] | 736 | tab page. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 737 | Otherwise the number of the tab page the popup is |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 738 | displayed on; when invalid the popup is not created |
Bram Moolenaar | b2cda0d | 2019-06-24 05:06:36 +0200 | [diff] [blame] | 739 | and an error is given. *E997* |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 740 | title Text to be displayed above the first item in the |
| 741 | popup, on top of any border. If there is no top |
Bram Moolenaar | b53fb31 | 2019-06-13 23:59:52 +0200 | [diff] [blame] | 742 | border one line of padding is added to put the title |
Bram Moolenaar | eb2310d | 2019-06-16 20:09:10 +0200 | [diff] [blame] | 743 | on. You might want to add one or more spaces at the |
| 744 | start and end as padding. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 745 | wrap TRUE to make the lines wrap (default TRUE). |
Bram Moolenaar | b53fb31 | 2019-06-13 23:59:52 +0200 | [diff] [blame] | 746 | drag TRUE to allow the popup to be dragged with the mouse |
Bram Moolenaar | 581ba39 | 2019-09-03 22:08:33 +0200 | [diff] [blame] | 747 | by grabbing at the border. Has no effect if the |
Bram Moolenaar | dc2ce58 | 2019-06-16 15:32:14 +0200 | [diff] [blame] | 748 | popup does not have a border. As soon as dragging |
| 749 | starts and "pos" is "center" it is changed to |
| 750 | "topleft". |
Bram Moolenaar | 0b74d00 | 2021-11-29 17:38:02 +0000 | [diff] [blame] | 751 | dragall TRUE to allow the popup to be dragged from every |
| 752 | position. Makes it very difficult to select text in |
| 753 | the popup. |
Bram Moolenaar | 9bcb70c | 2019-08-01 21:11:05 +0200 | [diff] [blame] | 754 | resize TRUE to allow the popup to be resized with the mouse |
Bram Moolenaar | 581ba39 | 2019-09-03 22:08:33 +0200 | [diff] [blame] | 755 | by grabbing at the bottom right corner. Has no effect |
| 756 | if the popup does not have a border. |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 757 | close When "button" an X is displayed in the top-right, on |
| 758 | top of any border, padding or text. When clicked on |
| 759 | the X the popup will close. Any callback is invoked |
| 760 | with the value -2. |
| 761 | When "click" any mouse click in the popup will close |
| 762 | it. |
| 763 | When "none" (the default) mouse clicks do not close |
| 764 | the popup window. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 765 | highlight Highlight group name to use for the text, stored in |
| 766 | the 'wincolor' option. |
| 767 | padding List with numbers, defining the padding |
| 768 | above/right/below/left of the popup (similar to CSS). |
| 769 | An empty list uses a padding of 1 all around. The |
| 770 | padding goes around the text, inside any border. |
| 771 | Padding uses the 'wincolor' highlight. |
| 772 | Example: [1, 2, 1, 3] has 1 line of padding above, 2 |
| 773 | columns on the right, 1 line below and 3 columns on |
| 774 | the left. |
| 775 | border List with numbers, defining the border thickness |
| 776 | above/right/below/left of the popup (similar to CSS). |
Bram Moolenaar | 9faec4e | 2021-02-27 16:38:07 +0100 | [diff] [blame] | 777 | Only values of zero and non-zero are currently |
| 778 | recognized. An empty list uses a border all around. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 779 | borderhighlight List of highlight group names to use for the border. |
| 780 | When one entry it is used for all borders, otherwise |
| 781 | the highlight for the top/right/bottom/left border. |
| 782 | Example: ['TopColor', 'RightColor', 'BottomColor, |
| 783 | 'LeftColor'] |
| 784 | borderchars List with characters, defining the character to use |
| 785 | for the top/right/bottom/left border. Optionally |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 786 | followed by the character to use for the |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 787 | topleft/topright/botright/botleft corner. |
| 788 | Example: ['-', '|', '-', '|', '┌', '┐', '┘', '└'] |
| 789 | When the list has one character it is used for all. |
| 790 | When the list has two characters the first is used for |
| 791 | the border lines, the second for the corners. |
| 792 | By default a double line is used all around when |
Bram Moolenaar | 6c1e157 | 2019-06-22 02:13:00 +0200 | [diff] [blame] | 793 | 'encoding' is "utf-8" and 'ambiwidth' is "single", |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 794 | otherwise ASCII characters are used. |
Bram Moolenaar | d58a3bf | 2020-09-28 21:48:16 +0200 | [diff] [blame] | 795 | scrollbar 1 or true: show a scrollbar when the text doesn't fit. |
Bram Moolenaar | 75fb085 | 2019-06-25 05:15:58 +0200 | [diff] [blame] | 796 | zero: do not show a scrollbar. Default is non-zero. |
Bram Moolenaar | f9c85f5 | 2019-06-29 07:41:35 +0200 | [diff] [blame] | 797 | Also see |popup-scrollbar|. |
| 798 | scrollbarhighlight Highlight group name for the scrollbar. The |
| 799 | background color is what matters. When not given then |
| 800 | PmenuSbar is used. |
| 801 | thumbhighlight Highlight group name for the scrollbar thumb. The |
| 802 | background color is what matters. When not given then |
| 803 | PmenuThumb is used. |
Bram Moolenaar | b53fb31 | 2019-06-13 23:59:52 +0200 | [diff] [blame] | 804 | zindex Priority for the popup, default 50. Minimum value is |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 805 | 1, maximum value is 32000. |
Bram Moolenaar | c662ec9 | 2019-06-23 00:15:57 +0200 | [diff] [blame] | 806 | mask A list of lists with coordinates, defining parts of |
| 807 | the popup that are transparent. See |popup-mask|. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 808 | time Time in milliseconds after which the popup will close. |
| 809 | When omitted |popup_close()| must be used. |
Bram Moolenaar | 3397f74 | 2019-06-02 18:40:06 +0200 | [diff] [blame] | 810 | moved Specifies to close the popup if the cursor moved: |
| 811 | - "any": if the cursor moved at all |
| 812 | - "word": if the cursor moved outside |<cword>| |
| 813 | - "WORD": if the cursor moved outside |<cWORD>| |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 814 | - "expr": if the cursor moved outside |<cexpr>| |
Bram Moolenaar | 3397f74 | 2019-06-02 18:40:06 +0200 | [diff] [blame] | 815 | - [{start}, {end}]: if the cursor moved before column |
| 816 | {start} or after {end} |
Bram Moolenaar | a139615 | 2019-10-20 18:46:05 +0200 | [diff] [blame] | 817 | - [{lnum}, {start}, {end}]: if the cursor moved away |
| 818 | from line {lnum}, before column {start} or after |
| 819 | {end} |
Bram Moolenaar | 4dd8fe0 | 2019-11-09 15:33:31 +0100 | [diff] [blame] | 820 | - [0, 0, 0] do not close the popup when the cursor |
| 821 | moves |
Bram Moolenaar | 3397f74 | 2019-06-02 18:40:06 +0200 | [diff] [blame] | 822 | The popup also closes if the cursor moves to another |
| 823 | line or to another window. |
Bram Moolenaar | a139615 | 2019-10-20 18:46:05 +0200 | [diff] [blame] | 824 | mousemoved Like "moved" but referring to the mouse pointer |
| 825 | position |
Bram Moolenaar | 9faec4e | 2021-02-27 16:38:07 +0100 | [diff] [blame] | 826 | cursorline TRUE: Highlight the cursor line. Also scrolls the |
| 827 | text to show this line (only works properly |
| 828 | when 'wrap' is off). |
Bram Moolenaar | 938ae28 | 2023-02-20 20:44:55 +0000 | [diff] [blame] | 829 | zero: Do not highlight the cursor line. |
Bram Moolenaar | df9c6ca | 2019-07-18 13:46:42 +0200 | [diff] [blame] | 830 | Default is zero, except for |popup_menu()|. |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 831 | filter A callback that can filter typed characters, see |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 832 | |popup-filter|. |
Bram Moolenaar | 749fa0a | 2019-08-03 16:18:07 +0200 | [diff] [blame] | 833 | mapping Allow for key mapping. When FALSE and the popup is |
| 834 | visible and has a filter callback key mapping is |
| 835 | disabled. Default value is TRUE. |
Bram Moolenaar | 581ba39 | 2019-09-03 22:08:33 +0200 | [diff] [blame] | 836 | filtermode In which modes the filter is used (same flags as with |
| 837 | |hasmapto()| plus "a"): |
| 838 | n Normal mode |
| 839 | v Visual and Select mode |
| 840 | x Visual mode |
| 841 | s Select mode |
| 842 | o Operator-pending mode |
| 843 | i Insert mode |
| 844 | l Language-Argument ("r", "f", "t", etc.) |
| 845 | c Command-line mode |
| 846 | a all modes |
| 847 | The default value is "a". |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 848 | callback A callback that is called when the popup closes, e.g. |
| 849 | when using |popup_filter_menu()|, see |popup-callback|. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 850 | |
| 851 | Depending on the "zindex" the popup goes under or above other popups. The |
| 852 | completion menu (|popup-menu|) has zindex 100. For messages that occur for a |
| 853 | short time the suggestion is to use zindex 1000. |
| 854 | |
| 855 | By default text wraps, which causes a line in {lines} to occupy more than one |
| 856 | screen line. When "wrap" is FALSE then the text outside of the popup or |
| 857 | outside of the Vim window will not be displayed, thus truncated. |
| 858 | |
| 859 | |
| 860 | POPUP TEXT PROPERTIES *popup-props* |
| 861 | |
Bram Moolenaar | 7a8d027 | 2019-05-26 23:32:06 +0200 | [diff] [blame] | 862 | These are similar to the third argument of |prop_add()| except: |
| 863 | - "lnum" is always the current line in the list |
| 864 | - "bufnr" is always the buffer of the popup |
| 865 | - "col" is in the Dict instead of a separate argument |
Bram Moolenaar | 7a8d027 | 2019-05-26 23:32:06 +0200 | [diff] [blame] | 866 | So we get: |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 867 | col starting column, counted in bytes, use one for the |
| 868 | first column. |
| 869 | length length of text in bytes; can be zero |
Bram Moolenaar | 7a8d027 | 2019-05-26 23:32:06 +0200 | [diff] [blame] | 870 | end_lnum line number for the end of the text |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 871 | end_col column just after the text; not used when "length" is |
| 872 | present; when {col} and "end_col" are equal, this is a |
| 873 | zero-width text property |
| 874 | id user defined ID for the property; when omitted zero is |
| 875 | used |
| 876 | type name of the text property type, as added with |
| 877 | |prop_type_add()| |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 878 | |
| 879 | |
Bram Moolenaar | 12034e2 | 2019-08-25 22:25:02 +0200 | [diff] [blame] | 880 | POSITION POPUP WITH TEXTPROP *popup-textprop-pos* |
| 881 | |
| 882 | Positioning a popup next to a text property causes the popup to move when text |
| 883 | is inserted or deleted. The popup functions like a tooltip. |
| 884 | |
| 885 | These steps are needed to make this work: |
| 886 | |
| 887 | - Define a text property type, it defines the name. > |
Bram Moolenaar | 2e693a8 | 2019-10-16 22:35:02 +0200 | [diff] [blame] | 888 | call prop_type_add('popupMarker', {}) |
Bram Moolenaar | 12034e2 | 2019-08-25 22:25:02 +0200 | [diff] [blame] | 889 | |
| 890 | - Place a text property at the desired text: > |
| 891 | let lnum = {line of the text} |
| 892 | let col = {start column of the text} |
| 893 | let len = {length of the text} |
| 894 | let propId = {arbitrary but unique number} |
Bram Moolenaar | 2e693a8 | 2019-10-16 22:35:02 +0200 | [diff] [blame] | 895 | call prop_add(lnum, col, #{ |
Bram Moolenaar | 12034e2 | 2019-08-25 22:25:02 +0200 | [diff] [blame] | 896 | \ length: len, |
| 897 | \ type: 'popupMarker', |
| 898 | \ id: propId, |
| 899 | \ }) |
| 900 | |
| 901 | - Create a popup: > |
Bram Moolenaar | 2e693a8 | 2019-10-16 22:35:02 +0200 | [diff] [blame] | 902 | let winid = popup_create('the text', #{ |
| 903 | \ pos: 'botleft', |
Bram Moolenaar | 12034e2 | 2019-08-25 22:25:02 +0200 | [diff] [blame] | 904 | \ textprop: 'popupMarker', |
| 905 | \ textpropid: propId, |
| 906 | \ border: [], |
| 907 | \ padding: [0,1,0,1], |
| 908 | \ close: 'click', |
| 909 | \ }) |
| 910 | |
| 911 | By default the popup is positioned at the corner of the text, opposite of the |
| 912 | "pos" specified for the popup. Thus when the popup uses "botleft", the |
| 913 | bottom-left corner of the popup is positioned next to the top-right corner of |
| 914 | the text property: |
| 915 | +----------+ |
| 916 | | the text | |
| 917 | +----------+ |
| 918 | just some PROPERTY as an example |
| 919 | |
| 920 | Here the text property is on "PROPERTY". Move the popup to the left by |
| 921 | passing a negative "col" value to popup_create(). With "col: -5" you get: |
| 922 | |
| 923 | +----------+ |
| 924 | | the text | |
| 925 | +----------+ |
| 926 | just some PROPERTY as an example |
| 927 | |
| 928 | If the text property moves out of view then the popup will be hidden. |
| 929 | If the window for which the popup was defined is closed, the popup is closed. |
| 930 | |
| 931 | If the popup cannot fit in the desired position, it may show at a nearby |
| 932 | position. |
| 933 | |
| 934 | Some hints: |
| 935 | - To avoid collision with other plugins the text property type name has to be |
| 936 | unique. You can also use the "bufnr" item to make it local to a buffer. |
| 937 | - You can leave out the text property ID if there is only ever one text |
| 938 | property visible. |
| 939 | - The popup may be in the way of what the user is doing, making it close with |
| 940 | a click, as in the example above, helps for that. |
| 941 | - If the text property is removed the popup is closed. Use something like |
| 942 | this: > |
Bram Moolenaar | 2e693a8 | 2019-10-16 22:35:02 +0200 | [diff] [blame] | 943 | call prop_remove(#{type: 'popupMarker', id: propId}) |
Bram Moolenaar | 12034e2 | 2019-08-25 22:25:02 +0200 | [diff] [blame] | 944 | |
| 945 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 946 | POPUP FILTER *popup-filter* |
| 947 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 948 | A callback that gets any typed keys while a popup is displayed. The filter is |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 949 | not invoked when the popup is hidden. |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 950 | |
| 951 | The filter can return TRUE to indicate the key has been handled and is to be |
| 952 | discarded, or FALSE to let Vim handle the key as usual in the current state. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 953 | In case it returns FALSE and there is another popup window visible, that |
| 954 | filter is also called. The filter of the popup window with the highest zindex |
| 955 | is called first. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 956 | |
| 957 | The filter function is called with two arguments: the ID of the popup and the |
Bram Moolenaar | a42d945 | 2019-06-15 21:46:30 +0200 | [diff] [blame] | 958 | key as a string, e.g.: > |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 959 | func MyFilter(winid, key) |
| 960 | if a:key == "\<F2>" |
| 961 | " do something |
| 962 | return 1 |
| 963 | endif |
| 964 | if a:key == 'x' |
| 965 | call popup_close(a:winid) |
| 966 | return 1 |
| 967 | endif |
| 968 | return 0 |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 969 | endfunc |
Bram Moolenaar | 581ba39 | 2019-09-03 22:08:33 +0200 | [diff] [blame] | 970 | < *popup-filter-mode* |
| 971 | The "filtermode" property can be used to specify in what mode the filter is |
| 972 | invoked. The default is "a": all modes. When using "nvi" Command-line mode |
| 973 | is not included, so that any command typed on the command line is not |
| 974 | filtered. However, to get to Command-line mode the filter must not consume |
| 975 | ":". Just like it must not consume "v" to allow for entering Visual mode. |
| 976 | |
| 977 | *popup-mapping* |
Bram Moolenaar | 749fa0a | 2019-08-03 16:18:07 +0200 | [diff] [blame] | 978 | Normally the key is what results after any mapping, since the keys pass on as |
| 979 | normal input if the filter does not use it. If the filter consumes all the |
| 980 | keys, set the "mapping" property to zero so that mappings do not get in the |
| 981 | way. This is default for |popup_menu()| and |popup_dialog()|. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 982 | |
Bram Moolenaar | 581ba39 | 2019-09-03 22:08:33 +0200 | [diff] [blame] | 983 | Some recommended key actions: |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 984 | x close the popup (see note below) |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 985 | cursor keys select another entry |
| 986 | Tab accept current suggestion |
| 987 | |
Bram Moolenaar | 6aa5729 | 2021-08-14 21:25:52 +0200 | [diff] [blame] | 988 | When CTRL-C is pressed the popup is closed, the filter will not be invoked. |
| 989 | |
Bram Moolenaar | db3a205 | 2019-11-16 18:22:41 +0100 | [diff] [blame] | 990 | A mouse click arrives as <LeftMouse>. The coordinates can be obtained with |
Bram Moolenaar | 09c6f26 | 2019-11-17 15:55:14 +0100 | [diff] [blame] | 991 | |getmousepos()|. |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 992 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 993 | Vim provides standard filters |popup_filter_menu()| and |
| 994 | |popup_filter_yesno()|. |
| 995 | |
Bram Moolenaar | 4934ad0 | 2020-09-28 22:29:58 +0200 | [diff] [blame] | 996 | Keys coming from a `:normal` command do not pass through the filter. This can |
| 997 | be used to move the cursor in a popup where the "cursorline" option is set: > |
| 998 | call win_execute(winid, 'normal! 10Gzz') |
| 999 | Keys coming from `feedkeys()` are passed through the filter. |
| 1000 | |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 1001 | Note that "x" is the normal way to close a popup. You may want to use Esc, |
| 1002 | but since many keys start with an Esc character, there may be a delay before |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 1003 | Vim recognizes the Esc key. If you do use Esc, it is recommended to set the |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 1004 | 'ttimeoutlen' option to 100 and set 'timeout' and/or 'ttimeout'. |
| 1005 | |
Bram Moolenaar | 1d59aa1 | 2020-09-19 18:50:13 +0200 | [diff] [blame] | 1006 | *popup-filter-errors* |
| 1007 | If the filter function can't be called, e.g. because the name is wrong, then |
| 1008 | the popup is closed. If the filter causes an error then it is assumed to |
| 1009 | return zero. If this happens three times in a row the popup is closed. If |
| 1010 | the popup gives errors fewer than 10% of the calls then it won't be closed. |
| 1011 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 1012 | |
| 1013 | POPUP CALLBACK *popup-callback* |
| 1014 | |
Bram Moolenaar | a42d945 | 2019-06-15 21:46:30 +0200 | [diff] [blame] | 1015 | A callback that is invoked when the popup closes. |
Bram Moolenaar | 9eaac89 | 2019-06-01 22:49:29 +0200 | [diff] [blame] | 1016 | |
| 1017 | The callback is invoked with two arguments: the ID of the popup window and the |
| 1018 | result, which could be an index in the popup lines, or whatever was passed as |
| 1019 | the second argument of `popup_close()`. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 1020 | |
Bram Moolenaar | a42d945 | 2019-06-15 21:46:30 +0200 | [diff] [blame] | 1021 | If the popup is force-closed, e.g. because the cursor moved or CTRL-C was |
| 1022 | pressed, the number -1 is passed to the callback. |
Bram Moolenaar | 3397f74 | 2019-06-02 18:40:06 +0200 | [diff] [blame] | 1023 | |
Bram Moolenaar | 749fa0a | 2019-08-03 16:18:07 +0200 | [diff] [blame] | 1024 | Example: > |
| 1025 | func SelectedColor(id, result) |
| 1026 | echo 'choice made: ' .. a:result |
| 1027 | endfunc |
| 1028 | |
Bram Moolenaar | c662ec9 | 2019-06-23 00:15:57 +0200 | [diff] [blame] | 1029 | |
Bram Moolenaar | f9c85f5 | 2019-06-29 07:41:35 +0200 | [diff] [blame] | 1030 | POPUP SCROLLBAR *popup-scrollbar* |
| 1031 | |
| 1032 | If the text does not fit in the popup a scrollbar is displayed on the right of |
| 1033 | the window. This can be disabled by setting the "scrollbar" option to zero. |
| 1034 | When the scrollbar is displayed mouse scroll events, while the mouse pointer |
| 1035 | is on the popup, will cause the text to scroll up or down as you would expect. |
Bram Moolenaar | 85850f3 | 2019-07-19 22:05:51 +0200 | [diff] [blame] | 1036 | A click in the upper half of the scrollbar will scroll the text down one line. |
| 1037 | A click in the lower half will scroll the text up one line. However, this is |
| 1038 | limited so that the popup does not get smaller. |
Bram Moolenaar | f9c85f5 | 2019-06-29 07:41:35 +0200 | [diff] [blame] | 1039 | |
| 1040 | |
Bram Moolenaar | c662ec9 | 2019-06-23 00:15:57 +0200 | [diff] [blame] | 1041 | POPUP MASK *popup-mask* |
| 1042 | |
| 1043 | To minimize the text that the popup covers, parts of it can be made |
| 1044 | transparent. This is defined by a "mask" which is a list of lists, where each |
| 1045 | list has four numbers: |
| 1046 | col start column, positive for counting from the left, 1 for |
| 1047 | leftmost, negative for counting from the right, -1 for |
| 1048 | rightmost |
| 1049 | endcol last column, like "col" |
Bram Moolenaar | df9c6ca | 2019-07-18 13:46:42 +0200 | [diff] [blame] | 1050 | line start line, positive for counting from the top, 1 for top, |
Bram Moolenaar | c662ec9 | 2019-06-23 00:15:57 +0200 | [diff] [blame] | 1051 | negative for counting from the bottom, -1 for bottom |
| 1052 | endline end line, like "line" |
| 1053 | |
| 1054 | For example, to make the last 10 columns of the last line transparent: |
| 1055 | [[-10, -1, -1, -1]] |
| 1056 | |
| 1057 | To make the four corners transparent: |
| 1058 | [[1, 1, 1, 1], [-1, -1, 1, 1], [1, 1, -1, -1], [-1, -1, -1, -1]] |
| 1059 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 1060 | ============================================================================== |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 1061 | 4. Examples *popup-examples* |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 1062 | |
Bram Moolenaar | 016188f | 2022-06-06 20:52:59 +0100 | [diff] [blame] | 1063 | These examples use |Vim9| script. |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1064 | |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 1065 | *popup_dialog-example* |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 1066 | Prompt the user to press y/Y or n/N: > |
| 1067 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1068 | popup_dialog('Continue? y/n', { |
| 1069 | filter: 'popup_filter_yesno', |
| 1070 | callback: (id, result) => { |
| 1071 | if result == 1 |
| 1072 | echomsg "'y' or 'Y' was pressed" |
| 1073 | else |
| 1074 | echomsg "'y' or 'Y' was NOT pressed" |
| 1075 | endif |
| 1076 | }, |
Bram Moolenaar | d592deb | 2022-06-17 15:42:40 +0100 | [diff] [blame] | 1077 | padding: [2, 4, 2, 4], |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1078 | }) |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 1079 | < |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 1080 | *popup_menu-shortcut-example* |
| 1081 | Extend popup_filter_menu() with shortcut keys: > |
| 1082 | |
Bram Moolenaar | d592deb | 2022-06-17 15:42:40 +0100 | [diff] [blame] | 1083 | popup_menu(['Save', 'Cancel', 'Discard'], { |
| 1084 | callback: (_, result) => { |
| 1085 | echo 'dialog result is' result |
| 1086 | }, |
| 1087 | filter: (id, key) => { |
| 1088 | # Handle shortcuts |
| 1089 | if key == 'S' || key == 's' |
| 1090 | popup_close(id, 1) |
| 1091 | elseif key == 'C' || key == 'c' |
| 1092 | popup_close(id, 2) |
| 1093 | elseif key == 'D' || key == 'd' |
| 1094 | popup_close(id, 3) |
| 1095 | else |
| 1096 | # No shortcut, pass to generic filter |
| 1097 | return popup_filter_menu(id, key) |
| 1098 | endif |
| 1099 | return true |
| 1100 | }, |
| 1101 | }) |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 1102 | < |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 1103 | *popup_beval_example* |
| 1104 | Example for using a popup window for 'ballooneval': > |
| 1105 | |
| 1106 | set ballooneval balloonevalterm |
| 1107 | set balloonexpr=BalloonExpr() |
Bram Moolenaar | d592deb | 2022-06-17 15:42:40 +0100 | [diff] [blame] | 1108 | var winid: number |
| 1109 | var last_text: string |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 1110 | |
Bram Moolenaar | d592deb | 2022-06-17 15:42:40 +0100 | [diff] [blame] | 1111 | def BalloonExpr(): string |
| 1112 | # here you would use "v:beval_text" to lookup something interesting |
| 1113 | var text = v:beval_text |
| 1114 | if winid > 0 && popup_getpos(winid) != null_dict |
| 1115 | # previous popup window still shows |
| 1116 | if text == last_text |
| 1117 | # still the same text, keep the existing popup |
| 1118 | return null_string |
| 1119 | endif |
| 1120 | popup_close(winid) |
Bram Moolenaar | b05caa7 | 2019-07-10 21:55:54 +0200 | [diff] [blame] | 1121 | endif |
Bram Moolenaar | d592deb | 2022-06-17 15:42:40 +0100 | [diff] [blame] | 1122 | |
| 1123 | winid = popup_beval(text, {}) |
| 1124 | last_text = text |
| 1125 | return null_string |
| 1126 | enddef |
| 1127 | |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 1128 | If the text has to be obtained asynchronously return an empty string from the |
| 1129 | expression function and call popup_beval() once the text is available. In |
Bram Moolenaar | b05caa7 | 2019-07-10 21:55:54 +0200 | [diff] [blame] | 1130 | this example simulated with a timer callback: > |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 1131 | |
| 1132 | set ballooneval balloonevalterm |
| 1133 | set balloonexpr=BalloonExpr() |
Bram Moolenaar | d592deb | 2022-06-17 15:42:40 +0100 | [diff] [blame] | 1134 | var winid: number |
| 1135 | var last_text: string |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 1136 | |
Bram Moolenaar | d592deb | 2022-06-17 15:42:40 +0100 | [diff] [blame] | 1137 | def BalloonExpr(): string |
| 1138 | var text = v:beval_text |
| 1139 | if winid > 0 && popup_getpos(winid) != null_dict |
| 1140 | # previous popup window still shows |
| 1141 | if text == last_text |
| 1142 | # still the same text, keep the existing popup |
| 1143 | return null_string |
| 1144 | endif |
| 1145 | popup_close(winid) |
Bram Moolenaar | b05caa7 | 2019-07-10 21:55:54 +0200 | [diff] [blame] | 1146 | endif |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 1147 | |
Bram Moolenaar | d592deb | 2022-06-17 15:42:40 +0100 | [diff] [blame] | 1148 | # Simulate an asynchronous lookup that takes half a second for the |
| 1149 | # text to display. |
| 1150 | last_text = text |
| 1151 | timer_start(500, 'ShowPopup') |
| 1152 | return null_string |
| 1153 | enddef |
| 1154 | |
| 1155 | def ShowPopup(timerid: number) |
| 1156 | winid = popup_beval('Result: ' .. last_text, {}) |
| 1157 | enddef |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 1158 | < |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 1159 | |
| 1160 | vim:tw=78:ts=8:noet:ft=help:norl: |