From 71e573d082ee4f0ee3935517d34e0556d81435d7 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sun, 5 Apr 2020 18:14:05 +0900 Subject: [PATCH] [vim] Add 'tmux' layout option to use fzf-tmux e.g. if exists('$TMUX') let g:fzf_layout = { 'tmux': '-p90%,60%' } else let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } endif --- README-VIM.md | 15 ++++++- doc/fzf.txt | 104 +++++++++++++++++++++++++++++++++++++++++++++++-- plugin/fzf.vim | 49 +++++++++-------------- 3 files changed, 133 insertions(+), 35 deletions(-) diff --git a/README-VIM.md b/README-VIM.md index a795d8e2..6c936b11 100644 --- a/README-VIM.md +++ b/README-VIM.md @@ -274,7 +274,8 @@ The following table summarizes the available options. | `options` | string/list | Options to fzf | | `dir` | string | Working directory | | `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`) | +| `tmux` | string | (Layout) fzf-tmux options (e.g. `-p90%,60%`) | +j `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 @@ -397,6 +398,18 @@ The latest versions of Vim and Neovim include builtin terminal emulator let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } ``` +Alternatively, you can make fzf open in a tmux popup window (requires tmux 3.2 +or above) by putting fzf-tmux options in `tmux` key. + +```vim +" See `man fzf-tmux` for available options +if exists('$TMUX') + let g:fzf_layout = { 'tmux': '-p90%,60%' } +else + let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } +endif +``` + #### Hide statusline When fzf starts in a terminal buffer, the file type of the buffer is set to diff --git a/doc/fzf.txt b/doc/fzf.txt index 399969ee..a6deda63 100644 --- a/doc/fzf.txt +++ b/doc/fzf.txt @@ -1,12 +1,14 @@ -fzf.txt fzf Last change: February 14 2020 +fzf.txt fzf Last change: April 4 2020 FZF - TABLE OF CONTENTS *fzf* *fzf-toc* ============================================================================== FZF Vim integration + Installation Summary :FZF[!] Configuration Examples + Explanation of g:fzf_colors fzf#run fzf#wrap Tips @@ -19,6 +21,46 @@ FZF VIM INTEGRATION *fzf-vim-integration* ============================================================================== +INSTALLATION *fzf-installation* +============================================================================== + +Once you have fzf installed, you can enable it inside Vim simply by adding the +directory to 'runtimepath' in your Vim configuration file. The path may differ +depending on the package manager. +> + " If installed using Homebrew + set rtp+=/usr/local/opt/fzf + + " If installed using git + set rtp+=~/.fzf +< +If you use {vim-plug}{1}, the same can be written as: +> + " If installed using Homebrew + Plug '/usr/local/opt/fzf' + + " If installed using git + Plug '~/.fzf' +< +But if you want the latest Vim plugin file from GitHub rather than the one +included in the package, write: +> + Plug 'junegunn/fzf' +< +The Vim plugin will pick up fzf binary available on the system. If fzf is not +found on `$PATH`, it will ask you if it should download the latest binary for +you. + +To make sure that you have the latest version of the binary, set up +post-update hook like so: + + *fzf#install* +> + Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } +< + {1} https://github.com/junegunn/vim-plug + + SUMMARY *fzf-summary* ============================================================================== @@ -38,12 +80,12 @@ the basic file selector command built on top of them. - Basic fuzzy file selector - A reference implementation for those who don't want to write VimScript to implement custom commands - - If you're looking for more such commands, check out {fzf.vim}{1} project. + - If you're looking for more such commands, check out {fzf.vim}{2} project. The most important of all is `fzf#run`, but it would be easier to understand the whole if we start off with `:FZF` command. - {1} https://github.com/junegunn/fzf.vim + {2} https://github.com/junegunn/fzf.vim :FZF[!] @@ -144,6 +186,51 @@ Examples~ let g:fzf_history_dir = '~/.local/share/fzf-history' < +Explanation of g:fzf_colors~ + *fzf-explanation-of-gfzfcolors* + +`g:fzf_colors` is a dictionary mapping fzf elements to a color specification +list: +> + element: [ component, group1 [, group2, ...] ] +< + - `element` is an fzf element to apply a color to: + + ----------------------+------------------------------------------------------ + Element | Description ~ + ----------------------+------------------------------------------------------ + `fg` / `bg` / `hl` | Item (foreground / background / highlight) + `fg+` / `bg+` / `hl+` | Current item (foreground / background / highlight) + `hl` / `hl+` | Highlighted substrings (normal / current) + `gutter` | Background of the gutter on the left + `pointer` | Pointer to the current line ( `>` ) + `marker` | Multi-select marker ( `>` ) + `border` | Border around the window ( `--border` and `--preview` ) + `header` | Header ( `--header` or `--header-lines` ) + `info` | Info line (match counters) + `spinner` | Streaming input indicator + `prompt` | Prompt before query ( `> ` ) + ----------------------+------------------------------------------------------ + - `component` specifies the component (`fg` / `bg`) from which to extract the + color when considering each of the following highlight groups + - `group1 [, group2, ...]` is a list of highlight groups that are searched (in + order) for a matching color definition + +For example, consider the following specification: +> + 'prompt': ['fg', 'Conditional', 'Comment'], +< +This means we color the prompt - using the `fg` attribute of the `Conditional` +if it exists, - otherwise use the `fg` attribute of the `Comment` highlight +group if it exists, - otherwise fall back to the default color settings for +the prompt. + +You can examine the color option generated according the setting by printing +the result of `fzf#wrap()` function like so: +> + :echo fzf#wrap() +< + FZF#RUN ============================================================================== @@ -203,6 +290,7 @@ The following table summarizes the available options. `options` | string/list | Options to fzf `dir` | string | Working directory `up` / `down` / `left` / `right` | number/string | (Layout) Window position and size (e.g. `20` , `50%` ) + `tmux` | string | (Layout) fzf-tmux options (e.g. `-p90%,60%` ) `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}` ) ---------------------------+---------------+---------------------------------------------------------------------- @@ -320,6 +408,16 @@ Starting fzf in a popup window~ " - 'rounded' / 'sharp' / 'horizontal' / 'vertical' / 'top' / 'bottom' / 'left' / 'right' let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } < +Alternatively, you can make fzf open in a tmux popup window (requires tmux 3.2 +or above) by putting fzf-tmux options in `tmux` key. +> + " See `man fzf-tmux` for available options + if exists('$TMUX') + let g:fzf_layout = { 'tmux': '-p90%,60%' } + else + let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } + endif +< Hide statusline~ *fzf-hide-statusline* diff --git a/plugin/fzf.vim b/plugin/fzf.vim index 83734aee..a84dcab7 100644 --- a/plugin/fzf.vim +++ b/plugin/fzf.vim @@ -116,7 +116,7 @@ function! s:fzf_tempname() endfunction let s:default_layout = { 'down': '~40%' } -let s:layout_keys = ['window', 'up', 'down', 'left', 'right'] +let s:layout_keys = ['window', 'tmux', 'up', 'down', 'left', 'right'] let s:fzf_go = s:base_dir.'/bin/fzf' let s:fzf_tmux = s:base_dir.'/bin/fzf-tmux' @@ -191,21 +191,6 @@ function! s:escape(path) return s:is_win ? escape(path, '$') : path endfunction -" Upgrade legacy options -function! s:upgrade(dict) - let copy = copy(a:dict) - if has_key(copy, 'tmux') - let copy.down = remove(copy, 'tmux') - endif - if has_key(copy, 'tmux_height') - let copy.down = remove(copy, 'tmux_height') - endif - if has_key(copy, 'tmux_width') - let copy.right = remove(copy, 'tmux_width') - endif - return copy -endfunction - function! s:error(msg) echohl ErrorMsg echom a:msg @@ -384,7 +369,7 @@ function! fzf#run(...) abort try let [shell, shellslash, shellcmdflag, shellxquote] = s:use_sh() - let dict = exists('a:1') ? s:upgrade(a:1) : {} + let dict = exists('a:1') ? copy(a:1) : {} let temps = { 'result': s:fzf_tempname() } let optstr = s:evaluate_opts(get(dict, 'options', '')) try @@ -416,7 +401,7 @@ try let prefix = '' endif - let prefer_tmux = get(g:, 'fzf_prefer_tmux', 0) + let prefer_tmux = get(g:, 'fzf_prefer_tmux', 0) || has_key(dict, 'tmux') let use_height = has_key(dict, 'down') && !has('gui_running') && \ !(has('nvim') || s:is_win || has('win32unix') || s:present(dict, 'up', 'left', 'right', 'window')) && \ executable('tput') && filereadable('/dev/tty') @@ -424,7 +409,7 @@ try let has_nvim_term = has('nvim-0.2.1') || has('nvim') && !s:is_win let use_term = has_nvim_term || \ has_vim8_term && !has('win32unix') && (has('gui_running') || s:is_win || !use_height && s:present(dict, 'down', 'up', 'left', 'right', 'window')) - let use_tmux = (!use_height && !use_term || prefer_tmux) && !has('win32unix') && s:tmux_enabled() && s:splittable(dict) + let use_tmux = (has_key(dict, 'tmux') || (!use_height && !use_term || prefer_tmux) && !has('win32unix') && s:splittable(dict)) && s:tmux_enabled() if prefer_tmux && use_tmux let use_height = 0 let use_term = 0 @@ -460,19 +445,21 @@ function! s:present(dict, ...) endfunction function! s:fzf_tmux(dict) - let size = '' - for o in ['up', 'down', 'left', 'right'] - if s:present(a:dict, o) - let spec = a:dict[o] - if (o == 'up' || o == 'down') && spec[0] == '~' - let size = '-'.o[0].s:calc_size(&lines, spec, a:dict) - else - " Legacy boolean option - let size = '-'.o[0].(spec == 1 ? '' : substitute(spec, '^\~', '', '')) + let size = get(a:dict, 'tmux', '') + if empty(size) + for o in ['up', 'down', 'left', 'right'] + if s:present(a:dict, o) + let spec = a:dict[o] + if (o == 'up' || o == 'down') && spec[0] == '~' + let size = '-'.o[0].s:calc_size(&lines, spec, a:dict) + else + " Legacy boolean option + let size = '-'.o[0].(spec == 1 ? '' : substitute(spec, '^\~', '', '')) + endif + break endif - break - endif - endfor + endfor + endif return printf('LINES=%d COLUMNS=%d %s %s %s --', \ &lines, &columns, fzf#shellescape(s:fzf_tmux), size, (has_key(a:dict, 'source') ? '' : '-')) endfunction