前言

之前已经介绍过了ctrlp这个工具为什么还需要fzf这个工具。
因为这两者在使用方式上有一些区别。
fzf是可以直接在mac的终端上使用,并且还能够集成到vim当中使用。

官网

https://github.com/junegunn/fzf

FZF的Vim插件:

https://github.com/junegunn/fzf.vim

安装

fzf 这个工具,本身是mac下就可以使用的一个功能,而vim是可以调用外部应用来使用的。
所以需要新安装 fzf,再安装 vim 插件端。

fzf 本机安装

必须先安装,vim才能调用该插件。

1
2
3
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
source ~/.zshrc

验证一下效果:

直接在 iterm2 下输入:fzf,就可以打开

1
fzf

fzf-mac端效果

control-j 和 control-k 上移和下移

带预览

1
fzf --preview 'cat {}'

fzf-mac带预览

使用这个工具完全可以代替find这个工具。

结合vim中使用

插件安装

1
2
3
" fzf#install() 确保你安装了最新的 fzf
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'

命令说明

有很多命令很好用,下面是全部命令列表,然后一个一个介结。

Command List
:Files [PATH] 搜索文件
:GFiles [OPTS] 搜索 Git files (git ls-files)
:GFiles? 查看Git文件状态 (git status)
:Buffers 查看打开的buffer
:Colors 选择样式,这个超好用
:Ag [PATTERN] ag search result (ALT-A to select all, ALT-D to deselect all)
:Rg [PATTERN] rg search result (ALT-A to select all, ALT-D to deselect all)
:Lines [QUERY] Lines in loaded buffers
:BLines [QUERY] Lines in the current buffer
:Tags [QUERY] Tags in the project (ctags -R)
:BTags [QUERY] Tags in the current buffer
:Marks Marks,查看vim的mark,这个有点好用
:Windows Windows
:Locate PATTERN locate command output
:History 查看文件打开历史
:History: 查看命令历史,和上面那个不一样
:History/ 搜索命令历史
:Snippets Snippets (UltiSnips)
:Commits Git commits (requires fugitive.vim)
:BCommits Git commits for the current buffer; visual-select lines to track changes in the range
:Commands Commands
:Maps Normal mode mappings
:Helptags Help tags 1
:Filetypes File types

查询文件 :Files

查询文件,这个就是最普通的文件搜索。

vim-fzf使用

查询git文件 :GFiles

查询被git跟踪的文件,这个我不常用,因为有更别的更好用的工具如lzaygit

GFiles效果

查询命令列表 :Commands

查看所有vim已安装的插件的命令,这个很强!!

Commands效果

查看最近打开历史 :History

查看执行过的历史命令,自行偿试。

1
2
3
:History
:History:
::History/

查看Marks标记

把通过m标记过的位置罗列出来,比如平时用的最多的ma,因为多了也记不住,这个就解决了标记多了记不住的问题。

Marks效果

查询错误提示

1
space a

展示后,可以模糊搜索,也可以直接回车跳到想去的位置,这些都是markdown的表格当中包含了一些检查认为有问题的地方。
检查根据打开的文件类型进行检查,如果打开的是.java.go的文件,也会进行对应的语法检查。

查看错误提示

样式选择 :Colors

这个有点意思,可以选择需要的样式,当然这些校式是我之前就安装过的,但是可以这样直接选择,方便不少。
选3种效果看下:

Colors效果1

Colors效果2

Colors效果3

查看普通模式下按键映射 :Maps

F5-12是我设置的go的快键键,包括运行和debug的键键。

Maps效果

到这里,我们的vim-IDE进化在文本操作这块基本已经差不多了,接下来就是关于编程方面的配置。
fzf还是非常强大的,不论是使用,还是可视化的窗口,用起来还是比较爽。

完整配置

到了一这步的完整配置如下,后续基于这个配置,继续往下进行配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
"=================================
" VIM 自身配置
"=================================
" 编码设置
set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bom,cp936,latin1
set enc=utf8
set fencs=utf8,gbk,gb2312,gb18030

" 启用插件
set nocompatible
filetype on
filetype plugin indent on

" Tab 转空格
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab

" 列高亮
set cursorcolumn

" 记录上次光标位置
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif

" 分屏设置
" 向右分屏并把光标移动向右边
map td :set splitright<CR>:vsplit<CR>
" 向右分屏并把光标移动向左边
map ta :set nosplitright<CR>:vsplit<CR>
" 向下分屏并把光标移动向上边
map ts :set nosplitbelow<CR>:split<CR>
" 向下分屏并把光标移动向下边
map tw :set splitbelow<CR>:split<CR>

" 替换方向键为调节分屏大小
map <M-up> :res -5<CR>
map <M-down> :res +5<CR>
map <M-left> :vertical resize-5<CR>
map <M-right> :vertical resize+5<CR>

" 按键映射
map W :w<CR>
map Q :wq<CR>
map tq :q!<CR>
map te :terminal<CR>

" 设置 buff、空白字符的视觉提示
set list listchars=extends:❯,precedes:❮,tab:▸\
" 这个提示在复制的时候是个问题
" set list listchars=extends:❯,precedes:❮,tab:▸\,trail:˽

" 其他的一些配置
syntax on " 语法高亮
set number " 显示行号
"set relativenumber " 相对行号
set wildmenu " 让vim命令可用Tab补全
set hlsearch " 变输入搜索词边高亮
set incsearch " 光标自动跳转到搜索结果上
set t_ut= "防止vim背景颜色错误

" 复制系统到 vim
vnoremap <C-y> "+y
nnoremap <C-p> "*p

"=================================
" 插件部分--开始
"=================================
" 插件
call plug#begin('~/.vim/plugged')

" NERDTree
Plug 'scrooloose/nerdtree'
Plug 'Xuyuanp/nerdtree-git-plugin'
Plug 'mhinz/vim-startify'

call plug#end()
"=================================
" 插件部分--结束
"=================================

"=================================
" NERDTree
"=================================

" 打开关闭 NERDTree
map tt :NERDTreeToggle<CR>

" 打开vim时自动打开NERDTree
autocmd vimenter * NERDTree

" \ + r 定位当前文件所在目录,这个很有用
" 当前从左树进入,又要将当前目录定位到当前位置用这个
map <leader>r :NERDTreeFind<cr> <C-w><C-w>

"显示书签"
let NERDTreeShowBookmarks=1
" 是否显示隐藏文件
let NERDTreeShowHidden=1

" 忽略一下文件的显示
let NERDTreeIgnore=['\.pyc','\~$','\.swp']

let g:NERDTreeGitStatusIndicatorMapCustom = {
\ "Modified" : "✹",
\ "Staged" : "✚",
\ "Untracked" : "✭",
\ "Renamed" : "➜",
\ "Unmerged" : "═",
\ "Deleted" : "✖",
\ "Dirty" : "✗",
\ "Clean" : "✔︎",
\ 'Ignored' : '☒',
\ "Unknown" : "?"
\ }
" }}}

"=========================================
" Startify 设置
"=========================================
" 修改其中的内容去获得更好的体验。
"设置书签
let g:startify_bookmarks= [
\ '~/workspaces/',
\ '~/.config/nvim/init.vim',
\]
"起始页显示的列表长度
let g:startify_files_number = 10
"自动加载session
let g:startify_session_autoload = 1
"过滤列表,支持正则表达式
let g:startify_skiplist = [
\ '^/tmp',
\ ]
"自定义Header和Footer
let g:startify_custom_header = [
\ '+------------------------------+',
\ '| |',
\ '| Still waters run deep! |',
\ '| |',
\ '+----------------+-------------+',
\]
let g:startify_custom_footer = [
\ '+------------------------------+',
\ '| Keep an open mind! |',
\ '+----------------+-------------+',
\]

" 自己完成的脚本,判断打开文件是否存在。
function! SomeCheck()
if filereadable(expand("%"))
echo "SpecificFile exists"
else
autocmd VimEnter * Startify
endif
endfunction

call SomeCheck()

参考资料

https://github.com/junegunn/fzf
https://github.com/junegunn/fzf/wiki/Examples
https://github.com/junegunn/fzf.vim