*popup.txt*  For Vim version 9.1.  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:
