mirror of
https://github.com/Llewellynvdm/fzf.git
synced 2024-12-23 03:19:01 +00:00
[vim] Popup window support for both Vim and Neovim
e.g. let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } Based on the code from https://github.com/junegunn/fzf.vim/issues/821#issuecomment-581273191 by @lacygoill.
This commit is contained in:
parent
293dd76af1
commit
7ceb58b2aa
@ -184,6 +184,7 @@ The following table summarizes the available options.
|
|||||||
| `dir` | string | Working directory |
|
| `dir` | string | Working directory |
|
||||||
| `up`/`down`/`left`/`right` | number/string | (Layout) Window position and size (e.g. `20`, `50%`) |
|
| `up`/`down`/`left`/`right` | number/string | (Layout) Window position and size (e.g. `20`, `50%`) |
|
||||||
| `window` (Vim 8 / Neovim) | string | (Layout) Command to open fzf window (e.g. `vertical aboveleft 30new`) |
|
| `window` (Vim 8 / Neovim) | string | (Layout) Command to open fzf window (e.g. `vertical aboveleft 30new`) |
|
||||||
|
| `window` (Vim 8 / Neovim) | dict | (Layout) Popup window settings (e.g. `{'width': 0.9, 'height': 0.6}`) |
|
||||||
|
|
||||||
`options` entry can be either a string or a list. For simple cases, string
|
`options` entry can be either a string or a list. For simple cases, string
|
||||||
should suffice, but prefer to use list type to avoid escaping issues.
|
should suffice, but prefer to use list type to avoid escaping issues.
|
||||||
@ -193,6 +194,16 @@ call fzf#run({'options': '--reverse --prompt "C:\\Program Files\\"'})
|
|||||||
call fzf#run({'options': ['--reverse', '--prompt', 'C:\Program Files\']})
|
call fzf#run({'options': ['--reverse', '--prompt', 'C:\Program Files\']})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
When `window` entry is a dictionary, fzf will start in a popup window. The
|
||||||
|
following options are allowed:
|
||||||
|
|
||||||
|
- Required:
|
||||||
|
- `width` [float]
|
||||||
|
- `height` [float]
|
||||||
|
- Optional:
|
||||||
|
- `highlight` [string default `'Comment'`]: Highlight group for border
|
||||||
|
- `rounded` [boolean default `v:true`]: Use rounded border
|
||||||
|
|
||||||
`fzf#wrap`
|
`fzf#wrap`
|
||||||
----------
|
----------
|
||||||
|
|
||||||
@ -276,44 +287,17 @@ The latest versions of Vim and Neovim include builtin terminal emulator
|
|||||||
- On Terminal Vim with a non-default layout
|
- On Terminal Vim with a non-default layout
|
||||||
- `call fzf#run({'left': '30%'})` or `let g:fzf_layout = {'left': '30%'}`
|
- `call fzf#run({'left': '30%'})` or `let g:fzf_layout = {'left': '30%'}`
|
||||||
|
|
||||||
#### Starting fzf in Neovim floating window
|
#### Starting fzf in a popup window
|
||||||
|
|
||||||
```vim
|
```vim
|
||||||
" Using floating windows of Neovim to start fzf
|
" Required:
|
||||||
if has('nvim')
|
" - width [float]
|
||||||
function! FloatingFZF(width, height, border_highlight)
|
" - height [float]
|
||||||
function! s:create_float(hl, opts)
|
"
|
||||||
let buf = nvim_create_buf(v:false, v:true)
|
" Optional:
|
||||||
let opts = extend({'relative': 'editor', 'style': 'minimal'}, a:opts)
|
" - highlight [string default 'Comment']: Highlight group for border
|
||||||
let win = nvim_open_win(buf, v:true, opts)
|
" - rounded [boolean default v:true]: Use rounded border
|
||||||
call setwinvar(win, '&winhighlight', 'NormalFloat:'.a:hl)
|
let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } }
|
||||||
call setwinvar(win, '&colorcolumn', '')
|
|
||||||
return buf
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Size and position
|
|
||||||
let width = float2nr(&columns * a:width)
|
|
||||||
let height = float2nr(&lines * a:height)
|
|
||||||
let row = float2nr((&lines - height) / 2)
|
|
||||||
let col = float2nr((&columns - width) / 2)
|
|
||||||
|
|
||||||
" Border
|
|
||||||
let top = '╭' . repeat('─', width - 2) . '╮'
|
|
||||||
let mid = '│' . repeat(' ', width - 2) . '│'
|
|
||||||
let bot = '╰' . repeat('─', width - 2) . '╯'
|
|
||||||
let border = [top] + repeat([mid], height - 2) + [bot]
|
|
||||||
|
|
||||||
" Draw frame
|
|
||||||
let s:frame = s:create_float(a:border_highlight, {'row': row, 'col': col, 'width': width, 'height': height})
|
|
||||||
call nvim_buf_set_lines(s:frame, 0, -1, v:true, border)
|
|
||||||
|
|
||||||
" Draw viewport
|
|
||||||
call s:create_float('Normal', {'row': row + 1, 'col': col + 2, 'width': width - 4, 'height': height - 2})
|
|
||||||
autocmd BufWipeout <buffer> execute 'bwipeout' s:frame
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let g:fzf_layout = { 'window': 'call FloatingFZF(0.9, 0.6, "Comment")' }
|
|
||||||
endif
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Hide statusline
|
#### Hide statusline
|
||||||
|
47
doc/fzf.txt
47
doc/fzf.txt
@ -1,4 +1,4 @@
|
|||||||
fzf.txt fzf Last change: November 23 2019
|
fzf.txt fzf Last change: February 3 2020
|
||||||
FZF - TABLE OF CONTENTS *fzf* *fzf-toc*
|
FZF - TABLE OF CONTENTS *fzf* *fzf-toc*
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
@ -11,7 +11,7 @@ FZF - TABLE OF CONTENTS *fzf* *fzf-to
|
|||||||
fzf#wrap
|
fzf#wrap
|
||||||
Tips
|
Tips
|
||||||
fzf inside terminal buffer
|
fzf inside terminal buffer
|
||||||
Starting fzf in Neovim floating window
|
Starting fzf in a popup window
|
||||||
Hide statusline
|
Hide statusline
|
||||||
License
|
License
|
||||||
|
|
||||||
@ -204,6 +204,7 @@ The following table summarizes the available options.
|
|||||||
`dir` | string | Working directory
|
`dir` | string | Working directory
|
||||||
`up` / `down` / `left` / `right` | number/string | (Layout) Window position and size (e.g. `20` , `50%` )
|
`up` / `down` / `left` / `right` | number/string | (Layout) Window position and size (e.g. `20` , `50%` )
|
||||||
`window` (Vim 8 / Neovim) | string | (Layout) Command to open fzf window (e.g. `vertical aboveleft 30new` )
|
`window` (Vim 8 / Neovim) | string | (Layout) Command to open fzf window (e.g. `vertical aboveleft 30new` )
|
||||||
|
`window` (Vim 8 / Neovim) | dict | (Layout) Popup window settings (e.g. `{'width': 0.9, 'height': 0.6}` )
|
||||||
---------------------------+---------------+----------------------------------------------------------------------
|
---------------------------+---------------+----------------------------------------------------------------------
|
||||||
|
|
||||||
`options` entry can be either a string or a list. For simple cases, string
|
`options` entry can be either a string or a list. For simple cases, string
|
||||||
@ -212,6 +213,16 @@ should suffice, but prefer to use list type to avoid escaping issues.
|
|||||||
call fzf#run({'options': '--reverse --prompt "C:\\Program Files\\"'})
|
call fzf#run({'options': '--reverse --prompt "C:\\Program Files\\"'})
|
||||||
call fzf#run({'options': ['--reverse', '--prompt', 'C:\Program Files\']})
|
call fzf#run({'options': ['--reverse', '--prompt', 'C:\Program Files\']})
|
||||||
<
|
<
|
||||||
|
When `window` entry is a dictionary, fzf will start in a popup window. The
|
||||||
|
following options are allowed:
|
||||||
|
|
||||||
|
- Required:
|
||||||
|
- `width` [float]
|
||||||
|
- `height` [float]
|
||||||
|
- Optional:
|
||||||
|
- `highlight` [string default `'Comment'`]: Highlight group for border
|
||||||
|
- `rounded` [boolean default `v:true`]: Use rounded border
|
||||||
|
|
||||||
|
|
||||||
FZF#WRAP
|
FZF#WRAP
|
||||||
==============================================================================
|
==============================================================================
|
||||||
@ -291,29 +302,17 @@ The latest versions of Vim and Neovim include builtin terminal emulator
|
|||||||
- `call fzf#run({'left': '30%'})` or `let g:fzf_layout = {'left': '30%'}`
|
- `call fzf#run({'left': '30%'})` or `let g:fzf_layout = {'left': '30%'}`
|
||||||
|
|
||||||
|
|
||||||
Starting fzf in Neovim floating window~
|
Starting fzf in a popup window~
|
||||||
*fzf-starting-fzf-in-neovim-floating-window*
|
*fzf-starting-fzf-in-a-popup-window*
|
||||||
>
|
>
|
||||||
" Using floating windows of Neovim to start fzf
|
" Required:
|
||||||
if has('nvim')
|
" - width [float]
|
||||||
let $FZF_DEFAULT_OPTS .= ' --border --margin=0,2'
|
" - height [float]
|
||||||
|
"
|
||||||
function! FloatingFZF()
|
" Optional:
|
||||||
let width = float2nr(&columns * 0.9)
|
" - highlight [string default 'Comment']: Highlight group for border
|
||||||
let height = float2nr(&lines * 0.6)
|
" - rounded [boolean default v:true]: Use rounded border
|
||||||
let opts = { 'relative': 'editor',
|
let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } }
|
||||||
\ 'row': (&lines - height) / 2,
|
|
||||||
\ 'col': (&columns - width) / 2,
|
|
||||||
\ 'width': width,
|
|
||||||
\ 'height': height }
|
|
||||||
|
|
||||||
let win = nvim_open_win(nvim_create_buf(v:false, v:true), v:true, opts)
|
|
||||||
call setwinvar(win, '&winhighlight', 'NormalFloat:Normal')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let g:fzf_layout = { 'window': 'call FloatingFZF()' }
|
|
||||||
endif
|
|
||||||
|
|
||||||
<
|
<
|
||||||
|
|
||||||
Hide statusline~
|
Hide statusline~
|
||||||
|
@ -650,7 +650,11 @@ function! s:split(dict)
|
|||||||
let ppos = s:getpos()
|
let ppos = s:getpos()
|
||||||
try
|
try
|
||||||
if s:present(a:dict, 'window')
|
if s:present(a:dict, 'window')
|
||||||
execute 'keepalt' a:dict.window
|
if type(a:dict.window) == type({})
|
||||||
|
call s:popup(a:dict.window)
|
||||||
|
else
|
||||||
|
execute 'keepalt' a:dict.window
|
||||||
|
endif
|
||||||
elseif !s:splittable(a:dict)
|
elseif !s:splittable(a:dict)
|
||||||
execute (tabpagenr()-1).'tabnew'
|
execute (tabpagenr()-1).'tabnew'
|
||||||
else
|
else
|
||||||
@ -798,6 +802,69 @@ function! s:callback(dict, lines) abort
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
if has('nvim')
|
||||||
|
function s:create_popup(hl, opts) abort
|
||||||
|
let buf = nvim_create_buf(v:false, v:true)
|
||||||
|
let opts = extend({'relative': 'editor', 'style': 'minimal'}, a:opts)
|
||||||
|
let border = has_key(opts, 'border') ? remove(opts, 'border') : []
|
||||||
|
let win = nvim_open_win(buf, v:true, opts)
|
||||||
|
call setwinvar(win, '&winhighlight', 'NormalFloat:'..a:hl)
|
||||||
|
call setwinvar(win, '&colorcolumn', '')
|
||||||
|
if !empty(border)
|
||||||
|
call nvim_buf_set_lines(buf, 0, -1, v:true, border)
|
||||||
|
endif
|
||||||
|
return buf
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:create_popup(hl, opts) abort
|
||||||
|
let is_frame = has_key(a:opts, 'border')
|
||||||
|
let buf = is_frame ? '' : term_start(&shell, #{hidden: 1})
|
||||||
|
let id = popup_create(buf, #{
|
||||||
|
\ line: a:opts.row,
|
||||||
|
\ col: a:opts.col,
|
||||||
|
\ minwidth: a:opts.width,
|
||||||
|
\ minheight: a:opts.height,
|
||||||
|
\ zindex: 50 - is_frame,
|
||||||
|
\ })
|
||||||
|
|
||||||
|
if is_frame
|
||||||
|
call setwinvar(id, '&wincolor', a:hl)
|
||||||
|
call setbufline(winbufnr(id), 1, a:opts.border)
|
||||||
|
execute 'autocmd BufWipeout * ++once call popup_close('..id..')'
|
||||||
|
else
|
||||||
|
execute 'autocmd BufWipeout * ++once bwipeout! '..buf
|
||||||
|
endif
|
||||||
|
return winbufnr(id)
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:popup(opts) abort
|
||||||
|
" Size and position
|
||||||
|
let width = float2nr(&columns * a:opts.width)
|
||||||
|
let height = float2nr(&lines * a:opts.height)
|
||||||
|
let row = float2nr((&lines - height) / 2)
|
||||||
|
let col = float2nr((&columns - width) / 2)
|
||||||
|
|
||||||
|
" Border
|
||||||
|
let edges = get(a:opts, 'rounded', 1) ? ['╭', '╮', '╰', '╯'] : ['┌', '┐', '└', '┘']
|
||||||
|
let bar = repeat('─', width - 2)
|
||||||
|
let top = edges[0] .. bar .. edges[1]
|
||||||
|
let mid = '│' .. repeat(' ', width - 2) .. '│'
|
||||||
|
let bot = edges[2] .. bar .. edges[3]
|
||||||
|
let border = [top] + repeat([mid], height - 2) + [bot]
|
||||||
|
|
||||||
|
let highlight = get(a:opts, 'highlight', 'Comment')
|
||||||
|
let frame = s:create_popup(highlight, {
|
||||||
|
\ 'row': row, 'col': col, 'width': width, 'height': height, 'border': border
|
||||||
|
\ })
|
||||||
|
call s:create_popup('Normal', {
|
||||||
|
\ 'row': row + 1, 'col': col + 2, 'width': width - 4, 'height': height - 2
|
||||||
|
\ })
|
||||||
|
if has('nvim')
|
||||||
|
execute 'autocmd BufWipeout <buffer> bwipeout '..frame
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
let s:default_action = {
|
let s:default_action = {
|
||||||
\ 'ctrl-t': 'tab split',
|
\ 'ctrl-t': 'tab split',
|
||||||
\ 'ctrl-x': 'split',
|
\ 'ctrl-x': 'split',
|
||||||
|
Loading…
Reference in New Issue
Block a user