fzf 是一個非常高效實用且美觀的命令行工具,并且配置有對應的 vim 插件 fzf.vim, 相信很多人都用過。這里就不在贅述,如果你還沒有用過,很推薦一試。
自從 neovim 的浮動窗口 PR https://github.com/neovim/neovim/pull/6619 被合到 master 以后,很多插件都利用了這個特性實現了很多很酷的功能,比如 coc.nvim,另外 vim-which-key 和 vista.vim 也利用了這一特性 。
浮動窗口的一個很大的特點就是不會像之前 split 的方式擾動你的窗口布局,晃動你的視線,而 fzf 也可以利用這一特性進一步提升體驗!
比如下面這個效果圖,我們可以讓 fzf 在中間進行顯示,有點類似于 IDEA 的搜索窗口:
fzf
fzf
要實現上面的效果,需要配置 3 個地方。首先是 2 個配置項:
" 讓輸入上方,搜索列表在下方
let $FZF_DEFAULT_OPTS = '--layout=reverse'
" 打開 fzf 的方式選擇 floating window
let g:fzf_layout = { 'window': 'call OpenFloatingWin()' }
還有 1 個函數指定如何打開浮動窗口:
function! OpenFloatingWin()
let height = &lines - 3
let width = float2nr(&columns - (&columns * 2 / 10))
let col = float2nr((&columns - width) / 2)
" 設置浮動窗口打開的位置,大小等。
" 這里的大小配置可能不是那么的 flexible 有繼續改進的空間
let opts = {
\ 'relative': 'editor',
\ 'row': height * 0.3,
\ 'col': col + 30,
\ 'width': width * 2 / 3,
\ 'height': height / 2
\ }
let buf = nvim_create_buf(v:false, v:true)
let win = nvim_open_win(buf, v:true, opts)
" 設置浮動窗口高亮
call setwinvar(win, '&winhl', 'Normal:Pmenu')
setlocal
\ buftype=nofile
\ nobuflisted
\ bufhidden=hide
\ nonumber
\ norelativenumber
\ signcolumn=no
endfunction
關于浮動窗口的更多信息,可以 :help api-floatwin
.
另外,如果你的浮動窗口設置高亮無效,看看是否有設置 g:fzf_colors
,這可能會重置浮動窗口的高亮,有浮動窗口的話就不用設置了。
因為還沒有 release, 目前要體驗這個特性的話需要自己從 neovim master 編譯,macOS 用戶直接 安裝 HEAD
版本的 neovim 就行了。安裝好 neovim,然后進行如上配置應該就可以了,對于 https://github.com/liuchengxu/space-vim 用戶直接升級 space-vim 即可。