2021-12-03 01:43:52 +00:00
# Dressing.nvim
With the release of Neovim 0.6 we were given the start of extensible core UI
hooks ([vim.ui.select](https://github.com/neovim/neovim/pull/15771) and
[vim.ui.input ](https://github.com/neovim/neovim/pull/15959 )). They exist to
allow plugin authors to override them with improvements upon the default
behavior, so that's exactly what we're going to do.
It is a goal to match and not extend the core Neovim API. All options that core
respects will be respected, and we will not accept any custom parameters or
options in the functions. Customization will be done entirely using a separate
[configuration ](#configuration ) method.
2021-12-10 01:38:36 +00:00
- [Requirements ](#requirements )
- [Screenshots ](#screenshots )
- [Installation ](#installation )
- [Configuration ](#configuration )
- [Advanced configuration ](#advanced-configuration )
2021-12-17 19:38:34 +00:00
- [Alternative and related projects ](#alternative-and-related-projects )
2021-12-03 03:55:58 +00:00
2021-12-03 01:43:52 +00:00
## Requirements
Neovim 0.5+
On versions prior to 0.6, this plugin will act as a polyfill for `vim.ui`
2021-12-03 03:52:58 +00:00
## Screenshots
`vim.input` replacement (handling a LSP rename)
2021-12-03 03:57:14 +00:00
2021-12-10 01:38:36 +00:00
![Screenshot from 2021-12-09 17-36-16 ](https://user-images.githubusercontent.com/506791/145502533-3dc2f87d-95ea-422d-a318-12c0092f1bdf.png )
2021-12-03 03:52:58 +00:00
`vim.select` (telescope)
2021-12-03 03:57:14 +00:00
2021-12-03 03:52:58 +00:00
![Screenshot from 2021-12-02 19-46-01 ](https://user-images.githubusercontent.com/506791/144541916-4fa60c50-cadc-4f0f-b3c1-6307310e6e99.png )
`vim.select` (fzf)
2021-12-03 03:57:14 +00:00
2021-12-03 03:52:58 +00:00
![Screenshot from 2021-12-02 19-46-54 ](https://user-images.githubusercontent.com/506791/144541986-6081b4f8-b3b2-418d-9265-b9dabec2c4c4.png )
`vim.select` (nui)
2021-12-03 03:57:14 +00:00
2021-12-03 03:52:58 +00:00
![Screenshot from 2021-12-02 19-47-56 ](https://user-images.githubusercontent.com/506791/144542071-1aa66f81-b07c-492e-9884-fdafed1006df.png )
`vim.select` (built-in)
2021-12-05 01:18:51 +00:00
![Screenshot from 2021-12-04 17-14-32 ](https://user-images.githubusercontent.com/506791/144729527-ede0d7ba-a6e6-41e0-be5a-1a5f16d35b05.png )
2021-12-03 03:52:58 +00:00
2021-12-03 01:43:52 +00:00
## Installation
2021-12-10 01:38:36 +00:00
2021-12-03 01:43:52 +00:00
dressing.nvim supports all the usual plugin managers
< details >
< summary > Packer< / summary >
2021-12-10 01:38:36 +00:00
```lua
require('packer').startup(function()
use {'stevearc/dressing.nvim'}
end)
```
2021-12-03 01:43:52 +00:00
< / details >
< details >
< summary > Paq< / summary >
2021-12-10 01:38:36 +00:00
```lua
require "paq" {
{'stevearc/dressing.nvim'};
}
```
2021-12-03 01:43:52 +00:00
< / details >
< details >
< summary > vim-plug< / summary >
2021-12-10 01:38:36 +00:00
```vim
Plug 'stevearc/dressing.nvim'
```
2021-12-03 01:43:52 +00:00
< / details >
< details >
< summary > dein< / summary >
2021-12-10 01:38:36 +00:00
```vim
call dein#add('stevearc/dressing.nvim')
```
2021-12-03 01:43:52 +00:00
< / details >
< details >
< summary > Pathogen< / summary >
2021-12-10 01:38:36 +00:00
```sh
git clone --depth=1 https://github.com/stevearc/dressing.nvim.git ~/.vim/bundle/
```
2021-12-03 01:43:52 +00:00
< / details >
< details >
< summary > Neovim native package< / summary >
2021-12-10 01:38:36 +00:00
```sh
git clone --depth=1 https://github.com/stevearc/dressing.nvim.git \
"${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/pack/dressing.nvim/start/dressing.nvim
```
2021-12-03 01:43:52 +00:00
< / details >
## Configuration
2021-12-10 01:38:36 +00:00
2021-12-03 01:43:52 +00:00
If you're fine with the defaults, you're good to go after installation. If you
want to tweak, call this function:
```lua
require('dressing').setup({
input = {
2022-01-18 00:03:13 +00:00
-- Set to false to disable the vim.ui.input implementation
enabled = true,
2021-12-03 01:43:52 +00:00
-- Default prompt string
default_prompt = "➤ ",
2021-12-06 03:26:33 +00:00
-- When true, < Esc > will close the modal
insert_only = true,
2021-12-03 01:43:52 +00:00
-- These are passed to nvim_open_win
anchor = "SW",
relative = "cursor",
row = 0,
col = 0,
border = "rounded",
-- These can be integers or a float between 0 and 1 (e.g. 0.4 for 40%)
prefer_width = 40,
max_width = nil,
min_width = 20,
2021-12-10 01:13:00 +00:00
-- Window transparency (0-100)
winblend = 10,
2021-12-19 04:22:46 +00:00
-- Change default highlight groups (see :help winhl)
winhighlight = "",
2021-12-10 01:13:00 +00:00
2021-12-03 01:43:52 +00:00
-- see :help dressing_get_config
get_config = nil,
},
select = {
2022-01-18 00:03:13 +00:00
-- Set to false to disable the vim.ui.select implementation
enabled = true,
2021-12-03 01:43:52 +00:00
-- Priority list of preferred vim.select implementations
2022-01-17 22:24:39 +00:00
backend = { "telescope", "fzf_lua", "fzf", "builtin", "nui" },
2021-12-03 01:43:52 +00:00
-- Options for telescope selector
2021-12-03 12:24:44 +00:00
telescope = {
-- can be 'dropdown', 'cursor', or 'ivy'
2022-03-01 00:37:34 +00:00
-- or you can use a configuration directly:
-- theme = require('telescope.themes').get_ivy({...})
2021-12-03 12:24:44 +00:00
theme = "dropdown",
},
2021-12-03 01:43:52 +00:00
-- Options for fzf selector
fzf = {
2021-12-03 03:30:55 +00:00
window = {
width = 0.5,
height = 0.4,
},
2021-12-03 01:43:52 +00:00
},
2022-01-17 22:24:39 +00:00
-- Options for fzf_lua selector
fzf_lua = {
winopts = {
width = 0.5,
height = 0.4,
},
},
2021-12-03 01:43:52 +00:00
-- Options for nui Menu
nui = {
position = "50%",
size = nil,
relative = "editor",
border = {
style = "rounded",
},
max_width = 80,
max_height = 40,
},
-- Options for built-in selector
builtin = {
-- These are passed to nvim_open_win
anchor = "NW",
relative = "cursor",
row = 0,
col = 0,
border = "rounded",
2021-12-10 01:13:00 +00:00
-- Window transparency (0-100)
2021-12-03 03:53:18 +00:00
winblend = 10,
2021-12-19 04:22:46 +00:00
-- Change default highlight groups (see :help winhl)
winhighlight = "",
2021-12-03 03:53:18 +00:00
2021-12-03 01:43:52 +00:00
-- These can be integers or a float between 0 and 1 (e.g. 0.4 for 40%)
width = nil,
max_width = 0.8,
min_width = 40,
height = nil,
max_height = 0.9,
min_height = 10,
},
2021-12-17 19:21:08 +00:00
-- Used to override format_item. See :help dressing-format
format_item_override = {},
2021-12-03 01:43:52 +00:00
-- see :help dressing_get_config
get_config = nil,
},
})
```
2021-12-03 03:55:58 +00:00
## Advanced configuration
2021-12-18 20:47:51 +00:00
2021-12-03 01:43:52 +00:00
For each of the `input` and `select` configs, there is an option
`get_config` . This can be a function that accepts the `opts` parameter that
is passed in to `vim.select` or `vim.input` . It must return either `nil` (to
no-op) or config values to use in place of the global config values for that
module.
For example, if you want to use a specific configuration for code actions:
2021-12-18 20:47:51 +00:00
2021-12-03 01:43:52 +00:00
```lua
require('dressing').setup({
select = {
get_config = function(opts)
if opts.kind == 'codeaction' then
return {
backend = 'nui',
nui = {
relative = 'cursor',
max_width = 40,
}
}
end
end
}
})
```
2021-12-18 20:47:51 +00:00
2021-12-17 19:38:34 +00:00
## Alternative and related projects
- [telescope-ui-select ](https://github.com/nvim-telescope/telescope-ui-select.nvim ) - provides a `vim.ui.select` implementation for telescope
- [nvim-fzy ](https://github.com/mfussenegger/nvim-fzy ) - fzf alternative that also provides a `vim.ui.select` implementation ([#13](https://github.com/mfussenegger/nvim-fzy/pull/13))
2021-12-18 20:47:51 +00:00
- [guihua.lua ](https://github.com/ray-x/guihua.lua ) - multipurpose GUI library that provides `vim.ui.select` and `vim.ui.input` implementations
2021-12-10 01:38:36 +00:00
- [nvim-notify ](https://github.com/rcarriga/nvim-notify ) - doing pretty much the
same thing but for `vim.notify`
- [nui.nvim ](https://github.com/MunifTanjim/nui.nvim ) - provides common UI
components for plugin authors