- VIM Mode 相关
- Search 相关
- Window / Buffer / QuickFix 相关
- Vim + Fzf
- NERDTree Tips
- Fugitive Tips
- External Tools 结合
最近要离职跑路,对本地几百个工程的代码、VIM 是重温和道别的唯一选择,借机又熟悉了些 VIM 的奇技淫巧
VIM Mode 相关
滚动命令(:help scroll-down
)跟光标移动(:help motion
)有差异;可以 :help <keymap>
(如 :help Ctrl-E
)查看帮助
Scroll Down | Scroll Up | Description |
---|---|---|
c - e |
c - y |
1 line downwards / upwards |
c - d |
c - u |
1/2 page downwards / upwards |
c - f |
c - b |
1 page downwards / upwards |
通过 Scroll Down/Up(c-e
, c-d
)来实现大范围翻页,通过 j
/ k
来微调视觉焦点;开启 cursorline 强化光标行的视觉效果
" Keep 2 lines off the edges of the screen when scrolling
set scrolloff=2
set cursorline
hi CursorLine term=bold cterm=bold guibg=Grey40
另一个高频使用的 Motion 键是段落跳转(:help }
),适合文本阅读场景
如果阅读长文本,可以进入 Visual Mode 并 }
/ {
跳转并 zf
折叠文本
Search 相关
使用 VIM 浏览工程代码的主要考虑是速度,牺牲了 IDE 的 Syntax-based search,更多依赖 VIM 原生的 Text-based search
另外适当结合 fzf 插件的 ripgrep 扩展(:Rg
)
set hlsearch " Highlight search term
set ignorecase " Do case insensitive matching
set smartcase " No ignorecase when pattern has uppercase
set incsearch " Highlight match while typing search pattern
nnoremap <CR> :nohlsearch<CR><CR> " click Enter to cancel highlight
Window / Buffer / QuickFix 相关
Summary:
A buffer is the in-memory text of a file.
A window is a viewport on a buffer.
A tab page is a collection of windows.
常用命令:
:ls
列出所有 buffer:bn
,:bp
next / previous 跳转,也可以结合 jumplist 使用c-o
/c-i
前后跳转- 快速关闭除了当前活跃窗口外的所有窗口:
:on
(:only
) 或组合键c-w
+o
- 查看 Fullpath
1<c-g>
QuickFix 窗口常结合 Language Tools(如 Lint、Find References 等场景)
:copen
Open again:ccl
or:cclose
除文本检索,文件的快捷跳转、在轻度浏览场景也是高频使用
Fzf 能实现类似 IDEA 里的 speed-search,比如驼峰命名风格的文件名、仅输入大写字符就能快速定位到该文件(不需要完整字符匹配)
Vim + Fzf
Fzf 插件的 GitHub: https://github.com/junegunn/fzf
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
" FZF
let g:fzf_layout = { 'window': { 'width': 1, 'height': 0.6, 'relative': v:true, 'yoffset': 1.0 } }
let g:fzf_preview_window = ['right:50%:hidden', 'ctrl-p']
function! s:find_git_root()
return system('git rev-parse --show-toplevel 2> /dev/null')[:-2]
endfunction
command! ProjectFiles execute 'Files' s:find_git_root()
nmap <C-p> : ProjectFiles<CR>
" Rg search scope set as ProjectRoot
command! -bang -nargs=* PRg
\ call fzf#vim#grep("rg --column --line-number --no-heading --color=always --smart-case ".shellescape(<q-args>), 1,
\ {'dir': system('git -C '.expand('%:p:h').' rev-parse --show-toplevel 2> /dev/null')[:-2]}, <bang>0)
nmap <Leader>pp :PRg<CR>
说明:
- 使用
c-p
激活 Fzf 的交互式检索窗口,留意这里定制了ProjectFiles
的根路径:如果是 Git 工程则取 Git Root - 对选中的文件,再次
c-p
支持预览文件内容 - 使用
<leader>pp
激活 Fzf 的 Rg 检索窗口;如果希望 Rg 精准匹配、使用'<pattern>
检索
其他 FZF Tips:
:Buffers
使用 Fzf 交互式检索窗口查看 buffers
NERDTree Tips
NerdTree 插件的 GitHub: https://github.com/preservim/nerdtree
Plug 'scrooloose/nerdtree'
u
进入上一层目录C
进入目录节点,并将根节点设定为当前节点o
展开目录节点;O
递归展开所有目录节点X
递归折叠目录的子节点A
放大目录窗口展示CD
如果在 NERDTree 里走丢了,回到文件所在的目录m
Menu 菜单,提供交互式命令模式;作用于当前目录选中的节点?
查看帮助,如插件快捷键
Fugitive Tips
对于浏览及理解大型项目,少不了 VCS 的集成能力
Fugitive 就是一款强大的 Git 插件: https://github.com/tpope/vim-fugitive
Plug 'tpope/vim-fugitive'
Plug 'junegunn/gv.vim'
nmap gbl :Git blame<CR><C-w>w
nmap gcl :Gclog! --graph --pretty=format:'%h - (%ad)%d %s <%an>' --abbrev-commit --date=local -- %<CR>
两个自定义快捷键:
gbl
逐行 Git Blame 功能(类似 IDEA 的 VCS Annotation),当激活 fugitiveblame 窗口后,A
调整宽度到 Git author 列、D
到日期列gcl
弹出 QuickFix 窗口展示当前文件提交历史
其他 Fugitive 和 GV 特性:
- A resize to
- 使用
:GV!
查看提交历史,o
查看 Diff
External Tools 结合
- 查看 Markdown 文件时,打开 MacDown 查看渲染后的富文本效果:
!macdown %
,最常用于查看工程的 README.md - 修改 vimrc 后生效,
:source ~/.vimrc