blob: cc9b7d179e487dfb03a690f3684fa05f9b57e228 [file] [log] [blame]
Bram Moolenaar5c017b22019-05-21 23:09:01 +02001*popup.txt* For Vim version 8.1. Last change: 2019 May 21
Bram Moolenaar957f85d2019-05-12 21:43:48 +02002
3
4 VIM REFERENCE MANUAL by Bram Moolenaar
5
6
Bram Moolenaar5c017b22019-05-21 23:09:01 +02007Displaying text in floating window. *popup* *popup-window*
Bram Moolenaar957f85d2019-05-12 21:43:48 +02008
9THIS IS UNDER DESIGN - ANYTHING MAY STILL CHANGE
10
111. Introduction |popup-intro|
122. Functions |popup-functions|
133. Examples |popup-examples|
14
15
Bram Moolenaar5c017b22019-05-21 23:09:01 +020016{not available if the |+eval| feature was disabled at compile time}
17{not able to use text properties if the |+textprop| feature was disabled at
18compile time}
Bram Moolenaar957f85d2019-05-12 21:43:48 +020019
20==============================================================================
211. Introduction *popup-intro*
22
Bram Moolenaar5c017b22019-05-21 23:09:01 +020023We are talking about popup windows here, text that goes on top of the regular
24windows and is under control of a plugin. You cannot edit the text in the
25popup window like with regular windows.
26
27A popup window can be used for such things as:
28- briefly show a message without changing the command line
29- prompt the user with a dialog
Bram Moolenaar4d784b22019-05-25 19:51:39 +020030- display contextual information while typing
Bram Moolenaar5c017b22019-05-21 23:09:01 +020031- give extra information for auto-completion
32
33The text in the popup window can be colored with |text-properties|. It is
34also possible to use syntax highlighting.
35
Bram Moolenaar4d784b22019-05-25 19:51:39 +020036The default color used is "Pmenu". If you prefer something else use the
37"highlight" argument or the 'wincolor' option, e.g.: >
38 hi MyPopupColor ctermbg=lightblue guibg=lightblue
39 call setwinvar(winid, '&wincolor', 'MyPopupColor')
40
41'hlsearch' and match highlighting are not displayed in a popup window.
42
Bram Moolenaar5c017b22019-05-21 23:09:01 +020043A popup window has a window-ID like other windows, but behaves differently.
44The size can be up to the whole Vim window and it overlaps other windows.
45It contains a buffer, and that buffer is always associated with the popup
46window. The window cannot be used in Normal, Visual or Insert mode, it does
47not get keyboard focus. You can use functions like `setbufline()` to change
48the text in the buffer. There are more differences from how this window and
49buffer behave compared to regular windows and buffers, see |popup-buffer|.
50
51If this is not what you are looking for, check out other popup functionality:
Bram Moolenaar957f85d2019-05-12 21:43:48 +020052- popup menu, see |popup-menu|
53- balloon, see |balloon-eval|
54
Bram Moolenaar5c017b22019-05-21 23:09:01 +020055
Bram Moolenaar4d784b22019-05-25 19:51:39 +020056WINDOW POSITION AND SIZE *popup-position*
57
58The height of the window is normally equal to the number of lines in the
59buffer. It can be limited with the "maxheight" property. You can use empty
60lines to increase the height.
61
62The width of the window is normally equal to the longest line in the buffer.
63It can be limited with the "maxwidth" property. You can use spaces to
64increase the width.
65
66By default the 'wrap' option is set, so that no text disappears. However, if
67there is not enough space, some text may be invisible.
68
69
Bram Moolenaar5c017b22019-05-21 23:09:01 +020070TODO:
71
72Example how to use syntax highlighting of a code snippet.
73
74Scrolling: When the screen scrolls up for output of an Ex command, what
75happens with popups?
761. Stay where they are. Problem: listed text may go behind and can't be read.
772. Scroll with the page. What if they get updated? Either postpone, or take
78 the scroll offset into account.
79Probably 2. is the best choice.
80
Bram Moolenaar5c017b22019-05-21 23:09:01 +020081
82IMPLEMENTATION:
Bram Moolenaar4d784b22019-05-25 19:51:39 +020083- Code is in popupwin.c
84- handle screen resize in screenalloc().
85- Support tab-local popup windows, use tp_first_popupwin and
86 first_tab_popupwin. Swap like with firstwin/curwin.
87- Make redrawing more efficient and avoid flicker.
88- implement all the unimplemented features.
Bram Moolenaar5c017b22019-05-21 23:09:01 +020089
Bram Moolenaar957f85d2019-05-12 21:43:48 +020090
91==============================================================================
922. Functions *popup-functions*
93
94THIS IS UNDER DESIGN - ANYTHING MAY STILL CHANGE
95
96Proposal and discussion on issue #4063: https://github.com/vim/vim/issues/4063
97
Bram Moolenaar5c017b22019-05-21 23:09:01 +020098[functions to be moved to eval.txt later, keep list of functions here]
Bram Moolenaar957f85d2019-05-12 21:43:48 +020099
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200100popup_create({text}, {options}) *popup_create()*
101 Open a popup window showing {text}, which is either:
102 - a string
103 - a list of strings
104 - a list of text lines with text properties
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200105 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200106 {options} is a dictionary with many possible entries.
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200107 See |popup_create-usage| for details.
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200108
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200109 Returns a window-ID, which can be used with other popup
110 functions. Use `winbufnr()` to get the number of the buffer
111 in the window: >
112 let winid = popup_create('hello', {})
113 let bufnr = winbufnr(winid)
114 call setbufline(bufnr, 2, 'second line')
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200115< In case of failure zero is returned.
116
117
118popup_close({id}) *popup_close()*
119 Close popup {id}. The window and the associated buffer will
120 be deleted.
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200121
122
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200123popup_dialog({text}, {options}) *popup_dialog()*
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200124 {not implemented yet}
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200125 Just like |popup_create()| but with these default options: >
126 call popup_create({text}, {
127 \ 'pos': 'center',
128 \ 'zindex': 200,
129 \ 'border': [],
130 \})
131< Use {options} to change the properties.
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200132
133
134popup_notification({text}, {options}) *popup_notification()*
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200135 {not implemented yet}
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200136 Show the {text} for 3 seconds at the top of the Vim window.
137 This works like: >
138 call popup_create({text}, {
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200139 \ 'line': 1,
140 \ 'col': 10,
141 \ 'time': 3000,
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200142 \ 'tab': -1,
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200143 \ 'zindex': 200,
144 \ 'highlight': 'WarningMsg',
Bram Moolenaar51fe3b12019-05-26 20:10:06 +0200145 \ 'border': [],
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200146 \ })
147< Use {options} to change the properties.
148
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200149
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200150popup_atcursor({text}, {options}) *popup_atcursor()*
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200151 {not implemented yet}
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200152 Show the {text} above the cursor, and close it when the cursor
153 moves. This works like: >
154 call popup_create({text}, {
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200155 \ 'line': 'cursor-1',
156 \ 'col': 'cursor',
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200157 \ 'moved': 'WORD',
158 \ })
159< Use {options} to change the properties.
160
161
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200162popup_menu({text}, {options}) *popup_menu()*
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200163 {not implemented yet}
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200164 Show the {text} near the cursor, handle selecting one of the
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200165 items with cursorkeys, and close it an item is selected with
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200166 Space or Enter. {text} should have multiple lines to make this
167 useful. This works like: >
168 call popup_create({text}, {
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200169 \ 'pos': 'center',
170 \ 'zindex': 200,
171 \ 'wrap': 0,
172 \ 'border': [],
173 \ 'filter': 'popup_filter_menu',
174 \ })
175< Use {options} to change the properties. Should at least set
176 "callback" to a function that handles the selected item.
177
178
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200179popup_show({id}) *popup_show()*
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200180 {not implemented yet}
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200181 If {id} is a hidden popup, show it now.
182
183popup_hide({id}) *popup_hide()*
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200184 {not implemented yet}
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200185 If {id} is a displayed popup, hide it now. If the popup has a
186 filter it will not be invoked for so long as the popup is
187 hidden.
188
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200189popup_move({id}, {options}) *popup_move()*
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200190 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200191 Move popup {id} to the position speficied with {options}.
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200192 {options} may contain the items from |popup_create()| that
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200193 specify the popup position: "line", "col", "pos", "maxheight",
194 "minheight", "maxwidth" and "minwidth".
195
196
197popup_filter_menu({id}, {key}) *popup_filter_menu()*
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200198 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200199 Filter that can be used for a popup. It handles the cursor
200 keys to move the selected index in the popup. Space and Enter
201 can be used to select an item. Invokes the "callback" of the
202 popup menu with the index of the selected line as the second
203 argument.
204
205
206popup_filter_yesno({id}, {key}) *popup_filter_yesno()*
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200207 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200208 Filter that can be used for a popup. It handles only the keys
209 'y', 'Y' and 'n' or 'N'. Invokes the "callback" of the
210 popup menu with the 1 for 'y' or 'Y' and zero for 'n' or 'N'
211 as the second argument. Pressing Esc and CTRL-C works like
212 pressing 'n'.
213
214
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200215popup_setoptions({id}, {options}) *popup_setoptions()*
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200216 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200217 Override options in popup {id} with entries in {options}.
218
219
220popup_getoptions({id}) *popup_getoptions()*
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200221 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200222 Return the {options} for popup {id}.
223
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200224popup_getposition({id}) *popup_getposition()*
225 {not implemented yet}
226 Return the position and size of popup {id}. Returns a Dict
227 with these entries:
228 col screen column of the popup, one-based
229 line screen line of the popup, one-based
230 width width of the popup in screen cells
231 height height of the popup in screen cells
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200232
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200233win_execute({id}, {command})
234 {not implemented yet}
235 Like `execute()` but in the context of window {id}.
236 The window will temporarily be made the current window,
237 without triggering autocommands.
238 Example: >
239 call win_execute(winid, 'syntax enable')
240<
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200241
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200242 *:popupclear* *:popupc*
243:popupc[lear] Emergency solution to a misbehaving plugin: close all popup
244 windows.
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200245
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200246
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200247POPUP BUFFER AND WINDOW *popup-buffer*
248
249A new buffer is created to hold the text and text properties of the popup
250window. The buffer is always associated with the popup window and
251manipulation is restricted:
252- the buffer has no name
253- 'buftype' is "popup"
254- 'swapfile' is off
255- 'bufhidden' is "hide"
256- 'buflisted' is off
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200257- 'undolevels' is -1: no undo at all
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200258TODO: more
259
260The window does have a cursor position, but the cursor is not displayed.
261
262Options can be set on the window with `setwinvar()`, e.g.: >
263 call setwinvar(winid, '&wrap', 0)
264And options can be set on the buffer with `setbufvar()`, e.g.: >
265 call setbufvar(winbufnr(winid), '&filetype', 'java')
266
267
268POPUP_CREATE() ARGUMENTS *popup_create-usage*
269
270The first argument of |popup_create()| specifies the text to be displayed, and
271optionally text properties. It is in one of three forms:
272- a string
273- a list of strings
274- a list of dictionaries, where each dictionary has these entries:
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200275 {not implemented yet}
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200276 text String with the text to display.
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200277 props A list of text properties. Optional.
278 Each entry is a dictionary, like the third argument of
279 |prop_add()|, but specifying the column in the
280 dictionary with a "col" entry, see below:
281 |popup-props|.
282
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200283The second argument of |popup_create()| is a dictionary with options:
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200284 line screen line where to position the popup; can use
285 "cursor", "cursor+1" or "cursor-1" to use the line of
286 the cursor and add or subtract a number of lines;
287 default is "cursor-1".
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200288 {only number is implemented}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200289 col screen column where to position the popup; can use
290 "cursor" to use the column of the cursor, "cursor+99"
291 and "cursor-99" to add or subtract a number of
292 columns; default is "cursor"
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200293 {only number is implemented}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200294 pos "topleft", "topright", "botleft" or "botright":
295 defines what corner of the popup "line" and "col" are
296 used for. Default is "botleft". Alternatively
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200297 "center" can be used to position the popup in the
298 center of the Vim window.
299 {not implemented yet}
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200300 flip when TRUE (the default) and the position is relative
301 to the cursor, flip to below or above the cursor to
302 avoid overlap with the |popupmenu-completion| or
303 another popup with a higher "zindex"
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200304 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200305 maxheight maximum height
306 minheight minimum height
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200307 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200308 maxwidth maximum width
309 minwidth minimum width
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200310 {not implemented yet}
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200311 hidden when TRUE the popup exists but is not displayed; use
312 `popup_show()` to unhide it.
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200313 {not implemented yet}
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200314 tab when -1: display the popup on all tabs; when 0 (the
315 default): display the popup on the current tab;
316 otherwise the number of the tab page the popup is
317 displayed on; when invalid the current tab is used
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200318 {only -1 and 0 are implemented}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200319 title text to be displayed above the first item in the
320 popup, on top of any border
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200321 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200322 wrap TRUE to make the lines wrap (default TRUE)
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200323 {not implemented yet}
324 highlight highlight group name to use for the text, stored in
Bram Moolenaar20c023a2019-05-26 21:03:24 +0200325 the 'wincolor' option
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200326 border list with numbers, defining the border thickness
327 above/right/below/left of the popup; an empty list
328 uses a border of 1 all around
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200329 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200330 borderhighlight highlight group name to use for the border
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200331 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200332 borderchars list with characters, defining the character to use
333 for the top/right/bottom/left border; optionally
334 followed by the character to use for the
335 topright/botright/botleft/topleft corner; an empty
336 list can be used to show a double line all around
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200337 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200338 zindex priority for the popup, default 50
339 time time in milliseconds after which the popup will close;
340 when omitted |popup_close()| must be used.
341 moved "cell": close the popup if the cursor moved at least
342 one screen cell; "word" allows for moving within
343 |<cword>|, "WORD" allows for moving within |<cWORD>|,
344 a list with two numbers specifies the start and end
345 column
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200346 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200347 filter a callback that can filter typed characters, see
348 |popup-filter|
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200349 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200350 callback a callback to be used when the popup closes, e.g. when
351 using |popup_filter_menu()|, see |popup-callback|.
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200352 {not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200353
354Depending on the "zindex" the popup goes under or above other popups. The
355completion menu (|popup-menu|) has zindex 100. For messages that occur for a
356short time the suggestion is to use zindex 1000.
357
358By default text wraps, which causes a line in {lines} to occupy more than one
359screen line. When "wrap" is FALSE then the text outside of the popup or
360outside of the Vim window will not be displayed, thus truncated.
361
362
363POPUP TEXT PROPERTIES *popup-props*
364
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200365{not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200366These are similar to the third argument of |prop_add()|, but not exactly the
367same, since they only apply to one line.
368 col starting column, counted in bytes, use one for the
369 first column.
370 length length of text in bytes; can be zero
371 end_col column just after the text; not used when "length" is
372 present; when {col} and "end_col" are equal, this is a
373 zero-width text property
374 id user defined ID for the property; when omitted zero is
375 used
376 type name of the text property type, as added with
377 |prop_type_add()|
378 transparent do not show these characters, show the text under it;
379 if there is an border character to the right or below
380 it will be made transparent as well
381
382
383POPUP FILTER *popup-filter*
384
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200385{not implemented yet}
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200386A callback that gets any typed keys while a popup is displayed. The filter is
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200387not invoked when the popup is hidden.
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200388
389The filter can return TRUE to indicate the key has been handled and is to be
390discarded, or FALSE to let Vim handle the key as usual in the current state.
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200391In case it returns FALSE and there is another popup window visible, that
392filter is also called. The filter of the popup window with the highest zindex
393is called first.
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200394
395The filter function is called with two arguments: the ID of the popup and the
396key.
397
398Some common key actions:
399 Esc close the popup
400 cursor keys select another entry
401 Tab accept current suggestion
402
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200403A mouse click arrives as <LeftMouse>. The coordinates are in
404v:mouse_popup_col and v:mouse_popup_row. The top-left screen cell of the
405popup is col 1, row 1 (not counting the border).
406
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200407Vim provides standard filters |popup_filter_menu()| and
408|popup_filter_yesno()|.
409
410
411POPUP CALLBACK *popup-callback*
412
Bram Moolenaar4d784b22019-05-25 19:51:39 +0200413{not implemented yet}
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200414A callback that is invoked when the popup closes. Used by
415|popup_filter_menu()|. Invoked with two arguments: the ID of the popup and
416the result, which would usually be an index in the popup lines, or whatever
417the filter wants to pass.
418
419==============================================================================
4203. Examples *popup-examples*
421
422TODO
423
424Prompt the user to press y/Y or n/N: >
425
426 func MyDialogHandler(id, result)
427 if a:result
428 " ... 'y' or 'Y' was pressed
429 endif
430 endfunc
431
Bram Moolenaar5c017b22019-05-21 23:09:01 +0200432 call popup_create(['Continue? y/n'], {
Bram Moolenaar957f85d2019-05-12 21:43:48 +0200433 \ 'filter': 'popup_filter_yesno',
434 \ 'callback': 'MyDialogHandler',
435 \ })
436<
437
438 vim:tw=78:ts=8:noet:ft=help:norl: