Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 1 | *popup.txt* For Vim version 8.1. Last change: 2019 Jun 10 |
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 | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 7 | Displaying text in floating window. *popup* *popup-window* |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 8 | |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 9 | THIS IS UNDER DESIGN - ANYTHING MAY STILL CHANGE |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 10 | |
| 11 | 1. Introduction |popup-intro| |
| 12 | 2. Functions |popup-functions| |
| 13 | 3. Examples |popup-examples| |
| 14 | |
| 15 | |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 16 | {not available if the |+textprop| feature was disabled at compile time} |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 17 | |
| 18 | ============================================================================== |
| 19 | 1. Introduction *popup-intro* |
| 20 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 21 | We are talking about popup windows here, text that goes on top of the regular |
| 22 | windows and is under control of a plugin. You cannot edit the text in the |
| 23 | popup window like with regular windows. |
| 24 | |
| 25 | A popup window can be used for such things as: |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 26 | - briefly show a message without overwriting the command line |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 27 | - prompt the user with a dialog |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 28 | - display contextual information while typing |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 29 | - give extra information for auto-completion |
| 30 | |
| 31 | The text in the popup window can be colored with |text-properties|. It is |
| 32 | also possible to use syntax highlighting. |
| 33 | |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 34 | The default color used is "Pmenu". If you prefer something else use the |
| 35 | "highlight" argument or the 'wincolor' option, e.g.: > |
| 36 | hi MyPopupColor ctermbg=lightblue guibg=lightblue |
| 37 | call setwinvar(winid, '&wincolor', 'MyPopupColor') |
| 38 | |
| 39 | 'hlsearch' and match highlighting are not displayed in a popup window. |
| 40 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 41 | A popup window has a window-ID like other windows, but behaves differently. |
| 42 | The size can be up to the whole Vim window and it overlaps other windows. |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 43 | Popup windows can also overlap each other. |
| 44 | |
| 45 | The popup window contains a buffer, and that buffer is always associated with |
| 46 | the popup window. The window cannot be used in Normal, Visual or Insert mode, |
| 47 | it does not get keyboard focus. You can use functions like `setbufline()` to |
| 48 | change the text in the buffer. There are more differences from how this |
| 49 | window and buffer behave compared to regular windows and buffers, see |
| 50 | |popup-buffer|. |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 51 | |
| 52 | 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] | 53 | - popup menu, see |popup-menu| |
| 54 | - balloon, see |balloon-eval| |
| 55 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 56 | |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 57 | WINDOW POSITION AND SIZE *popup-position* |
| 58 | |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 59 | The height of the window is normally equal to the number of, possibly |
| 60 | wrapping, lines in the buffer. It can be limited with the "maxheight" |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 61 | property. You can use empty lines to increase the height or the "minheight" |
| 62 | property. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 63 | |
| 64 | The width of the window is normally equal to the longest line in the buffer. |
| 65 | It can be limited with the "maxwidth" property. You can use spaces to |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 66 | increase the width or the "minwidth" property. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 67 | |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 68 | By default the 'wrap' option is set, so that no text disappears. Otherwise, |
| 69 | if there is not enough space then the window is shifted left in order to |
| 70 | display more text. This can be disabled with the "fixed" property. Also |
| 71 | disabled when right-aligned. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 72 | |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 73 | Vim tries to show the popup in the location you specify. In some cases, e.g. |
| 74 | when the popup would go outside of the Vim window, it will show it somewhere |
| 75 | else. E.g. if you use `popup_atcursor()` the popup normally shows just above |
| 76 | the current cursor position, but if the cursor is close to the top of the Vim |
| 77 | window it will be placed below the cursor position. |
| 78 | |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 79 | When the screen scrolls up for output of an Ex command, popups move too, so |
| 80 | that they will not cover the output. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 81 | |
Bram Moolenaar | 868b7b6 | 2019-05-29 21:44:40 +0200 | [diff] [blame] | 82 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 83 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 84 | |
| 85 | IMPLEMENTATION: |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 86 | - buffers remain after a popup was deleted. |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 87 | - Why does 'nrformats' leak from the popup window buffer??? |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 88 | - Add 'balloonpopup': instead of showing text, let the callback open a popup |
| 89 | window and return the window ID. The popup will then be closed when the |
| 90 | mouse moves, except when it moves inside the popup. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 91 | - For the "moved" property also include mouse movement? |
| 92 | - Make redrawing more efficient and avoid flicker: |
| 93 | - put popup menu also put in popup_mask? |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 94 | - Disable commands, feedkeys(), CTRL-W, etc. in a popup window. |
Bram Moolenaar | 2fd8e35 | 2019-06-01 20:16:48 +0200 | [diff] [blame] | 95 | Use NOT_IN_POPUP_WINDOW for more commands. |
| 96 | - Invoke filter with character before mapping? |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 97 | - Figure out the size and position better. |
| 98 | if wrapping splits a double-wide character |
Bram Moolenaar | cc31ad9 | 2019-05-30 19:25:06 +0200 | [diff] [blame] | 99 | if wrapping inserts indent |
Bram Moolenaar | bc13354 | 2019-05-29 20:26:46 +0200 | [diff] [blame] | 100 | - Can the buffer be re-used, to avoid using up lots of buffer numbers? |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 101 | - Implement all the unimplemented options and features. |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 102 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 103 | |
| 104 | ============================================================================== |
| 105 | 2. Functions *popup-functions* |
| 106 | |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 107 | THIS IS UNDER DESIGN - ANYTHING MAY STILL CHANGE |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 108 | |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 109 | [functions to be moved to eval.txt later, keep overview of functions here] |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 110 | |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 111 | popup_atcursor({text}, {options}) *popup_atcursor()* |
| 112 | Show the {text} above the cursor, and close it when the cursor |
| 113 | moves. This works like: > |
| 114 | call popup_create({text}, { |
| 115 | \ 'pos': 'botleft', |
| 116 | \ 'line': 'cursor-1', |
| 117 | \ 'col': 'cursor', |
| 118 | \ 'moved': 'WORD', |
| 119 | \ }) |
| 120 | < Use {options} to change the properties. |
| 121 | |
| 122 | |
| 123 | *popup_clear()* |
| 124 | popup_clear() Emergency solution to a misbehaving plugin: close all popup |
| 125 | windows. |
| 126 | |
| 127 | |
| 128 | popup_close({id} [, {result}]) *popup_close()* |
| 129 | Close popup {id}. The window and the associated buffer will |
| 130 | be deleted. |
| 131 | |
| 132 | If the popup has a callback it will be called just before the |
| 133 | popup window is deleted. If the optional {result} is present |
| 134 | it will be passed as the second argument of the callback. |
| 135 | Otherwise zero is passed to the callback. |
| 136 | |
| 137 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 138 | popup_create({text}, {options}) *popup_create()* |
| 139 | Open a popup window showing {text}, which is either: |
| 140 | - a string |
| 141 | - a list of strings |
| 142 | - a list of text lines with text properties |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 143 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 144 | {options} is a dictionary with many possible entries. |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 145 | See |popup_create-usage| for details. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 146 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 147 | Returns a window-ID, which can be used with other popup |
| 148 | functions. Use `winbufnr()` to get the number of the buffer |
| 149 | in the window: > |
| 150 | let winid = popup_create('hello', {}) |
| 151 | let bufnr = winbufnr(winid) |
| 152 | call setbufline(bufnr, 2, 'second line') |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 153 | < In case of failure zero is returned. |
| 154 | |
| 155 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 156 | popup_dialog({text}, {options}) *popup_dialog()* |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 157 | {not implemented yet} |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 158 | Just like |popup_create()| but with these default options: > |
| 159 | call popup_create({text}, { |
| 160 | \ 'pos': 'center', |
| 161 | \ 'zindex': 200, |
| 162 | \ 'border': [], |
Bram Moolenaar | 9eaac89 | 2019-06-01 22:49:29 +0200 | [diff] [blame] | 163 | \ 'padding': [], |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 164 | \}) |
| 165 | < Use {options} to change the properties. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 166 | |
| 167 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 168 | popup_filter_menu({id}, {key}) *popup_filter_menu()* |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 169 | {not implemented yet} |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 170 | Filter that can be used for a popup. It handles the cursor |
| 171 | keys to move the selected index in the popup. Space and Enter |
| 172 | can be used to select an item. Invokes the "callback" of the |
| 173 | popup menu with the index of the selected line as the second |
| 174 | argument. |
| 175 | |
| 176 | |
| 177 | popup_filter_yesno({id}, {key}) *popup_filter_yesno()* |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 178 | {not implemented yet} |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 179 | Filter that can be used for a popup. It handles only the keys |
| 180 | 'y', 'Y' and 'n' or 'N'. Invokes the "callback" of the |
| 181 | popup menu with the 1 for 'y' or 'Y' and zero for 'n' or 'N' |
| 182 | as the second argument. Pressing Esc and CTRL-C works like |
| 183 | pressing 'n'. |
| 184 | |
| 185 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 186 | popup_getoptions({id}) *popup_getoptions()* |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 187 | Return the {options} for popup {id} in a Dict. |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 188 | A zero value means the option was not set. For "zindex" the |
| 189 | default value is returned, not zero. |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 190 | |
| 191 | The "highlight" entry is omitted, use the 'wincolor' option |
| 192 | for that: > |
| 193 | let hl = getwinvar(winid, '&wincolor') |
| 194 | |
| 195 | < If popup window {id} is not found an empty Dict is returned. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 196 | |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 197 | |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 198 | popup_getpos({id}) *popup_getpos()* |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 199 | Return the position and size of popup {id}. Returns a Dict |
| 200 | with these entries: |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 201 | col screen column of the popup, one-based |
| 202 | line screen line of the popup, one-based |
Bram Moolenaar | 2fd8e35 | 2019-06-01 20:16:48 +0200 | [diff] [blame] | 203 | width width of the whole popup in screen cells |
| 204 | height height of the whole popup in screen cells |
| 205 | core_col screen column of the text box |
| 206 | core_line screen line of the text box |
| 207 | core_width width of the text box in screen cells |
| 208 | core_height height of the text box in screen cells |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 209 | visible one if the popup is displayed, zero if hidden |
Bram Moolenaar | bc13354 | 2019-05-29 20:26:46 +0200 | [diff] [blame] | 210 | Note that these are the actual screen positions. They differ |
| 211 | from the values in `popup_getoptions()` for the sizing and |
| 212 | positioning mechanism applied. |
Bram Moolenaar | 2fd8e35 | 2019-06-01 20:16:48 +0200 | [diff] [blame] | 213 | |
| 214 | The "core_" values exclude the padding and border. |
| 215 | |
Bram Moolenaar | bc13354 | 2019-05-29 20:26:46 +0200 | [diff] [blame] | 216 | If popup window {id} is not found an empty Dict is returned. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 217 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 218 | |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 219 | popup_hide({id}) *popup_hide()* |
| 220 | If {id} is a displayed popup, hide it now. If the popup has a |
| 221 | filter it will not be invoked for so long as the popup is |
| 222 | hidden. |
| 223 | If window {id} does not exist nothing happens. If window {id} |
| 224 | exists but is not a popup window an error is given. *E993* |
| 225 | |
| 226 | |
| 227 | popup_menu({text}, {options}) *popup_menu()* |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 228 | {not implemented yet} |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 229 | Show the {text} near the cursor, handle selecting one of the |
| 230 | items with cursorkeys, and close it an item is selected with |
| 231 | Space or Enter. {text} should have multiple lines to make this |
| 232 | useful. This works like: > |
| 233 | call popup_create({text}, { |
| 234 | \ 'pos': 'center', |
| 235 | \ 'zindex': 200, |
| 236 | \ 'wrap': 0, |
| 237 | \ 'border': [], |
| 238 | \ 'filter': 'popup_filter_menu', |
| 239 | \ }) |
| 240 | < Use {options} to change the properties. Should at least set |
| 241 | "callback" to a function that handles the selected item. |
| 242 | |
| 243 | |
| 244 | popup_move({id}, {options}) *popup_move()* |
| 245 | Move popup {id} to the position speficied with {options}. |
| 246 | {options} may contain the items from |popup_create()| that |
| 247 | specify the popup position: "line", "col", "pos", "maxheight", |
| 248 | "minheight", "maxwidth" and "minwidth". |
| 249 | For {id} see `popup_hide()`. |
| 250 | |
| 251 | |
| 252 | popup_notification({text}, {options}) *popup_notification()* |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 253 | {not implemented yet} |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 254 | Show the {text} for 3 seconds at the top of the Vim window. |
| 255 | This works like: > |
| 256 | call popup_create({text}, { |
| 257 | \ 'line': 1, |
| 258 | \ 'col': 10, |
| 259 | \ 'time': 3000, |
| 260 | \ 'tab': -1, |
| 261 | \ 'zindex': 200, |
| 262 | \ 'highlight': 'WarningMsg', |
| 263 | \ 'border': [], |
| 264 | \ }) |
| 265 | < Use {options} to change the properties. |
| 266 | |
| 267 | |
| 268 | popup_show({id}) *popup_show()* |
| 269 | If {id} is a hidden popup, show it now. |
| 270 | For {id} see `popup_hide()`. |
| 271 | |
| 272 | |
| 273 | popup_setoptions({id}, {options}) *popup_setoptions()* |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 274 | {not implemented yet} |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 275 | Override options in popup {id} with entries in {options}. |
| 276 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 277 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 278 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 279 | POPUP BUFFER AND WINDOW *popup-buffer* |
| 280 | |
| 281 | A new buffer is created to hold the text and text properties of the popup |
| 282 | window. The buffer is always associated with the popup window and |
| 283 | manipulation is restricted: |
| 284 | - the buffer has no name |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 285 | - 'buftype' is "popup" |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 286 | - 'swapfile' is off |
| 287 | - 'bufhidden' is "hide" |
| 288 | - 'buflisted' is off |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 289 | - 'undolevels' is -1: no undo at all |
Bram Moolenaar | cc31ad9 | 2019-05-30 19:25:06 +0200 | [diff] [blame] | 290 | - all other buffer-local and window_local options are set to their Vim default |
| 291 | value. |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 292 | |
Bram Moolenaar | cc31ad9 | 2019-05-30 19:25:06 +0200 | [diff] [blame] | 293 | It is possible to change the specifically mentioned options, but anything |
| 294 | might break then, so better leave them alone. |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 295 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 296 | The window does have a cursor position, but the cursor is not displayed. |
| 297 | |
Bram Moolenaar | 868b7b6 | 2019-05-29 21:44:40 +0200 | [diff] [blame] | 298 | To execute a command in the context of the popup window and buffer use |
| 299 | `win_execute()`. Example: > |
| 300 | call win_execute(winid, 'syntax enable') |
| 301 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 302 | Options can be set on the window with `setwinvar()`, e.g.: > |
| 303 | call setwinvar(winid, '&wrap', 0) |
| 304 | And options can be set on the buffer with `setbufvar()`, e.g.: > |
| 305 | call setbufvar(winbufnr(winid), '&filetype', 'java') |
Bram Moolenaar | c6896e2 | 2019-05-30 22:32:34 +0200 | [diff] [blame] | 306 | Note that this does not trigger autocommands. Use `win_execute()` if you do |
| 307 | need them. |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 308 | |
| 309 | |
| 310 | POPUP_CREATE() ARGUMENTS *popup_create-usage* |
| 311 | |
| 312 | The first argument of |popup_create()| specifies the text to be displayed, and |
| 313 | optionally text properties. It is in one of three forms: |
| 314 | - a string |
| 315 | - a list of strings |
| 316 | - a list of dictionaries, where each dictionary has these entries: |
| 317 | text String with the text to display. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 318 | props A list of text properties. Optional. |
| 319 | Each entry is a dictionary, like the third argument of |
| 320 | |prop_add()|, but specifying the column in the |
| 321 | dictionary with a "col" entry, see below: |
| 322 | |popup-props|. |
| 323 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 324 | The second argument of |popup_create()| is a dictionary with options: |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 325 | line Screen line where to position the popup. Can use a |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 326 | number or "cursor", "cursor+1" or "cursor-1" to use |
| 327 | the line of the cursor and add or subtract a number of |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 328 | lines. If omitted the popup is vertically centered. |
| 329 | The first line is 1. |
| 330 | col Screen column where to position the popup. Can use a |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 331 | number or "cursor" to use the column of the cursor, |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 332 | "cursor+9" or "cursor-9" to add or subtract a number |
| 333 | of columns. If omitted the popup is horizontally |
| 334 | centered. The first column is 1. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 335 | pos "topleft", "topright", "botleft" or "botright": |
| 336 | defines what corner of the popup "line" and "col" are |
Bram Moolenaar | 8c2a600 | 2019-05-30 14:29:45 +0200 | [diff] [blame] | 337 | used for. When not set "topleft" is used. |
| 338 | Alternatively "center" can be used to position the |
Bram Moolenaar | ac1f1bc | 2019-05-30 21:24:26 +0200 | [diff] [blame] | 339 | popup in the center of the Vim window, in which case |
| 340 | "line" and "col" are ignored. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 341 | fixed When FALSE (the default), and: |
| 342 | - "pos" is "botleft" or "topleft", and |
| 343 | - "wrap" is off, and |
| 344 | - the popup would be truncated at the right edge of |
| 345 | the screen, then |
| 346 | the popup is moved to the left so as to fit the |
| 347 | contents on the screen. Set to TRUE to disable this. |
| 348 | flip When TRUE (the default) and the position is relative |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 349 | to the cursor, flip to below or above the cursor to |
| 350 | avoid overlap with the |popupmenu-completion| or |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 351 | another popup with a higher "zindex". |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 352 | {not implemented yet} |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 353 | maxheight Maximum height of the contents, excluding border and |
| 354 | padding. |
| 355 | minheight Minimum height of the contents, excluding border and |
| 356 | padding. |
| 357 | maxwidth Maximum width of the contents, excluding border and |
| 358 | padding. |
| 359 | minwidth Minimum width of the contents, excluding border and |
| 360 | padding. |
| 361 | hidden When TRUE the popup exists but is not displayed; use |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 362 | `popup_show()` to unhide it. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 363 | {not implemented yet} |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 364 | tab When -1: display the popup on all tabs. |
| 365 | When 0 (the default): display the popup on the current |
| 366 | tab. |
| 367 | Otherwise the number of the tab page the popup is |
| 368 | displayed on; when invalid the current tab is used. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 369 | {only -1 and 0 are implemented} |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 370 | title Text to be displayed above the first item in the |
| 371 | popup, on top of any border. If there is no top |
| 372 | border on line of padding is added to put the title on. |
Bram Moolenaar | 4d784b2 | 2019-05-25 19:51:39 +0200 | [diff] [blame] | 373 | {not implemented yet} |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 374 | wrap TRUE to make the lines wrap (default TRUE). |
| 375 | highlight Highlight group name to use for the text, stored in |
| 376 | the 'wincolor' option. |
| 377 | padding List with numbers, defining the padding |
| 378 | above/right/below/left of the popup (similar to CSS). |
| 379 | An empty list uses a padding of 1 all around. The |
| 380 | padding goes around the text, inside any border. |
| 381 | Padding uses the 'wincolor' highlight. |
| 382 | Example: [1, 2, 1, 3] has 1 line of padding above, 2 |
| 383 | columns on the right, 1 line below and 3 columns on |
| 384 | the left. |
| 385 | border List with numbers, defining the border thickness |
| 386 | above/right/below/left of the popup (similar to CSS). |
| 387 | Only values of zero and non-zero are recognized. |
| 388 | An empty list uses a border all around. |
| 389 | borderhighlight List of highlight group names to use for the border. |
| 390 | When one entry it is used for all borders, otherwise |
| 391 | the highlight for the top/right/bottom/left border. |
| 392 | Example: ['TopColor', 'RightColor', 'BottomColor, |
| 393 | 'LeftColor'] |
| 394 | borderchars List with characters, defining the character to use |
| 395 | for the top/right/bottom/left border. Optionally |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 396 | followed by the character to use for the |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 397 | topleft/topright/botright/botleft corner. |
| 398 | Example: ['-', '|', '-', '|', '┌', '┐', '┘', '└'] |
| 399 | When the list has one character it is used for all. |
| 400 | When the list has two characters the first is used for |
| 401 | the border lines, the second for the corners. |
| 402 | By default a double line is used all around when |
| 403 | 'encoding' is "utf-8", otherwise ASCII characters are |
| 404 | used. |
Bram Moolenaar | 3ff5f0f | 2019-06-10 13:11:22 +0200 | [diff] [blame] | 405 | zindex Priority for the popup, default 50. Mininum value is |
| 406 | 1, maximum value is 32000. |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 407 | time Time in milliseconds after which the popup will close. |
| 408 | When omitted |popup_close()| must be used. |
Bram Moolenaar | 3397f74 | 2019-06-02 18:40:06 +0200 | [diff] [blame] | 409 | moved Specifies to close the popup if the cursor moved: |
| 410 | - "any": if the cursor moved at all |
| 411 | - "word": if the cursor moved outside |<cword>| |
| 412 | - "WORD": if the cursor moved outside |<cWORD>| |
| 413 | - [{start}, {end}]: if the cursor moved before column |
| 414 | {start} or after {end} |
| 415 | The popup also closes if the cursor moves to another |
| 416 | line or to another window. |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 417 | filter A callback that can filter typed characters, see |
Bram Moolenaar | 042fb4b | 2019-06-02 14:49:56 +0200 | [diff] [blame] | 418 | |popup-filter|. |
| 419 | callback A callback that is called when the popup closes, e.g. |
| 420 | when using |popup_filter_menu()|, see |popup-callback|. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 421 | |
| 422 | Depending on the "zindex" the popup goes under or above other popups. The |
| 423 | completion menu (|popup-menu|) has zindex 100. For messages that occur for a |
| 424 | short time the suggestion is to use zindex 1000. |
| 425 | |
| 426 | By default text wraps, which causes a line in {lines} to occupy more than one |
| 427 | screen line. When "wrap" is FALSE then the text outside of the popup or |
| 428 | outside of the Vim window will not be displayed, thus truncated. |
| 429 | |
| 430 | |
| 431 | POPUP TEXT PROPERTIES *popup-props* |
| 432 | |
Bram Moolenaar | 7a8d027 | 2019-05-26 23:32:06 +0200 | [diff] [blame] | 433 | These are similar to the third argument of |prop_add()| except: |
| 434 | - "lnum" is always the current line in the list |
| 435 | - "bufnr" is always the buffer of the popup |
| 436 | - "col" is in the Dict instead of a separate argument |
| 437 | - "transparent" is extra |
| 438 | So we get: |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 439 | col starting column, counted in bytes, use one for the |
| 440 | first column. |
| 441 | length length of text in bytes; can be zero |
Bram Moolenaar | 7a8d027 | 2019-05-26 23:32:06 +0200 | [diff] [blame] | 442 | end_lnum line number for the end of the text |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 443 | end_col column just after the text; not used when "length" is |
| 444 | present; when {col} and "end_col" are equal, this is a |
| 445 | zero-width text property |
| 446 | id user defined ID for the property; when omitted zero is |
| 447 | used |
| 448 | type name of the text property type, as added with |
| 449 | |prop_type_add()| |
| 450 | transparent do not show these characters, show the text under it; |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 451 | if there is a border character to the right or below |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 452 | it will be made transparent as well |
Bram Moolenaar | 7a8d027 | 2019-05-26 23:32:06 +0200 | [diff] [blame] | 453 | {not implemented yet} |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 454 | |
| 455 | |
| 456 | POPUP FILTER *popup-filter* |
| 457 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 458 | 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] | 459 | not invoked when the popup is hidden. |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 460 | |
| 461 | The filter can return TRUE to indicate the key has been handled and is to be |
| 462 | 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] | 463 | In case it returns FALSE and there is another popup window visible, that |
| 464 | filter is also called. The filter of the popup window with the highest zindex |
| 465 | is called first. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 466 | |
| 467 | The filter function is called with two arguments: the ID of the popup and the |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 468 | key, e.g.: > |
| 469 | func MyFilter(winid, key) |
| 470 | if a:key == "\<F2>" |
| 471 | " do something |
| 472 | return 1 |
| 473 | endif |
| 474 | if a:key == 'x' |
| 475 | call popup_close(a:winid) |
| 476 | return 1 |
| 477 | endif |
| 478 | return 0 |
Bram Moolenaar | 12ee7ff | 2019-06-10 22:47:40 +0200 | [diff] [blame] | 479 | endfunc |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 480 | |
| 481 | Currently the key is what results after any mapping. This may change... |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 482 | |
| 483 | Some common key actions: |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 484 | x close the popup (see note below) |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 485 | cursor keys select another entry |
| 486 | Tab accept current suggestion |
| 487 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 488 | A mouse click arrives as <LeftMouse>. The coordinates are in |
| 489 | v:mouse_popup_col and v:mouse_popup_row. The top-left screen cell of the |
| 490 | popup is col 1, row 1 (not counting the border). |
| 491 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 492 | Vim provides standard filters |popup_filter_menu()| and |
| 493 | |popup_filter_yesno()|. |
| 494 | |
Bram Moolenaar | bf0eff0 | 2019-06-01 17:13:36 +0200 | [diff] [blame] | 495 | Note that "x" is the normal way to close a popup. You may want to use Esc, |
| 496 | 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] | 497 | 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] | 498 | 'ttimeoutlen' option to 100 and set 'timeout' and/or 'ttimeout'. |
| 499 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 500 | |
| 501 | POPUP CALLBACK *popup-callback* |
| 502 | |
| 503 | A callback that is invoked when the popup closes. Used by |
Bram Moolenaar | 9eaac89 | 2019-06-01 22:49:29 +0200 | [diff] [blame] | 504 | |popup_filter_menu()|. |
| 505 | |
| 506 | The callback is invoked with two arguments: the ID of the popup window and the |
| 507 | result, which could be an index in the popup lines, or whatever was passed as |
| 508 | the second argument of `popup_close()`. |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 509 | |
Bram Moolenaar | 3397f74 | 2019-06-02 18:40:06 +0200 | [diff] [blame] | 510 | If the popup is closed because the cursor moved, the number -1 is passed to |
| 511 | the callback. |
| 512 | |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 513 | ============================================================================== |
| 514 | 3. Examples *popup-examples* |
| 515 | |
| 516 | TODO |
| 517 | |
| 518 | Prompt the user to press y/Y or n/N: > |
| 519 | |
| 520 | func MyDialogHandler(id, result) |
| 521 | if a:result |
| 522 | " ... 'y' or 'Y' was pressed |
| 523 | endif |
| 524 | endfunc |
| 525 | |
Bram Moolenaar | 5c017b2 | 2019-05-21 23:09:01 +0200 | [diff] [blame] | 526 | call popup_create(['Continue? y/n'], { |
Bram Moolenaar | 957f85d | 2019-05-12 21:43:48 +0200 | [diff] [blame] | 527 | \ 'filter': 'popup_filter_yesno', |
| 528 | \ 'callback': 'MyDialogHandler', |
| 529 | \ }) |
| 530 | < |
| 531 | |
| 532 | vim:tw=78:ts=8:noet:ft=help:norl: |