如何使用原生 Vim 实现 90% 的插件功能

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

e6fb30ba92b49585302824aa9ba577a1.png

导语:在日常工作中,我们或多或少要跟vim编辑器打交道。在大家的潜意识里,vim需要配置额外插件才能实现比较完整的代码编辑功能。实际上,只要通过合理利用vim的原生能力,就可以实现90%的编辑需求。本文旨在提供一些vim高效实用的技巧,同时加深我们对vim原生设计的理解。

下面,我们直接开始 本文将介绍以下几种常用能力

  • 快速文件检索

  • 符号跳转

  • 代码自动补全

  • 文件树浏览

  • 自定义代码段

  • 编译一体化

保命声明:
1. 没有反对使用插件的想法,很多第三方插件也非常实用
2. vim是宇宙第二编辑器,第一是大家正在使用的(手动狗头)

前置的基础配置

" 关闭vi兼容模式
set nocompatible
" 启用语法高亮
syntax enable
" 启用文件类型检测插件
filetype plugin on

 1. 快速文件搜索(支持模糊查询)

  • 代表插件

plugingithub
ctrlphttps://github.com/kien/ctrlp.vim
fzfhttps://github.com/junegunn/fzf.vim
leaderfhttps://github.com/Yggdroot/LeaderF
telescopehttps://github.com/nvim-telescope/telescope.nvim
  • 原生配置

" 递归查找子文件
set path+=**
" 展示match的文件列表
set wildmenu
  • 开始施法

1、使用:find查找部分匹配文件

8859dd815d9d473e22f300ef86138423.gif

2、使用*实现模糊查询

e01edd200d9a05cc3f391660f6c26760.gif

3、使用:b搜索已打开的buffer文件

f4908234274272a802984cdd74f224a7.gif

2. 符号跳转

  • 代表工具/插件

  1. 基于字符匹配查找

ToolsLink
grephttps://www.gnu.org/software/grep/
ackhttps://beyondgrep.com/
aghttps://github.com/ggreer/the_silver_searcher
rghttps://github.com/BurntSushi/ripgrep

功能对比:https://beyondgrep.com/feature-comparison/

性能对比:https://blog.burntsushi.net/ripgrep/

  1. 基于静态符号索引

ToolsLink
ctagshttps://ctags.sourceforge.net/
gtagshttps://www.gnu.org/software/global/
  1. 基于lsp(language server protocol)跳转

PluginsLink
vim-lsphttps://github.com/prabirshrestha/vim-lsp
LanguageClient-neovimhttps://github.com/autozimu/LanguageClient-neovim
coc-nvimhttps://github.com/neoclide/coc.nvim
nvim native lsphttps://neovim.io/doc/user/lsp.html
  • 原生操作

ctags是unix操作系统自带,且vim原生支持,故采用ctags静态符号索引

// 在项目根目录生成tags文件
ctags -R .
  • 开始施法

keymapoperation
ctrl + [跳转定义
ctrl + t返回
g + ctrl + [查询多个模糊定义

469ac3892bdc24e7bc67f0583a579dc9.gif

ec13b19c23c37c6720d3fdf8c169e710.gif

  • 一些补充

1、ctags只需要在项目根目录下生成tag文件,通过以下配置,可以在任意子目录下打打开

" 递归向上层寻找tags文件
set tags=tags;/

2、对于项目代码改动,可以使用 Guntentags 插件自动生成/更新并管理tags文件

3. 自动补全

  • 常用插件

HeaderHeader
YouCompleteMehttps://github.com/ycm-core/YouCompleteMe
coc-nvimhttps://github.com/neoclide/coc.nvim
nvim-cmphttps://github.com/hrsh7th/nvim-cmp
  • 原生支持,不需要额外配置

  • 开始演示

1、使用 ctrl-x + ctrl-n,进行buffer补全

38d796b321846ef6e5d6014c132eda44.gif

2、根据文件路径补全

eb0a62ef9b5cb51b4cc0a1b74be13364.gif

3、根据tags符号补全

36c66bc05f9a974b1fb783258386865b.gif

4. 文件树浏览

  • 常用插件

PluginsLink
NerdTreehttps://github.com/preservim/nerdtree
coc-explorerhttps://github.com/weirongxu/coc-explorer
nvim-tree.luahttps://github.com/nvim-tree/nvim-tree.lua
  • 原生配置

let g:netrw_banner=0 " 禁用没用的横幅
let g:netrw_winsize=25 " 初始窗口大小为25%
let g:netrw_liststyle=3 " 使用树状模式
let g:netrw_altv=1 " 分割窗口时默认在右边
let g:netrw_browse_split=4 " enter时在上一个窗口打开
  • 简单演示

1、:vexplore打开文件树,enter以覆盖上一窗口打开,v以分割窗口打开

ce2b02ee4b94ea9d95100c12a97e9523.gif

2、D删除文件,R重命名文件,其他操作可参考:help netrw

5. 自定义代码段

  • 常用插件

PluginsGithub
vim-snippetshttps://github.com/honza/vim-snippets
ultisnipshttps://github.com/SirVer/ultisnips
LuaSniphttps://github.com/L3MON4D3/LuaSnip
  • 原生配置

以写markdown文件为例,我们可以利用vim keybind的配置来实现简单的snippets。

例如下面配置第3行表示,对于识别出的markdown文件,当我们在insert模式按下,b,那么vim就会自动帮我们生成 **** <++> 代码,并且把光标移动 **|** 的中间。这样我们在写md时,就可以快速地使用加粗格式。

那可能有人会问:<++>这串符号是做什么的?这是我从别人学到的一个非常巧妙的设计。我们可以将它理解为placeholder,当我们写完加粗的内容后,为了快速地移动下一个编辑区域,我们暂时在****之外预埋了<++>。配合配置第1行,按下,f时vim会找到这一特定字符串<++>删除并进入插入模式,从而免去了额外移动光标的操作。

autocmd Filetype markdown inoremap <buffer> ,f <Esc>/<++><CR>:nohlsearch<CR>"_c4l
autocmd Filetype markdown inoremap <buffer> ,n ---<Enter><Enter>
autocmd Filetype markdown inoremap <buffer> ,b **** <++><Esc>F*hi
autocmd Filetype markdown inoremap <buffer> ,s ~~~~ <++><Esc>F~hi
autocmd Filetype markdown inoremap <buffer> ,i ** <++><Esc>F*i
autocmd Filetype markdown inoremap <buffer> ,d `` <++><Esc>F`i
autocmd Filetype markdown inoremap <buffer> ,c ```<Enter><++><Enter>```<Enter><Enter><++><Esc>4kA
autocmd Filetype markdown inoremap <buffer> ,m - [ ]
autocmd Filetype markdown inoremap <buffer> ,p ![](<++>) <++><Esc>F[a
autocmd Filetype markdown inoremap <buffer> ,a [](<++>) <++><Esc>F[a
autocmd Filetype markdown inoremap <buffer> ,1 #<Space><Enter><++><Esc>kA
autocmd Filetype markdown inoremap <buffer> ,2 ##<Space><Enter><++><Esc>kA
autocmd Filetype markdown inoremap <buffer> ,3 ###<Space><Enter><++><Esc>kA
autocmd Filetype markdown inoremap <buffer> ,4 ####<Space><Enter><++><Esc>kA
autocmd Filetype markdown inoremap <buffer> ,l --------<Enter>
  • 简单演示

6f66eea8280cab7ba3fb019e444531e0.gif


6. 编译一体化

  • 原生配置

" 可以根据使用的编译命令自行配置,默认包含make
set makeprg=xxxxx
  • 开始演示

1、使用:make内置命令编译项目

ffe96b3b054bb065845686aca5c8a3af.gif

2、使用 :cl 显示编译错误信息,:cc+数字 跳转编译错误位置,:cn/:cp 向前向后导航

0ad2b31150f5b0969acd50d741a4c496.gif

7. 其他实用操作

  • 场景1. 非文件所有者保存时提示没有权限,为了避免丢失原有的改动,可以使用以下命令。其中实现原理也很简单,可以参考:https://unix.stackexchange.com/questions/301256/how-does-w-sudo-tee-work

:w !sudo tee %
  • 场景2. 使用 . 高效执行一些重复的操作

例如我们想快速删除one two wrong words three four中间隔的one two three four,或者删除3个连续的单词3dw时,不想移动到数字区域,可以dw..进行操作。

c16f5f5327bee117d7bdfbdd840de4d8.gif

备注:想要更复杂的重复操作,可以使用宏录制
  • 场景3. 关闭文件再重新打开时,无法撤回历史动作。以下配置可以实现持久化undo记录

set undofile 
" 配置你的undo保存路径
set undodir=~/.vim/undodir
  • 习惯4. 使用:x替代:wq,使用:qa替代每个窗口执行一次:q

  • 还有相当多实用高效的操作,列举意义不大,大家感兴趣的话可以翻阅vim手册:https://yianwillis.github.io/vimcdoc/doc/usr_toc.html

参考链接

  1. vim improved recommendations: https://www.vi-improved.org/recommendations/

  2. thoughtbot course:https://thoughtbot.com/blog/how-to-do-90-of-what-plugins-do-with-just-vim

  3. vim doc:https://www.vim.org/docs.php

  4. Vim 8 中 C/C++ 符号索引:GTags 篇 : https://zhuanlan.zhihu.com/p/36279445

本文转载自:「鹅厂架构师」,原文:https://url.hi-linux.com/jlDHu,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

55ce8f3dfe17af4066d853f4bda0f018.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

82da09da1d49d983c7287e3a2ea93558.png

你可能还喜欢

点击下方图片即可阅读

6eca9e21d995395b0b423b22a14861d2.png

Memos:一款开源的超高颜值备忘录,GitHub 星标 6.3k

7ce101d0c8843789bee7c1a6c49a8b98.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

10025738aa36fde9d6f6b0fe0d21400c.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值