最近要离职跑路,对本地几百个工程的代码、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