1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105 |
- *popup.txt* For Vim version 9.0. Last change: 2022 Oct 07
- VIM REFERENCE MANUAL by Bram Moolenaar
- Displaying text in a floating window. *popup* *popup-window* *popupwin*
- 1. Introduction |popup-intro|
- Window position and size |popup-position|
- Closing the popup window |popup-close|
- Popup buffer and window |popup-buffer|
- Terminal in popup window |popup-terminal|
- 2. Functions |popup-functions|
- Details |popup-function-details|
- 3. Usage |popup-usage|
- popup_create() arguments |popup_create-arguments|
- Popup text properties |popup-props|
- Position popup with textprop |popup-textprop-pos|
- Popup filter |popup-filter|
- Popup callback |popup-callback|
- Popup scrollbar |popup-scrollbar|
- Popup mask |popup-mask|
- 4. Examples |popup-examples|
- {not available if the |+popupwin| feature was disabled at compile time}
- ==============================================================================
- 1. Introduction *popup-intro*
- We are talking about popup windows here, text that goes on top of the regular
- windows and is under control of a plugin. You cannot edit the text in the
- popup window like with regular windows.
- A popup window can be used for such things as:
- - briefly show a message without overwriting the command line
- - prompt the user with a dialog
- - display contextual information while typing
- - give extra information for auto-completion
- The text in the popup window can be colored with |text-properties|. It is
- also possible to use syntax highlighting.
- The default color used is "Pmenu". If you prefer something else use the
- "highlight" argument or the 'wincolor' option, e.g.: >
- hi MyPopupColor ctermbg=lightblue guibg=lightblue
- call setwinvar(winid, '&wincolor', 'MyPopupColor')
- 'hlsearch' highlighting is not displayed in a popup window.
- A popup window has a window-ID like other windows, but behaves differently.
- The size can be up to the whole Vim window and it overlaps other windows.
- Popup windows can also overlap each other. The "zindex" property specifies
- what goes on top of what.
- *E366*
- The popup window contains a buffer, and that buffer is always associated with
- the popup window. The window cannot be in Normal, Visual or Insert mode, it
- does not get keyboard focus. You can use functions like `setbufline()` to
- change the text in the buffer. There are more differences from how this
- window and buffer behave compared to regular windows and buffers, see
- |popup-buffer|.
- If this is not what you are looking for, check out other popup functionality:
- - popup menu, see |popup-menu|
- - balloon, see |balloon-eval|
- WINDOW POSITION AND SIZE *popup-position*
- The height of the window is normally equal to the number of, possibly
- wrapping, lines in the buffer. It can be limited with the "maxheight"
- property. You can use empty lines to increase the height or the "minheight"
- property.
- The width of the window is normally equal to the longest visible line in the
- buffer. It can be limited with the "maxwidth" property. You can use spaces
- to increase the width or use the "minwidth" property.
- By default the 'wrap' option is set, so that no text disappears. Otherwise,
- if there is not enough space then the window is shifted left in order to
- display more text. When right-aligned the window is shifted right to display
- more text. The shifting can be disabled with the "fixed" property.
- Vim tries to show the popup in the location you specify. In some cases, e.g.
- when the popup would go outside of the Vim window, it will show it somewhere
- nearby. E.g. if you use `popup_atcursor()` the popup normally shows just above
- the current cursor position, but if the cursor is close to the top of the Vim
- window it will be placed below the cursor position.
- When the screen scrolls up for output of an Ex command, popups move too, so
- that they will not cover the output.
- The current cursor position is displayed even when it is under a popup window.
- That way you can still see where it is, even though you cannot see the text
- that it is in.
- CLOSING THE POPUP WINDOW *popup-close*
- Normally the plugin that created the popup window is also in charge of closing
- it. If somehow a popup hangs around, you can close all of them with: >
- call popup_clear(1)
- Some popups, such as notifications, close after a specified time. This can be
- set with the "time" property on `popup_create()`.
- Otherwise, a popup can be closed by clicking on the X in the top-right corner
- or by clicking anywhere inside the popup. This must be enabled with the
- "close" property. It is set by default for notifications.
- POPUP BUFFER AND WINDOW *popup-buffer*
- If a popup function is called to create a popup from text, a new buffer is
- created to hold the text and text properties of the popup window. The buffer
- is always associated with the popup window and manipulation is restricted:
- - the buffer has no name
- - 'buftype' is "popup"
- - 'swapfile' is off
- - 'bufhidden' is "hide"
- - 'buflisted' is off
- - 'undolevels' is -1: no undo at all
- - all other buffer-local and window-local options are set to their Vim default
- value.
- It is possible to change the specifically mentioned options, but anything
- might break then, so better leave them alone.
- The window does have a cursor position, but the cursor is not displayed. In
- fact, the cursor in the underlying window is displayed, as if it peeks through
- the popup, so you can see where it is.
- To execute a command in the context of the popup window and buffer use
- `win_execute()`. Example: >
- call win_execute(winid, 'syntax enable')
- Options can be set on the window with `setwinvar()`, e.g.: >
- call setwinvar(winid, '&wrap', 0)
- And options can be set on the buffer with `setbufvar()`, e.g.: >
- call setbufvar(winbufnr(winid), '&filetype', 'java')
- You can also use `win_execute()` with a ":setlocal" command.
- TERMINAL IN POPUP WINDOW *popup-terminal*
- A special case is running a terminal in a popup window. Many rules are then
- different: *E863*
- - The popup window always has focus, it is not possible to switch to another
- window.
- - When the job ends, the popup window shows the buffer in Terminal-Normal
- mode. Use `:q` to close it or use "term_finish" value "close".
- - The popup window can be closed with `popup_close()`, the terminal buffer
- then becomes hidden.
- - It is not possible to open a second popup window with a terminal. *E861*
- - The default Pmenu color is only used for the border and padding. To change
- the color of the terminal itself set the Terminal highlight group before
- creating the terminal. Setting 'wincolor' later can work but requires the
- program in the terminal to redraw everything.
- - The default minimal size is 5 lines of 20 characters; Use the "minwidth" and
- "minheight" parameters to set a different value.
- - The terminal size will grow if the program running in the terminal writes
- text. Set "maxheight" and "maxwidth" to restrict the size.
- To run a terminal in a popup window, first create the terminal hidden. Then
- pass the buffer number to popup_create(). Example: >
- hi link Terminal Search
- let buf = term_start(['picker', 'Something'], #{hidden: 1, term_finish: 'close'})
- let winid = popup_create(buf, #{minwidth: 50, minheight: 20})
- ==============================================================================
- 2. Functions *popup-functions*
- Creating a popup window:
- |popup_create()| centered in the screen
- |popup_atcursor()| just above the cursor position, closes when
- the cursor moves away
- |popup_beval()| at the position indicated by v:beval_
- variables, closes when the mouse moves away
- |popup_notification()| show a notification for three seconds
- |popup_dialog()| centered with padding and border
- |popup_menu()| prompt for selecting an item from a list
- Manipulating a popup window:
- |popup_hide()| hide a popup temporarily
- |popup_show()| show a previously hidden popup
- |popup_move()| change the position and size of a popup
- |popup_setoptions()| override options of a popup
- |popup_settext()| replace the popup buffer contents
- Closing popup windows:
- |popup_close()| close one popup
- |popup_clear()| close all popups
- Filter functions:
- |popup_filter_menu()| select from a list of items
- |popup_filter_yesno()| blocks until 'y' or 'n' is pressed
- Other:
- |popup_getoptions()| get current options for a popup
- |popup_getpos()| get actual position and size of a popup
- |popup_locate()| find popup window at a screen position
- |popup_list()| get list of all popups
- DETAILS *popup-function-details*
- popup_atcursor({what}, {options}) *popup_atcursor()*
- Show the {what} above the cursor, and close it when the cursor
- moves. This works like: >
- call popup_create({what}, #{
- \ pos: 'botleft',
- \ line: 'cursor-1',
- \ col: 'cursor',
- \ moved: 'WORD',
- \ })
- < Use {options} to change the properties.
- If "pos" is passed as "topleft" then the default for "line"
- becomes "cursor+1".
- Can also be used as a |method|: >
- GetText()->popup_atcursor({})
- popup_beval({what}, {options}) *popup_beval()*
- Show the {what} above the position from 'ballooneval' and
- close it when the mouse moves. This works like: >
- let pos = screenpos(v:beval_winnr, v:beval_lnum, v:beval_col)
- call popup_create({what}, #{
- \ pos: 'botleft',
- \ line: pos.row - 1,
- \ col: pos.col,
- \ mousemoved: 'WORD',
- \ })
- < Use {options} to change the properties.
- See |popup_beval_example| for an example.
- Can also be used as a |method|: >
- GetText()->popup_beval({})
- <
- *popup_clear()*
- popup_clear([{force}])
- Emergency solution to a misbehaving plugin: close all popup
- windows for the current tab and global popups.
- Close callbacks are not invoked.
- When {force} is not present this will fail if the current
- window is a popup.
- When {force} is present and |TRUE| the popup is also closed
- when it is the current window. If a terminal is running in a
- popup it is killed.
- popup_close({id} [, {result}]) *popup_close()*
- Close popup {id}. The window and the associated buffer will
- be deleted.
- If the popup has a callback it will be called just before the
- popup window is deleted. If the optional {result} is present
- it will be passed as the second argument of the callback.
- Otherwise zero is passed to the callback.
- Can also be used as a |method|: >
- GetPopup()->popup_close()
- popup_create({what}, {options}) *popup_create()*
- Open a popup window showing {what}, which is either: *E450*
- - a buffer number
- - a string
- - a list of strings
- - a list of text lines with text properties
- When {what} is not a buffer number, a buffer is created with
- 'buftype' set to "popup". That buffer will be wiped out once
- the popup closes.
- if {what} is a buffer number and loading the buffer runs into
- an existing swap file, it is silently opened read-only, as if
- a |SwapExists| autocommand had set |v:swapchoice| to 'o'.
- This is because we assume the buffer is only used for viewing.
- {options} is a dictionary with many possible entries.
- See |popup_create-arguments| for details.
- Returns a window-ID, which can be used with other popup
- functions. Use `winbufnr()` to get the number of the buffer
- in the window: >
- let winid = popup_create('hello', {})
- let bufnr = winbufnr(winid)
- call setbufline(bufnr, 2, 'second line')
- < In case of failure zero is returned.
- Can also be used as a |method|: >
- GetText()->popup_create({})
- popup_dialog({what}, {options}) *popup_dialog()*
- Just like |popup_create()| but with these default options: >
- call popup_create({what}, #{
- \ pos: 'center',
- \ zindex: 200,
- \ drag: 1,
- \ border: [],
- \ padding: [],
- \ mapping: 0,
- \})
- < Use {options} to change the properties. E.g. add a 'filter'
- option with value 'popup_filter_yesno'. Example: >
- call popup_create('do you want to quit (Yes/no)?', #{
- \ filter: 'popup_filter_yesno',
- \ callback: 'QuitCallback',
- \ })
- < By default the dialog can be dragged, so that text below it
- can be read if needed.
- Can also be used as a |method|: >
- GetText()->popup_dialog({})
- popup_filter_menu({id}, {key}) *popup_filter_menu()*
- Filter that can be used for a popup. These keys can be used:
- j <Down> <C-N> select item below
- k <Up> <C-P> select item above
- <Space> <Enter> accept current selection
- x Esc CTRL-C cancel the menu
- Other keys are ignored.
- Always returns |v:true|.
- A match is set on that line to highlight it, see
- |popup_menu()|.
- When the current selection is accepted the "callback" of the
- popup menu is invoked with the index of the selected line as
- the second argument. The first entry has index one.
- Cancelling the menu invokes the callback with -1.
- To add shortcut keys, see the example here:
- |popup_menu-shortcut-example|
- popup_filter_yesno({id}, {key}) *popup_filter_yesno()*
- Filter that can be used for a popup. It handles only the keys
- 'y', 'Y' and 'n' or 'N'. Invokes the "callback" of the
- popup menu with the 1 for 'y' or 'Y' and zero for 'n' or 'N'
- as the second argument. Pressing Esc and 'x' works like
- pressing 'n'. CTRL-C invokes the callback with -1. Other
- keys are ignored.
- See the example here: |popup_dialog-example|
- popup_findecho() *popup_findecho()*
- Get the |window-ID| for the popup that shows messages for the
- `:echowindow` command. Return zero if there is none.
- Mainly useful to hide the popup.
- popup_findinfo() *popup_findinfo()*
- Get the |window-ID| for the popup info window, as it used by
- the popup menu. See |complete-popup|. The info popup is
- hidden when not used, it can be deleted with |popup_clear()|
- and |popup_close()|. Use |popup_show()| to reposition it to
- the item in the popup menu.
- Returns zero if there is none.
- popup_findpreview() *popup_findpreview()*
- Get the |window-ID| for the popup preview window.
- Return zero if there is none.
- popup_getoptions({id}) *popup_getoptions()*
- Return the {options} for popup {id} in a Dict.
- A zero value means the option was not set. For "zindex" the
- default value is returned, not zero.
- The "moved" entry is a list with line number, minimum and
- maximum column, [0, 0, 0] when not set.
- The "mousemoved" entry is a list with screen row, minimum and
- maximum screen column, [0, 0, 0] when not set.
- "firstline" is the property set on the popup, unlike the
- "firstline" obtained with |popup_getpos()| which is the actual
- buffer line at the top of the popup window.
- "border" and "padding" are not included when all values are
- zero. When all values are one then an empty list is included.
- "borderhighlight" is not included when all values are empty.
- "scrollbarhighlight" and "thumbhighlight" are only included
- when set.
- "tabpage" will be -1 for a global popup, zero for a popup on
- the current tabpage and a positive number for a popup on
- another tabpage.
- "textprop", "textpropid" and "textpropwin" are only present
- when "textprop" was set.
- If popup window {id} is not found an empty Dict is returned.
- Can also be used as a |method|: >
- GetPopup()->popup_getoptions()
- popup_getpos({id}) *popup_getpos()*
- Return the position and size of popup {id}. Returns a Dict
- with these entries:
- col screen column of the popup, one-based
- line screen line of the popup, one-based
- width width of the whole popup in screen cells
- height height of the whole popup in screen cells
- core_col screen column of the text box
- core_line screen line of the text box
- core_width width of the text box in screen cells
- core_height height of the text box in screen cells
- firstline line of the buffer at top (1 unless scrolled)
- (not the value of the "firstline" property)
- lastline line of the buffer at the bottom (updated when
- the popup is redrawn)
- scrollbar non-zero if a scrollbar is displayed
- visible one if the popup is displayed, zero if hidden
- Note that these are the actual screen positions. They differ
- from the values in `popup_getoptions()` for the sizing and
- positioning mechanism applied.
- The "core_" values exclude the padding and border.
- If popup window {id} is not found an empty Dict is returned.
- Can also be used as a |method|: >
- GetPopup()->popup_getpos()
- popup_hide({id}) *popup_hide()*
- If {id} is a displayed popup, hide it now. If the popup has a
- filter it will not be invoked for so long as the popup is
- hidden.
- If window {id} does not exist nothing happens. If window {id}
- exists but is not a popup window an error is given. *E993*
- If popup window {id} contains a terminal an error is given.
- Can also be used as a |method|: >
- GetPopup()->popup_hide()
- popup_list() *popup_list()*
- Return a List with the |window-ID| of all existing popups.
- popup_locate({row}, {col}) *popup_locate()*
- Return the |window-ID| of the popup at screen position {row}
- and {col}. If there are multiple popups the one with the
- highest zindex is returned. If there are no popups at this
- position then zero is returned.
- popup_menu({what}, {options}) *popup_menu()*
- Show the {what} near the cursor, handle selecting one of the
- items with cursorkeys, and close it an item is selected with
- Space or Enter. {what} should have multiple lines to make this
- useful. This works like: >
- call popup_create({what}, #{
- \ pos: 'center',
- \ zindex: 200,
- \ drag: 1,
- \ wrap: 0,
- \ border: [],
- \ cursorline: 1,
- \ padding: [0,1,0,1],
- \ filter: 'popup_filter_menu',
- \ mapping: 0,
- \ })
- < The current line is highlighted with a match using
- "PopupSelected", or "PmenuSel" if that is not defined.
- Use {options} to change the properties. Should at least set
- "callback" to a function that handles the selected item.
- Example: >
- func ColorSelected(id, result)
- " use a:result
- endfunc
- call popup_menu(['red', 'green', 'blue'], #{
- \ callback: 'ColorSelected',
- \ })
- < Can also be used as a |method|: >
- GetChoices()->popup_menu({})
- popup_move({id}, {options}) *popup_move()*
- Move popup {id} to the position specified with {options}.
- {options} may contain the items from |popup_create()| that
- specify the popup position:
- line
- col
- pos
- maxheight
- minheight
- maxwidth
- minwidth
- fixed
- For {id} see `popup_hide()`.
- For other options see |popup_setoptions()|.
- Can also be used as a |method|: >
- GetPopup()->popup_move(options)
- popup_notification({what}, {options}) *popup_notification()*
- Show the {what} for 3 seconds at the top of the Vim window.
- This works like: >
- call popup_create({what}, #{
- \ line: 1,
- \ col: 10,
- \ minwidth: 20,
- \ time: 3000,
- \ tabpage: -1,
- \ zindex: 300,
- \ drag: 1,
- \ highlight: 'WarningMsg',
- \ border: [],
- \ close: 'click',
- \ padding: [0,1,0,1],
- \ })
- < The PopupNotification highlight group is used instead of
- WarningMsg if it is defined.
- Without the |+timers| feature the popup will not disappear
- automatically, the user has to click in it.
- The position will be adjusted to avoid overlap with other
- notifications.
- Use {options} to change the properties.
- Can also be used as a |method|: >
- GetText()->popup_notification({})
- popup_setoptions({id}, {options}) *popup_setoptions()*
- Override options in popup {id} with entries in {options}.
- These options can be set:
- border
- borderchars
- borderhighlight
- callback
- close
- cursorline
- drag
- filter
- firstline
- flip
- highlight
- mapping
- mask
- moved
- padding
- resize
- scrollbar
- scrollbarhighlight
- thumbhighlight
- time
- title
- wrap
- zindex
- The options from |popup_move()| can also be used.
- Generally, setting an option to zero or an empty string resets
- it to the default value, but there are exceptions.
- For "hidden" use |popup_hide()| and |popup_show()|.
- "tabpage" cannot be changed.
- Can also be used as a |method|: >
- GetPopup()->popup_setoptions(options)
- popup_settext({id}, {text}) *popup_settext()*
- Set the text of the buffer in popup win {id}. {text} is the
- same as supplied to |popup_create()|, except that a buffer
- number is not allowed.
- Does not change the window size or position, other than caused
- by the different text.
- Can also be used as a |method|: >
- GetPopup()->popup_settext('hello')
- popup_show({id}) *popup_show()*
- If {id} is a hidden popup, show it now.
- For {id} see `popup_hide()`.
- If {id} is the info popup it will be positioned next to the
- current popup menu item.
- ==============================================================================
- 3. Usage *popup-usage*
- POPUP_CREATE() ARGUMENTS *popup_create-arguments*
- The first argument of |popup_create()| (and the second argument to
- |popup_settext()|) specifies the text to be displayed, and optionally text
- properties. It is in one of four forms: *E1284*
- - a buffer number
- - a string
- - a list of strings
- - a list of dictionaries, where each dictionary has these entries:
- text String with the text to display.
- props A list of text properties. Optional.
- Each entry is a dictionary, like the third argument of
- |prop_add()|, but specifying the column in the
- dictionary with a "col" entry, see below:
- |popup-props|.
- If you want to create a new buffer yourself use |bufadd()| and pass the buffer
- number to popup_create().
- The second argument of |popup_create()| is a dictionary with options:
- line Screen line where to position the popup. Can use a
- number or "cursor", "cursor+1" or "cursor-1" to use
- the line of the cursor and add or subtract a number of
- lines. If omitted or zero the popup is vertically
- centered. The first line is 1.
- When using "textprop" the number is relative to the
- text property and can be negative.
- col Screen column where to position the popup. Can use a
- number or "cursor" to use the column of the cursor,
- "cursor+9" or "cursor-9" to add or subtract a number
- of columns. If omitted or zero the popup is
- horizontally centered. The first column is 1.
- When using "textprop" the number is relative to the
- text property and can be negative.
- pos "topleft", "topright", "botleft" or "botright":
- defines what corner of the popup "line" and "col" are
- used for. When not set "topleft" is used.
- Alternatively "center" can be used to position the
- popup in the center of the Vim window, in which case
- "line" and "col" are ignored.
- posinvert When FALSE the value of "pos" is always used. When
- TRUE (the default) and the popup does not fit
- vertically and there is more space on the other side
- then the popup is placed on the other side of the
- position indicated by "line".
- textprop When present the popup is positioned next to a text
- property with this name and will move when the text
- property moves. Use an empty string to remove. See
- |popup-textprop-pos|.
- textpropwin What window to search for the text property. When
- omitted or invalid the current window is used. Used
- when "textprop" is present.
- textpropid Used to identify the text property when "textprop" is
- present. Use zero to reset.
- fixed When FALSE (the default), and:
- - "pos" is "botleft" or "topleft", and
- - "wrap" is off, and
- - the popup would be truncated at the right edge of
- the screen, then
- the popup is moved to the left so as to fit the
- contents on the screen. Set to TRUE to disable this.
- flip When TRUE (the default) and the position is relative
- to the cursor, flip to below or above the cursor to
- avoid overlap with the |popupmenu-completion| or
- another popup with a higher "zindex". When there is
- no space above/below the cursor then show the popup to
- the side of the popup or popup menu.
- {not implemented yet}
- maxheight Maximum height of the contents, excluding border and
- padding.
- minheight Minimum height of the contents, excluding border and
- padding.
- maxwidth Maximum width of the contents, excluding border,
- padding and scrollbar.
- minwidth Minimum width of the contents, excluding border,
- padding and scrollbar.
- firstline First buffer line to display. When larger than one it
- looks like the text scrolled up. When out of range
- the last buffer line will at the top of the window.
- Set to zero to leave the position as set by commands.
- Also see "scrollbar".
- hidden When TRUE the popup exists but is not displayed; use
- `popup_show()` to unhide it.
- tabpage When -1: display the popup on all tab pages.
- When 0 (the default): display the popup on the current
- tab page.
- Otherwise the number of the tab page the popup is
- displayed on; when invalid the popup is not created
- and an error is given. *E997*
- title Text to be displayed above the first item in the
- popup, on top of any border. If there is no top
- border one line of padding is added to put the title
- on. You might want to add one or more spaces at the
- start and end as padding.
- wrap TRUE to make the lines wrap (default TRUE).
- drag TRUE to allow the popup to be dragged with the mouse
- by grabbing at the border. Has no effect if the
- popup does not have a border. As soon as dragging
- starts and "pos" is "center" it is changed to
- "topleft".
- dragall TRUE to allow the popup to be dragged from every
- position. Makes it very difficult to select text in
- the popup.
- resize TRUE to allow the popup to be resized with the mouse
- by grabbing at the bottom right corner. Has no effect
- if the popup does not have a border.
- close When "button" an X is displayed in the top-right, on
- top of any border, padding or text. When clicked on
- the X the popup will close. Any callback is invoked
- with the value -2.
- When "click" any mouse click in the popup will close
- it.
- When "none" (the default) mouse clicks do not close
- the popup window.
- highlight Highlight group name to use for the text, stored in
- the 'wincolor' option.
- padding List with numbers, defining the padding
- above/right/below/left of the popup (similar to CSS).
- An empty list uses a padding of 1 all around. The
- padding goes around the text, inside any border.
- Padding uses the 'wincolor' highlight.
- Example: [1, 2, 1, 3] has 1 line of padding above, 2
- columns on the right, 1 line below and 3 columns on
- the left.
- border List with numbers, defining the border thickness
- above/right/below/left of the popup (similar to CSS).
- Only values of zero and non-zero are currently
- recognized. An empty list uses a border all around.
- borderhighlight List of highlight group names to use for the border.
- When one entry it is used for all borders, otherwise
- the highlight for the top/right/bottom/left border.
- Example: ['TopColor', 'RightColor', 'BottomColor,
- 'LeftColor']
- borderchars List with characters, defining the character to use
- for the top/right/bottom/left border. Optionally
- followed by the character to use for the
- topleft/topright/botright/botleft corner.
- Example: ['-', '|', '-', '|', '┌', '┐', '┘', '└']
- When the list has one character it is used for all.
- When the list has two characters the first is used for
- the border lines, the second for the corners.
- By default a double line is used all around when
- 'encoding' is "utf-8" and 'ambiwidth' is "single",
- otherwise ASCII characters are used.
- scrollbar 1 or true: show a scrollbar when the text doesn't fit.
- zero: do not show a scrollbar. Default is non-zero.
- Also see |popup-scrollbar|.
- scrollbarhighlight Highlight group name for the scrollbar. The
- background color is what matters. When not given then
- PmenuSbar is used.
- thumbhighlight Highlight group name for the scrollbar thumb. The
- background color is what matters. When not given then
- PmenuThumb is used.
- zindex Priority for the popup, default 50. Minimum value is
- 1, maximum value is 32000.
- mask A list of lists with coordinates, defining parts of
- the popup that are transparent. See |popup-mask|.
- time Time in milliseconds after which the popup will close.
- When omitted |popup_close()| must be used.
- moved Specifies to close the popup if the cursor moved:
- - "any": if the cursor moved at all
- - "word": if the cursor moved outside |<cword>|
- - "WORD": if the cursor moved outside |<cWORD>|
- - "expr": if the cursor moved outside |<cexpr>|
- - [{start}, {end}]: if the cursor moved before column
- {start} or after {end}
- - [{lnum}, {start}, {end}]: if the cursor moved away
- from line {lnum}, before column {start} or after
- {end}
- - [0, 0, 0] do not close the popup when the cursor
- moves
- The popup also closes if the cursor moves to another
- line or to another window.
- mousemoved Like "moved" but referring to the mouse pointer
- position
- cursorline TRUE: Highlight the cursor line. Also scrolls the
- text to show this line (only works properly
- when 'wrap' is off).
- zero: Do not highlight the cursor line.
- Default is zero, except for |popup_menu()|.
- filter A callback that can filter typed characters, see
- |popup-filter|.
- mapping Allow for key mapping. When FALSE and the popup is
- visible and has a filter callback key mapping is
- disabled. Default value is TRUE.
- filtermode In which modes the filter is used (same flags as with
- |hasmapto()| plus "a"):
- n Normal mode
- v Visual and Select mode
- x Visual mode
- s Select mode
- o Operator-pending mode
- i Insert mode
- l Language-Argument ("r", "f", "t", etc.)
- c Command-line mode
- a all modes
- The default value is "a".
- callback A callback that is called when the popup closes, e.g.
- when using |popup_filter_menu()|, see |popup-callback|.
- Depending on the "zindex" the popup goes under or above other popups. The
- completion menu (|popup-menu|) has zindex 100. For messages that occur for a
- short time the suggestion is to use zindex 1000.
- By default text wraps, which causes a line in {lines} to occupy more than one
- screen line. When "wrap" is FALSE then the text outside of the popup or
- outside of the Vim window will not be displayed, thus truncated.
- POPUP TEXT PROPERTIES *popup-props*
- These are similar to the third argument of |prop_add()| except:
- - "lnum" is always the current line in the list
- - "bufnr" is always the buffer of the popup
- - "col" is in the Dict instead of a separate argument
- So we get:
- col starting column, counted in bytes, use one for the
- first column.
- length length of text in bytes; can be zero
- end_lnum line number for the end of the text
- end_col column just after the text; not used when "length" is
- present; when {col} and "end_col" are equal, this is a
- zero-width text property
- id user defined ID for the property; when omitted zero is
- used
- type name of the text property type, as added with
- |prop_type_add()|
- POSITION POPUP WITH TEXTPROP *popup-textprop-pos*
- Positioning a popup next to a text property causes the popup to move when text
- is inserted or deleted. The popup functions like a tooltip.
- These steps are needed to make this work:
- - Define a text property type, it defines the name. >
- call prop_type_add('popupMarker', {})
- - Place a text property at the desired text: >
- let lnum = {line of the text}
- let col = {start column of the text}
- let len = {length of the text}
- let propId = {arbitrary but unique number}
- call prop_add(lnum, col, #{
- \ length: len,
- \ type: 'popupMarker',
- \ id: propId,
- \ })
- - Create a popup: >
- let winid = popup_create('the text', #{
- \ pos: 'botleft',
- \ textprop: 'popupMarker',
- \ textpropid: propId,
- \ border: [],
- \ padding: [0,1,0,1],
- \ close: 'click',
- \ })
- By default the popup is positioned at the corner of the text, opposite of the
- "pos" specified for the popup. Thus when the popup uses "botleft", the
- bottom-left corner of the popup is positioned next to the top-right corner of
- the text property:
- +----------+
- | the text |
- +----------+
- just some PROPERTY as an example
- Here the text property is on "PROPERTY". Move the popup to the left by
- passing a negative "col" value to popup_create(). With "col: -5" you get:
- +----------+
- | the text |
- +----------+
- just some PROPERTY as an example
- If the text property moves out of view then the popup will be hidden.
- If the window for which the popup was defined is closed, the popup is closed.
- If the popup cannot fit in the desired position, it may show at a nearby
- position.
- Some hints:
- - To avoid collision with other plugins the text property type name has to be
- unique. You can also use the "bufnr" item to make it local to a buffer.
- - You can leave out the text property ID if there is only ever one text
- property visible.
- - The popup may be in the way of what the user is doing, making it close with
- a click, as in the example above, helps for that.
- - If the text property is removed the popup is closed. Use something like
- this: >
- call prop_remove(#{type: 'popupMarker', id: propId})
- POPUP FILTER *popup-filter*
- A callback that gets any typed keys while a popup is displayed. The filter is
- not invoked when the popup is hidden.
- The filter can return TRUE to indicate the key has been handled and is to be
- discarded, or FALSE to let Vim handle the key as usual in the current state.
- In case it returns FALSE and there is another popup window visible, that
- filter is also called. The filter of the popup window with the highest zindex
- is called first.
- The filter function is called with two arguments: the ID of the popup and the
- key as a string, e.g.: >
- func MyFilter(winid, key)
- if a:key == "\<F2>"
- " do something
- return 1
- endif
- if a:key == 'x'
- call popup_close(a:winid)
- return 1
- endif
- return 0
- endfunc
- < *popup-filter-mode*
- The "filtermode" property can be used to specify in what mode the filter is
- invoked. The default is "a": all modes. When using "nvi" Command-line mode
- is not included, so that any command typed on the command line is not
- filtered. However, to get to Command-line mode the filter must not consume
- ":". Just like it must not consume "v" to allow for entering Visual mode.
- *popup-mapping*
- Normally the key is what results after any mapping, since the keys pass on as
- normal input if the filter does not use it. If the filter consumes all the
- keys, set the "mapping" property to zero so that mappings do not get in the
- way. This is default for |popup_menu()| and |popup_dialog()|.
- Some recommended key actions:
- x close the popup (see note below)
- cursor keys select another entry
- Tab accept current suggestion
- When CTRL-C is pressed the popup is closed, the filter will not be invoked.
- A mouse click arrives as <LeftMouse>. The coordinates can be obtained with
- |getmousepos()|.
- Vim provides standard filters |popup_filter_menu()| and
- |popup_filter_yesno()|.
- Keys coming from a `:normal` command do not pass through the filter. This can
- be used to move the cursor in a popup where the "cursorline" option is set: >
- call win_execute(winid, 'normal! 10Gzz')
- Keys coming from `feedkeys()` are passed through the filter.
- Note that "x" is the normal way to close a popup. You may want to use Esc,
- but since many keys start with an Esc character, there may be a delay before
- Vim recognizes the Esc key. If you do use Esc, it is recommended to set the
- 'ttimeoutlen' option to 100 and set 'timeout' and/or 'ttimeout'.
- *popup-filter-errors*
- If the filter function can't be called, e.g. because the name is wrong, then
- the popup is closed. If the filter causes an error then it is assumed to
- return zero. If this happens three times in a row the popup is closed. If
- the popup gives errors fewer than 10% of the calls then it won't be closed.
- POPUP CALLBACK *popup-callback*
- A callback that is invoked when the popup closes.
- The callback is invoked with two arguments: the ID of the popup window and the
- result, which could be an index in the popup lines, or whatever was passed as
- the second argument of `popup_close()`.
- If the popup is force-closed, e.g. because the cursor moved or CTRL-C was
- pressed, the number -1 is passed to the callback.
- Example: >
- func SelectedColor(id, result)
- echo 'choice made: ' .. a:result
- endfunc
- POPUP SCROLLBAR *popup-scrollbar*
- If the text does not fit in the popup a scrollbar is displayed on the right of
- the window. This can be disabled by setting the "scrollbar" option to zero.
- When the scrollbar is displayed mouse scroll events, while the mouse pointer
- is on the popup, will cause the text to scroll up or down as you would expect.
- A click in the upper half of the scrollbar will scroll the text down one line.
- A click in the lower half will scroll the text up one line. However, this is
- limited so that the popup does not get smaller.
- POPUP MASK *popup-mask*
- To minimize the text that the popup covers, parts of it can be made
- transparent. This is defined by a "mask" which is a list of lists, where each
- list has four numbers:
- col start column, positive for counting from the left, 1 for
- leftmost, negative for counting from the right, -1 for
- rightmost
- endcol last column, like "col"
- line start line, positive for counting from the top, 1 for top,
- negative for counting from the bottom, -1 for bottom
- endline end line, like "line"
- For example, to make the last 10 columns of the last line transparent:
- [[-10, -1, -1, -1]]
- To make the four corners transparent:
- [[1, 1, 1, 1], [-1, -1, 1, 1], [1, 1, -1, -1], [-1, -1, -1, -1]]
- ==============================================================================
- 4. Examples *popup-examples*
- These examples use |Vim9| script.
- *popup_dialog-example*
- Prompt the user to press y/Y or n/N: >
- popup_dialog('Continue? y/n', {
- filter: 'popup_filter_yesno',
- callback: (id, result) => {
- if result == 1
- echomsg "'y' or 'Y' was pressed"
- else
- echomsg "'y' or 'Y' was NOT pressed"
- endif
- },
- padding: [2, 4, 2, 4],
- })
- <
- *popup_menu-shortcut-example*
- Extend popup_filter_menu() with shortcut keys: >
- popup_menu(['Save', 'Cancel', 'Discard'], {
- callback: (_, result) => {
- echo 'dialog result is' result
- },
- filter: (id, key) => {
- # Handle shortcuts
- if key == 'S' || key == 's'
- popup_close(id, 1)
- elseif key == 'C' || key == 'c'
- popup_close(id, 2)
- elseif key == 'D' || key == 'd'
- popup_close(id, 3)
- else
- # No shortcut, pass to generic filter
- return popup_filter_menu(id, key)
- endif
- return true
- },
- })
- <
- *popup_beval_example*
- Example for using a popup window for 'ballooneval': >
- set ballooneval balloonevalterm
- set balloonexpr=BalloonExpr()
- var winid: number
- var last_text: string
- def BalloonExpr(): string
- # here you would use "v:beval_text" to lookup something interesting
- var text = v:beval_text
- if winid > 0 && popup_getpos(winid) != null_dict
- # previous popup window still shows
- if text == last_text
- # still the same text, keep the existing popup
- return null_string
- endif
- popup_close(winid)
- endif
- winid = popup_beval(text, {})
- last_text = text
- return null_string
- enddef
- If the text has to be obtained asynchronously return an empty string from the
- expression function and call popup_beval() once the text is available. In
- this example simulated with a timer callback: >
- set ballooneval balloonevalterm
- set balloonexpr=BalloonExpr()
- var winid: number
- var last_text: string
- def BalloonExpr(): string
- var text = v:beval_text
- if winid > 0 && popup_getpos(winid) != null_dict
- # previous popup window still shows
- if text == last_text
- # still the same text, keep the existing popup
- return null_string
- endif
- popup_close(winid)
- endif
- # Simulate an asynchronous lookup that takes half a second for the
- # text to display.
- last_text = text
- timer_start(500, 'ShowPopup')
- return null_string
- enddef
- def ShowPopup(timerid: number)
- winid = popup_beval('Result: ' .. last_text, {})
- enddef
- <
- vim:tw=78:ts=8:noet:ft=help:norl:
|