Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 1 | *popup.txt* For Vim version 8.1. Last change: 2019 Jul 04 |
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 | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 7 | Displaying text in a floating window. *popup* *popup-window* |
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 | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 14 | 2. Functions |popup-functions| |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 15 | Details |popup-function-details| |
| 16 | 3. Usage |popup-usage| |
| 17 | popup_create() arguments |popup_create-arguments| |
| 18 | Popup text properties |popup-props| |
| 19 | Popup filter |popup-filter| |
| 20 | Popup callback |popup-callback| |
| 21 | Popup scrollbar |popup-scrollbar| |
| 22 | Popup mask |popup-mask| |
| 23 | 4. Examples |popup-examples| |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 24 | |
| 25 | |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 26 | {not available if the |+textprop| feature was disabled at compile time} |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 27 | |
| 28 | ============================================================================== |
| 29 | 1. Introduction *popup-intro* |
| 30 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 31 | We are talking about popup windows here, text that goes on top of the regular |
| 32 | windows and is under control of a plugin. You cannot edit the text in the |
| 33 | popup window like with regular windows. |
| 34 | |
| 35 | A popup window can be used for such things as: |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 36 | - briefly show a message without overwriting the command line |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 37 | - prompt the user with a dialog |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 38 | - display contextual information while typing |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 39 | - give extra information for auto-completion |
| 40 | |
| 41 | The text in the popup window can be colored with |text-properties|. It is |
| 42 | also possible to use syntax highlighting. |
| 43 | |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 44 | The default color used is "Pmenu". If you prefer something else use the |
| 45 | "highlight" argument or the 'wincolor' option, e.g.: > |
| 46 | hi MyPopupColor ctermbg=lightblue guibg=lightblue |
| 47 | call setwinvar(winid, '&wincolor', 'MyPopupColor') |
| 48 | |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 49 | 'hlsearch' highlighting is not displayed in a popup window. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 50 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 51 | A popup window has a window-ID like other windows, but behaves differently. |
| 52 | 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] | 53 | Popup windows can also overlap each other. The "zindex" property specifies |
| 54 | what goes on top of what. |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 55 | |
| 56 | 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] | 57 | the popup window. The window cannot be in Normal, Visual or Insert mode, it |
| 58 | does not get keyboard focus. You can use functions like `setbufline()` to |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 59 | change the text in the buffer. There are more differences from how this |
| 60 | window and buffer behave compared to regular windows and buffers, see |
| 61 | |popup-buffer|. |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 62 | |
| 63 | 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] | 64 | - popup menu, see |popup-menu| |
| 65 | - balloon, see |balloon-eval| |
| 66 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 67 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 68 | WINDOW POSITION AND SIZE *popup-position* |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 69 | |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 70 | The height of the window is normally equal to the number of, possibly |
| 71 | wrapping, lines in the buffer. It can be limited with the "maxheight" |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 72 | property. You can use empty lines to increase the height or the "minheight" |
| 73 | property. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 74 | |
| 75 | The width of the window is normally equal to the longest line in the buffer. |
| 76 | It can be limited with the "maxwidth" property. You can use spaces to |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 77 | increase the width or use the "minwidth" property. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 78 | |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 79 | By default the 'wrap' option is set, so that no text disappears. Otherwise, |
| 80 | 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] | 81 | display more text. When right-aligned the window is shifted right to display |
| 82 | more text. The shifting can be disabled with the "fixed" property. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 83 | |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 84 | Vim tries to show the popup in the location you specify. In some cases, e.g. |
| 85 | 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] | 86 | 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] | 87 | the current cursor position, but if the cursor is close to the top of the Vim |
| 88 | window it will be placed below the cursor position. |
| 89 | |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 90 | When the screen scrolls up for output of an Ex command, popups move too, so |
| 91 | that they will not cover the output. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 92 | |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 93 | The current cursor position is displayed even when it is under a popup window. |
| 94 | That way you can still see where it is, even though you cannot see the text |
| 95 | that it is in. |
Bram Moolenaar | 868b7b6 | 2019-05-29 21:44:40 +0200 | [diff] [blame] | 96 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 97 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 98 | CLOSING THE POPUP WINDOW *popup-close* |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 99 | |
| 100 | Normally the plugin that created the popup window is also in charge of closing |
| 101 | it. If somehow a popup hangs around, you can close all of them with: > |
| 102 | call popup_clear() |
| 103 | Some popups, such as notifications, close after a specified time. This can be |
| 104 | set with the "time" property on `popup_create()`. |
| 105 | Otherwise, a popup can be closed by clicking on the X in the top-right corner |
| 106 | or by clicking anywhere inside the popup. This must be enabled with the |
| 107 | "close" property. It is set by default for notifications. |
| 108 | |
| 109 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 110 | POPUP BUFFER AND WINDOW *popup-buffer* |
| 111 | |
| 112 | If a popup function is called to create a popup from text, a new buffer is |
| 113 | created to hold the text and text properties of the popup window. The buffer |
| 114 | is always associated with the popup window and manipulation is restricted: |
| 115 | - the buffer has no name |
| 116 | - 'buftype' is "popup" |
| 117 | - 'swapfile' is off |
| 118 | - 'bufhidden' is "hide" |
| 119 | - 'buflisted' is off |
| 120 | - 'undolevels' is -1: no undo at all |
| 121 | - all other buffer-local and window-local options are set to their Vim default |
| 122 | value. |
| 123 | |
| 124 | It is possible to change the specifically mentioned options, but anything |
| 125 | might break then, so better leave them alone. |
| 126 | |
| 127 | The window does have a cursor position, but the cursor is not displayed. |
| 128 | |
| 129 | To execute a command in the context of the popup window and buffer use |
| 130 | `win_execute()`. Example: > |
| 131 | call win_execute(winid, 'syntax enable') |
| 132 | |
| 133 | Options can be set on the window with `setwinvar()`, e.g.: > |
| 134 | call setwinvar(winid, '&wrap', 0) |
| 135 | And options can be set on the buffer with `setbufvar()`, e.g.: > |
| 136 | call setbufvar(winbufnr(winid), '&filetype', 'java') |
| 137 | Note that this does not trigger autocommands. Use `win_execute()` if you do |
| 138 | need them. |
| 139 | |
| 140 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 141 | |
| 142 | ============================================================================== |
| 143 | 2. Functions *popup-functions* |
| 144 | |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 145 | Creating a popup window: |
| 146 | |popup_create()| centered in the screen |
| 147 | |popup_atcursor()| just above the cursor position, closes when |
| 148 | the cursor moves away |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 149 | |popup_notification()| show a notification for three seconds |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 150 | |popup_dialog()| centered with padding and border |
| 151 | |popup_menu()| prompt for selecting an item from a list |
| 152 | |
| 153 | Manipulating a popup window: |
| 154 | |popup_hide()| hide a popup temporarily |
| 155 | |popup_show()| show a previously hidden popup |
| 156 | |popup_move()| change the position and size of a popup |
| 157 | |popup_setoptions()| override options of a popup |
Bram Moolenaar | dc2ce58 | 2019-06-16 15:32:14 +0200 | [diff] [blame] | 158 | |popup_settext()| replace the popup buffer contents |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 159 | |
| 160 | Closing popup windows: |
| 161 | |popup_close()| close one popup |
| 162 | |popup_clear()| close all popups |
| 163 | |
| 164 | Filter functions: |
| 165 | |popup_filter_menu()| select from a list of items |
| 166 | |popup_filter_yesno()| blocks until 'y' or 'n' is pressed |
| 167 | |
| 168 | Other: |
| 169 | |popup_getoptions()| get current options for a popup |
| 170 | |popup_getpos()| get actual position and size of a popup |
| 171 | |
| 172 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 173 | DETAILS *popup-function-details* |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 174 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 175 | popup_atcursor({what}, {options}) *popup_atcursor()* |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 176 | Show the {what} above the cursor, and close it when the cursor |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 177 | moves. This works like: > |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 178 | call popup_create({what}, { |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 179 | \ 'pos': 'botleft', |
| 180 | \ 'line': 'cursor-1', |
| 181 | \ 'col': 'cursor', |
| 182 | \ 'moved': 'WORD', |
| 183 | \ }) |
| 184 | < Use {options} to change the properties. |
| 185 | |
| 186 | |
| 187 | *popup_clear()* |
| 188 | popup_clear() Emergency solution to a misbehaving plugin: close all popup |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 189 | windows for the current tab and global popups. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 190 | |
| 191 | |
| 192 | popup_close({id} [, {result}]) *popup_close()* |
| 193 | Close popup {id}. The window and the associated buffer will |
| 194 | be deleted. |
| 195 | |
| 196 | If the popup has a callback it will be called just before the |
| 197 | popup window is deleted. If the optional {result} is present |
| 198 | it will be passed as the second argument of the callback. |
| 199 | Otherwise zero is passed to the callback. |
| 200 | |
| 201 | |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 202 | popup_create({what}, {options}) *popup_create()* |
| 203 | Open a popup window showing {what}, which is either: |
| 204 | - a buffer number |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 205 | - a string |
| 206 | - a list of strings |
| 207 | - a list of text lines with text properties |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 208 | When {what} is not a buffer number, a buffer is created with |
| 209 | 'buftype' set to "popup". That buffer will be wiped out once |
| 210 | the popup closes. |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 211 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 212 | {options} is a dictionary with many possible entries. |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 213 | See |popup_create-arguments| for details. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 214 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 215 | Returns a window-ID, which can be used with other popup |
| 216 | functions. Use `winbufnr()` to get the number of the buffer |
| 217 | in the window: > |
| 218 | let winid = popup_create('hello', {}) |
| 219 | let bufnr = winbufnr(winid) |
| 220 | call setbufline(bufnr, 2, 'second line') |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 221 | < In case of failure zero is returned. |
| 222 | |
| 223 | |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 224 | popup_dialog({what}, {options}) *popup_dialog()* |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 225 | Just like |popup_create()| but with these default options: > |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 226 | call popup_create({what}, { |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 227 | \ 'pos': 'center', |
| 228 | \ 'zindex': 200, |
Bram Moolenaar | a42d945 | 2019-06-15 21:46:30 +0200 | [diff] [blame] | 229 | \ 'drag': 1, |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 230 | \ 'border': [], |
Bram Moolenaar | 9eaac89 | 2019-06-01 22:49:29 +0200 | [diff] [blame] | 231 | \ 'padding': [], |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 232 | \}) |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 233 | < Use {options} to change the properties. E.g. add a 'filter' |
Bram Moolenaar | a42d945 | 2019-06-15 21:46:30 +0200 | [diff] [blame] | 234 | option with value 'popup_filter_yesno'. Example: > |
| 235 | call popup_create('do you want to quit (Yes/no)?', { |
| 236 | \ 'filter': 'popup_filter_yesno', |
| 237 | \ 'callback': 'QuitCallback', |
| 238 | \ }) |
| 239 | |
| 240 | < By default the dialog can be dragged, so that text below it |
| 241 | can be read if needed. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 242 | |
| 243 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 244 | popup_filter_menu({id}, {key}) *popup_filter_menu()* |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 245 | Filter that can be used for a popup. These keys can be used: |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 246 | j <Down> select item below |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 247 | k <Up> select item above |
| 248 | <Space> <Enter> accept current selection |
| 249 | x Esc CTRL-C cancel the menu |
| 250 | Other keys are ignored. |
| 251 | |
| 252 | A match is set on that line to highlight it, see |
| 253 | |popup_menu()|. |
| 254 | |
| 255 | When the current selection is accepted the "callback" of the |
| 256 | popup menu is invoked with the index of the selected line as |
| 257 | the second argument. The first entry has index one. |
| 258 | Cancelling the menu invokes the callback with -1. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 259 | |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 260 | To add shortcut keys, see the example here: |
| 261 | |popup_menu-shortcut-example| |
| 262 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 263 | |
| 264 | popup_filter_yesno({id}, {key}) *popup_filter_yesno()* |
| 265 | Filter that can be used for a popup. It handles only the keys |
| 266 | 'y', 'Y' and 'n' or 'N'. Invokes the "callback" of the |
| 267 | 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] | 268 | as the second argument. Pressing Esc and 'x' works like |
| 269 | pressing 'n'. CTRL-C invokes the callback with -1. Other |
| 270 | keys are ignored. |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 271 | See the example here: |popup_dialog-example| |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 272 | |
| 273 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 274 | popup_getoptions({id}) *popup_getoptions()* |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 275 | Return the {options} for popup {id} in a Dict. |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 276 | A zero value means the option was not set. For "zindex" the |
| 277 | default value is returned, not zero. |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 278 | |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 279 | The "moved" entry is a list with minimum and maximum column, |
| 280 | [0, 0] when not set. |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 281 | |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 282 | "border" and "padding" are not included when all values are |
| 283 | zero. When all values are one then an empty list is included. |
| 284 | |
| 285 | "borderhighlight" is not included when all values are empty. |
Bram Moolenaar | f9c85f5 | 2019-06-29 07:41:35 +0200 | [diff] [blame] | 286 | "scrollbarhighlight" and "thumbhighlight" are onlu included |
| 287 | when set. |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 288 | |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 289 | "tabpage" will be -1 for a global popup, zero for a popup on |
| 290 | the current tabpage and a positive number for a popup on |
| 291 | another tabpage. |
| 292 | |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 293 | If popup window {id} is not found an empty Dict is returned. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 294 | |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 295 | |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 296 | popup_getpos({id}) *popup_getpos()* |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 297 | Return the position and size of popup {id}. Returns a Dict |
| 298 | with these entries: |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 299 | col screen column of the popup, one-based |
| 300 | line screen line of the popup, one-based |
Bram Moolenaar | 2fd8e35 | 2019-06-01 20:16:48 +0200 | [diff] [blame] | 301 | width width of the whole popup in screen cells |
| 302 | height height of the whole popup in screen cells |
| 303 | core_col screen column of the text box |
| 304 | core_line screen line of the text box |
| 305 | core_width width of the text box in screen cells |
| 306 | core_height height of the text box in screen cells |
Bram Moolenaar | 68acb41 | 2019-06-26 03:40:36 +0200 | [diff] [blame] | 307 | firstline line of the buffer at top (1 unless scrolled) |
| 308 | scrollbar non-zero if a scrollbar is displayed |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 309 | visible one if the popup is displayed, zero if hidden |
Bram Moolenaar | bc13354 | 2019-05-29 20:26:46 +0200 | [diff] [blame] | 310 | Note that these are the actual screen positions. They differ |
| 311 | from the values in `popup_getoptions()` for the sizing and |
| 312 | positioning mechanism applied. |
Bram Moolenaar | 2fd8e35 | 2019-06-01 20:16:48 +0200 | [diff] [blame] | 313 | |
| 314 | The "core_" values exclude the padding and border. |
| 315 | |
Bram Moolenaar | bc13354 | 2019-05-29 20:26:46 +0200 | [diff] [blame] | 316 | If popup window {id} is not found an empty Dict is returned. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 317 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 318 | |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 319 | popup_hide({id}) *popup_hide()* |
| 320 | If {id} is a displayed popup, hide it now. If the popup has a |
| 321 | filter it will not be invoked for so long as the popup is |
| 322 | hidden. |
| 323 | If window {id} does not exist nothing happens. If window {id} |
| 324 | exists but is not a popup window an error is given. *E993* |
| 325 | |
| 326 | |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 327 | popup_menu({what}, {options}) *popup_menu()* |
| 328 | Show the {what} near the cursor, handle selecting one of the |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 329 | items with cursorkeys, and close it an item is selected with |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 330 | Space or Enter. {what} should have multiple lines to make this |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 331 | useful. This works like: > |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 332 | call popup_create({what}, { |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 333 | \ 'pos': 'center', |
| 334 | \ 'zindex': 200, |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 335 | \ 'drag': 1, |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 336 | \ 'wrap': 0, |
| 337 | \ 'border': [], |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 338 | \ 'padding': [], |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 339 | \ 'filter': 'popup_filter_menu', |
| 340 | \ }) |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 341 | < The current line is highlighted with a match using |
Bram Moolenaar | 6c1e157 | 2019-06-22 02:13:00 +0200 | [diff] [blame] | 342 | "PopupSelected", or "PmenuSel" if that is not defined. |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 343 | |
| 344 | Use {options} to change the properties. Should at least set |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 345 | "callback" to a function that handles the selected item. |
| 346 | |
| 347 | |
| 348 | popup_move({id}, {options}) *popup_move()* |
Bram Moolenaar | b53fb31 | 2019-06-13 23:59:52 +0200 | [diff] [blame] | 349 | Move popup {id} to the position specified with {options}. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 350 | {options} may contain the items from |popup_create()| that |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 351 | specify the popup position: |
| 352 | line |
| 353 | col |
| 354 | pos |
| 355 | maxheight |
| 356 | minheight |
| 357 | maxwidth |
| 358 | minwidth |
| 359 | fixed |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 360 | For {id} see `popup_hide()`. |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 361 | For other options see |popup_setoptions()|. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 362 | |
| 363 | |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 364 | popup_notification({what}, {options}) *popup_notification()* |
| 365 | 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] | 366 | This works like: > |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 367 | call popup_create({what}, { |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 368 | \ 'line': 1, |
| 369 | \ 'col': 10, |
Bram Moolenaar | dfa97f2 | 2019-06-15 14:31:55 +0200 | [diff] [blame] | 370 | \ 'minwidth': 20, |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 371 | \ 'time': 3000, |
Bram Moolenaar | fc06cbb | 2019-06-15 14:14:31 +0200 | [diff] [blame] | 372 | \ 'tabpage': -1, |
Bram Moolenaar | a42d945 | 2019-06-15 21:46:30 +0200 | [diff] [blame] | 373 | \ 'zindex': 300, |
Bram Moolenaar | b53fb31 | 2019-06-13 23:59:52 +0200 | [diff] [blame] | 374 | \ 'drag': 1, |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 375 | \ 'highlight': 'WarningMsg', |
| 376 | \ 'border': [], |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 377 | \ 'close': 'click', |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 378 | \ 'padding': [0,1,0,1], |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 379 | \ }) |
Bram Moolenaar | dfa97f2 | 2019-06-15 14:31:55 +0200 | [diff] [blame] | 380 | < The PopupNotification highlight group is used instead of |
| 381 | WarningMsg if it is defined. |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 382 | |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 383 | Without the |+timers| feature the poup will not disappear |
| 384 | automatically, the user has to click in it. |
Bram Moolenaar | 75fb085 | 2019-06-25 05:15:58 +0200 | [diff] [blame] | 385 | |
Bram Moolenaar | a730e55 | 2019-06-16 19:05:31 +0200 | [diff] [blame] | 386 | The position will be adjusted to avoid overlap with other |
Bram Moolenaar | 68d48f4 | 2019-06-12 22:42:41 +0200 | [diff] [blame] | 387 | notifications. |
| 388 | Use {options} to change the properties. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 389 | |
| 390 | |
| 391 | popup_show({id}) *popup_show()* |
| 392 | If {id} is a hidden popup, show it now. |
| 393 | For {id} see `popup_hide()`. |
| 394 | |
| 395 | |
| 396 | popup_setoptions({id}, {options}) *popup_setoptions()* |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 397 | Override options in popup {id} with entries in {options}. |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 398 | These options can be set: |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 399 | border |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 400 | borderchars |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 401 | borderhighlight |
| 402 | callback |
| 403 | close |
| 404 | drag |
| 405 | filter |
| 406 | firstline |
| 407 | flip |
| 408 | highlight |
| 409 | mask |
| 410 | moved |
| 411 | padding |
Bram Moolenaar | 75fb085 | 2019-06-25 05:15:58 +0200 | [diff] [blame] | 412 | scrollbar |
Bram Moolenaar | f9c85f5 | 2019-06-29 07:41:35 +0200 | [diff] [blame] | 413 | scrollbarhighlight |
| 414 | thumbhighlight |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 415 | time |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 416 | title |
| 417 | wrap |
| 418 | zindex |
Bram Moolenaar | ae94315 | 2019-06-16 22:54:14 +0200 | [diff] [blame] | 419 | The options from |popup_move()| can also be used. |
| 420 | For "hidden" use |popup_hide()| and |popup_show()|. |
| 421 | "tabpage" cannot be changed. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 422 | |
Bram Moolenaar | dc2ce58 | 2019-06-16 15:32:14 +0200 | [diff] [blame] | 423 | popup_settext({id}, {text}) *popup_settext()* |
| 424 | Set the text of the buffer in poup win {id}. {text} is the |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 425 | same as supplied to |popup_create()|, except that a buffer |
| 426 | number is not allowed. |
Bram Moolenaar | dc2ce58 | 2019-06-16 15:32:14 +0200 | [diff] [blame] | 427 | Does not change the window size or position, other than caused |
| 428 | by the different text. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 429 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 430 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 431 | ============================================================================== |
| 432 | 3. Usage *popup-usage* |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 433 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 434 | POPUP_CREATE() ARGUMENTS *popup_create-arguments* |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 435 | |
Bram Moolenaar | dc2ce58 | 2019-06-16 15:32:14 +0200 | [diff] [blame] | 436 | The first argument of |popup_create()| (and the second argument to |
Bram Moolenaar | 6c1e157 | 2019-06-22 02:13:00 +0200 | [diff] [blame] | 437 | |popup_settext()|) specifies the text to be displayed, and optionally text |
Bram Moolenaar | 5b8cfed | 2019-06-30 22:16:10 +0200 | [diff] [blame] | 438 | properties. It is in one of four forms: |
| 439 | - a buffer number |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 440 | - a string |
| 441 | - a list of strings |
| 442 | - a list of dictionaries, where each dictionary has these entries: |
| 443 | text String with the text to display. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 444 | props A list of text properties. Optional. |
| 445 | Each entry is a dictionary, like the third argument of |
| 446 | |prop_add()|, but specifying the column in the |
| 447 | dictionary with a "col" entry, see below: |
| 448 | |popup-props|. |
| 449 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 450 | The second argument of |popup_create()| is a dictionary with options: |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 451 | line Screen line where to position the popup. Can use a |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 452 | number or "cursor", "cursor+1" or "cursor-1" to use |
| 453 | the line of the cursor and add or subtract a number of |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 454 | lines. If omitted the popup is vertically centered. |
| 455 | The first line is 1. |
| 456 | col Screen column where to position the popup. Can use a |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 457 | number or "cursor" to use the column of the cursor, |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 458 | "cursor+9" or "cursor-9" to add or subtract a number |
| 459 | of columns. If omitted the popup is horizontally |
| 460 | centered. The first column is 1. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 461 | pos "topleft", "topright", "botleft" or "botright": |
| 462 | defines what corner of the popup "line" and "col" are |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 463 | used for. When not set "topleft" is used. |
| 464 | Alternatively "center" can be used to position the |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 465 | popup in the center of the Vim window, in which case |
| 466 | "line" and "col" are ignored. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 467 | fixed When FALSE (the default), and: |
| 468 | - "pos" is "botleft" or "topleft", and |
| 469 | - "wrap" is off, and |
| 470 | - the popup would be truncated at the right edge of |
| 471 | the screen, then |
| 472 | the popup is moved to the left so as to fit the |
| 473 | contents on the screen. Set to TRUE to disable this. |
| 474 | flip When TRUE (the default) and the position is relative |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 475 | to the cursor, flip to below or above the cursor to |
| 476 | avoid overlap with the |popupmenu-completion| or |
Bram Moolenaar | dc2ce58 | 2019-06-16 15:32:14 +0200 | [diff] [blame] | 477 | another popup with a higher "zindex". When there is |
| 478 | no space above/below the cursor then show the popup to |
| 479 | the side of the popup or popup menu. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 480 | {not implemented yet} |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 481 | maxheight Maximum height of the contents, excluding border and |
| 482 | padding. |
| 483 | minheight Minimum height of the contents, excluding border and |
| 484 | padding. |
| 485 | maxwidth Maximum width of the contents, excluding border and |
| 486 | padding. |
| 487 | minwidth Minimum width of the contents, excluding border and |
| 488 | padding. |
Bram Moolenaar | 8d24104 | 2019-06-12 23:40:01 +0200 | [diff] [blame] | 489 | firstline First buffer line to display. When larger than one it |
| 490 | looks like the text scrolled up. When out of range |
| 491 | the last buffer line will at the top of the window. |
Bram Moolenaar | 75fb085 | 2019-06-25 05:15:58 +0200 | [diff] [blame] | 492 | Also see "scrollbar". |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 493 | hidden When TRUE the popup exists but is not displayed; use |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 494 | `popup_show()` to unhide it. |
Bram Moolenaar | 6c1e157 | 2019-06-22 02:13:00 +0200 | [diff] [blame] | 495 | tabpage When -1: display the popup on all tab pages. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 496 | When 0 (the default): display the popup on the current |
Bram Moolenaar | fc06cbb | 2019-06-15 14:14:31 +0200 | [diff] [blame] | 497 | tab page. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 498 | Otherwise the number of the tab page the popup is |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 499 | displayed on; when invalid the popup is not created |
Bram Moolenaar | b2cda0d | 2019-06-24 05:06:36 +0200 | [diff] [blame] | 500 | and an error is given. *E997* |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 501 | title Text to be displayed above the first item in the |
| 502 | popup, on top of any border. If there is no top |
Bram Moolenaar | b53fb31 | 2019-06-13 23:59:52 +0200 | [diff] [blame] | 503 | border one line of padding is added to put the title |
Bram Moolenaar | eb2310d | 2019-06-16 20:09:10 +0200 | [diff] [blame] | 504 | on. You might want to add one or more spaces at the |
| 505 | start and end as padding. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 506 | wrap TRUE to make the lines wrap (default TRUE). |
Bram Moolenaar | b53fb31 | 2019-06-13 23:59:52 +0200 | [diff] [blame] | 507 | drag TRUE to allow the popup to be dragged with the mouse |
| 508 | by grabbing at at the border. Has no effect if the |
Bram Moolenaar | dc2ce58 | 2019-06-16 15:32:14 +0200 | [diff] [blame] | 509 | popup does not have a border. As soon as dragging |
| 510 | starts and "pos" is "center" it is changed to |
| 511 | "topleft". |
Bram Moolenaar | 2e62b56 | 2019-06-30 18:07:00 +0200 | [diff] [blame] | 512 | close When "button" an X is displayed in the top-right, on |
| 513 | top of any border, padding or text. When clicked on |
| 514 | the X the popup will close. Any callback is invoked |
| 515 | with the value -2. |
| 516 | When "click" any mouse click in the popup will close |
| 517 | it. |
| 518 | When "none" (the default) mouse clicks do not close |
| 519 | the popup window. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 520 | highlight Highlight group name to use for the text, stored in |
| 521 | the 'wincolor' option. |
| 522 | padding List with numbers, defining the padding |
| 523 | above/right/below/left of the popup (similar to CSS). |
| 524 | An empty list uses a padding of 1 all around. The |
| 525 | padding goes around the text, inside any border. |
| 526 | Padding uses the 'wincolor' highlight. |
| 527 | Example: [1, 2, 1, 3] has 1 line of padding above, 2 |
| 528 | columns on the right, 1 line below and 3 columns on |
| 529 | the left. |
| 530 | border List with numbers, defining the border thickness |
| 531 | above/right/below/left of the popup (similar to CSS). |
| 532 | Only values of zero and non-zero are recognized. |
| 533 | An empty list uses a border all around. |
| 534 | borderhighlight List of highlight group names to use for the border. |
| 535 | When one entry it is used for all borders, otherwise |
| 536 | the highlight for the top/right/bottom/left border. |
| 537 | Example: ['TopColor', 'RightColor', 'BottomColor, |
| 538 | 'LeftColor'] |
| 539 | borderchars List with characters, defining the character to use |
| 540 | for the top/right/bottom/left border. Optionally |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 541 | followed by the character to use for the |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 542 | topleft/topright/botright/botleft corner. |
| 543 | Example: ['-', '|', '-', '|', '┌', '┐', '┘', '└'] |
| 544 | When the list has one character it is used for all. |
| 545 | When the list has two characters the first is used for |
| 546 | the border lines, the second for the corners. |
| 547 | By default a double line is used all around when |
Bram Moolenaar | 6c1e157 | 2019-06-22 02:13:00 +0200 | [diff] [blame] | 548 | 'encoding' is "utf-8" and 'ambiwidth' is "single", |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 549 | otherwise ASCII characters are used. |
Bram Moolenaar | 75fb085 | 2019-06-25 05:15:58 +0200 | [diff] [blame] | 550 | scrollbar non-zero: show a scrollbar when the text doesn't fit. |
| 551 | zero: do not show a scrollbar. Default is non-zero. |
Bram Moolenaar | f9c85f5 | 2019-06-29 07:41:35 +0200 | [diff] [blame] | 552 | Also see |popup-scrollbar|. |
| 553 | scrollbarhighlight Highlight group name for the scrollbar. The |
| 554 | background color is what matters. When not given then |
| 555 | PmenuSbar is used. |
| 556 | thumbhighlight Highlight group name for the scrollbar thumb. The |
| 557 | background color is what matters. When not given then |
| 558 | PmenuThumb is used. |
Bram Moolenaar | b53fb31 | 2019-06-13 23:59:52 +0200 | [diff] [blame] | 559 | zindex Priority for the popup, default 50. Minimum value is |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 560 | 1, maximum value is 32000. |
Bram Moolenaar | c662ec9 | 2019-06-23 00:15:57 +0200 | [diff] [blame] | 561 | mask A list of lists with coordinates, defining parts of |
| 562 | the popup that are transparent. See |popup-mask|. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 563 | time Time in milliseconds after which the popup will close. |
| 564 | When omitted |popup_close()| must be used. |
Bram Moolenaar | 3397f74 | 2019-06-02 18:40:06 +0200 | [diff] [blame] | 565 | moved Specifies to close the popup if the cursor moved: |
| 566 | - "any": if the cursor moved at all |
| 567 | - "word": if the cursor moved outside |<cword>| |
| 568 | - "WORD": if the cursor moved outside |<cWORD>| |
| 569 | - [{start}, {end}]: if the cursor moved before column |
| 570 | {start} or after {end} |
| 571 | The popup also closes if the cursor moves to another |
| 572 | line or to another window. |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 573 | filter A callback that can filter typed characters, see |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 574 | |popup-filter|. |
| 575 | callback A callback that is called when the popup closes, e.g. |
| 576 | when using |popup_filter_menu()|, see |popup-callback|. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 577 | |
| 578 | Depending on the "zindex" the popup goes under or above other popups. The |
| 579 | completion menu (|popup-menu|) has zindex 100. For messages that occur for a |
| 580 | short time the suggestion is to use zindex 1000. |
| 581 | |
| 582 | By default text wraps, which causes a line in {lines} to occupy more than one |
| 583 | screen line. When "wrap" is FALSE then the text outside of the popup or |
| 584 | outside of the Vim window will not be displayed, thus truncated. |
| 585 | |
| 586 | |
| 587 | POPUP TEXT PROPERTIES *popup-props* |
| 588 | |
Bram Moolenaar | 7a8d027 | 2019-05-26 23:32:06 +0200 | [diff] [blame] | 589 | These are similar to the third argument of |prop_add()| except: |
| 590 | - "lnum" is always the current line in the list |
| 591 | - "bufnr" is always the buffer of the popup |
| 592 | - "col" is in the Dict instead of a separate argument |
Bram Moolenaar | 7a8d027 | 2019-05-26 23:32:06 +0200 | [diff] [blame] | 593 | So we get: |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 594 | col starting column, counted in bytes, use one for the |
| 595 | first column. |
| 596 | length length of text in bytes; can be zero |
Bram Moolenaar | 7a8d027 | 2019-05-26 23:32:06 +0200 | [diff] [blame] | 597 | end_lnum line number for the end of the text |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 598 | end_col column just after the text; not used when "length" is |
| 599 | present; when {col} and "end_col" are equal, this is a |
| 600 | zero-width text property |
| 601 | id user defined ID for the property; when omitted zero is |
| 602 | used |
| 603 | type name of the text property type, as added with |
| 604 | |prop_type_add()| |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 605 | |
| 606 | |
| 607 | POPUP FILTER *popup-filter* |
| 608 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 609 | 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] | 610 | not invoked when the popup is hidden. |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 611 | |
| 612 | The filter can return TRUE to indicate the key has been handled and is to be |
| 613 | 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] | 614 | In case it returns FALSE and there is another popup window visible, that |
| 615 | filter is also called. The filter of the popup window with the highest zindex |
| 616 | is called first. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 617 | |
| 618 | 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] | 619 | key as a string, e.g.: > |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 620 | func MyFilter(winid, key) |
| 621 | if a:key == "\<F2>" |
| 622 | " do something |
| 623 | return 1 |
| 624 | endif |
| 625 | if a:key == 'x' |
| 626 | call popup_close(a:winid) |
| 627 | return 1 |
| 628 | endif |
| 629 | return 0 |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 630 | endfunc |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 631 | |
| 632 | Currently the key is what results after any mapping. This may change... |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 633 | |
| 634 | Some common key actions: |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 635 | x close the popup (see note below) |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 636 | cursor keys select another entry |
| 637 | Tab accept current suggestion |
| 638 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 639 | A mouse click arrives as <LeftMouse>. The coordinates are in |
| 640 | v:mouse_popup_col and v:mouse_popup_row. The top-left screen cell of the |
| 641 | popup is col 1, row 1 (not counting the border). |
| 642 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 643 | Vim provides standard filters |popup_filter_menu()| and |
| 644 | |popup_filter_yesno()|. |
| 645 | |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 646 | Note that "x" is the normal way to close a popup. You may want to use Esc, |
| 647 | 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] | 648 | 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] | 649 | 'ttimeoutlen' option to 100 and set 'timeout' and/or 'ttimeout'. |
| 650 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 651 | |
| 652 | POPUP CALLBACK *popup-callback* |
| 653 | |
Bram Moolenaar | a42d945 | 2019-06-15 21:46:30 +0200 | [diff] [blame] | 654 | A callback that is invoked when the popup closes. |
Bram Moolenaar | 9eaac89 | 2019-06-01 22:49:29 +0200 | [diff] [blame] | 655 | |
| 656 | The callback is invoked with two arguments: the ID of the popup window and the |
| 657 | result, which could be an index in the popup lines, or whatever was passed as |
| 658 | the second argument of `popup_close()`. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 659 | |
Bram Moolenaar | a42d945 | 2019-06-15 21:46:30 +0200 | [diff] [blame] | 660 | If the popup is force-closed, e.g. because the cursor moved or CTRL-C was |
| 661 | pressed, the number -1 is passed to the callback. |
Bram Moolenaar | 3397f74 | 2019-06-02 18:40:06 +0200 | [diff] [blame] | 662 | |
Bram Moolenaar | c662ec9 | 2019-06-23 00:15:57 +0200 | [diff] [blame] | 663 | |
Bram Moolenaar | f9c85f5 | 2019-06-29 07:41:35 +0200 | [diff] [blame] | 664 | POPUP SCROLLBAR *popup-scrollbar* |
| 665 | |
| 666 | If the text does not fit in the popup a scrollbar is displayed on the right of |
| 667 | the window. This can be disabled by setting the "scrollbar" option to zero. |
| 668 | When the scrollbar is displayed mouse scroll events, while the mouse pointer |
| 669 | is on the popup, will cause the text to scroll up or down as you would expect. |
| 670 | A click in the upper halve of the scrollbar will scroll the text one line |
| 671 | down. A click in the lower halve wil scroll the text one line up. However, |
| 672 | this is limited so that the popup does not get smaller. |
| 673 | |
| 674 | |
Bram Moolenaar | c662ec9 | 2019-06-23 00:15:57 +0200 | [diff] [blame] | 675 | POPUP MASK *popup-mask* |
| 676 | |
| 677 | To minimize the text that the popup covers, parts of it can be made |
| 678 | transparent. This is defined by a "mask" which is a list of lists, where each |
| 679 | list has four numbers: |
| 680 | col start column, positive for counting from the left, 1 for |
| 681 | leftmost, negative for counting from the right, -1 for |
| 682 | rightmost |
| 683 | endcol last column, like "col" |
| 684 | line start line, positive for conting from the top, 1 for top, |
| 685 | negative for counting from the bottom, -1 for bottom |
| 686 | endline end line, like "line" |
| 687 | |
| 688 | For example, to make the last 10 columns of the last line transparent: |
| 689 | [[-10, -1, -1, -1]] |
| 690 | |
| 691 | To make the four corners transparent: |
| 692 | [[1, 1, 1, 1], [-1, -1, 1, 1], [1, 1, -1, -1], [-1, -1, -1, -1]] |
| 693 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 694 | ============================================================================== |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 695 | 4. Examples *popup-examples* |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 696 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 697 | TODO: more interesting examples |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 698 | *popup_dialog-example* |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 699 | Prompt the user to press y/Y or n/N: > |
| 700 | |
| 701 | func MyDialogHandler(id, result) |
| 702 | if a:result |
| 703 | " ... 'y' or 'Y' was pressed |
| 704 | endif |
| 705 | endfunc |
| 706 | |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 707 | call popup_dialog('Continue? y/n', { |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 708 | \ 'filter': 'popup_filter_yesno', |
| 709 | \ 'callback': 'MyDialogHandler', |
| 710 | \ }) |
| 711 | < |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 712 | *popup_menu-shortcut-example* |
| 713 | Extend popup_filter_menu() with shortcut keys: > |
| 714 | |
Bram Moolenaar | 6c1e157 | 2019-06-22 02:13:00 +0200 | [diff] [blame] | 715 | call popup_menu(['Save', 'Cancel', 'Discard'], { |
Bram Moolenaar | a3fce62 | 2019-06-20 02:31:49 +0200 | [diff] [blame] | 716 | \ 'filter': 'MyMenuFilter', |
| 717 | \ 'callback': 'MyMenuHandler', |
| 718 | \ }) |
| 719 | |
| 720 | func MyMenuFilter(id, key) |
| 721 | " Handle shortcuts |
| 722 | if a:key == 'S' |
| 723 | call popup_close(a:id, 1) |
| 724 | return 1 |
| 725 | endif |
| 726 | if a:key == 'C' |
| 727 | call popup_close(a:id, 2) |
| 728 | return 1 |
| 729 | endif |
| 730 | if a:key == 'D' |
| 731 | call popup_close(a:id, 3) |
| 732 | return 1 |
| 733 | endif |
| 734 | |
| 735 | " No shortcut, pass to generic filter |
| 736 | return popup_filter_menu(a:id, a:key) |
| 737 | endfunc |
| 738 | < |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 739 | |
| 740 | vim:tw=78:ts=8:noet:ft=help:norl: |