Vim 实用技巧必知必会
吴咏炜
前 Intel 资深软件架构师
21753 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
Vim 实用技巧必知必会
15
15
1.0x
00:00/00:00
登录|注册

08|基本编程支持:规避、解决编程时的常见问题

内置 man 插件
使用 K 命令
异步支持
使用 :grep 命令
使用 :make 命令
Tagbar 插件
使用 tags 文件
生成 tags 文件的命令
生成 tags 文件的工具
定制文件类型选项
设置文件类型选项
定制文件类型判断
通过后缀进行判断
缩进
软制表符宽度
扩展 <Tab> 为空格
制表符宽度
文件高亮
查看文档
Quickfix 窗口
Tags 支持
文件类型选项
文件类型判断
文件类型和关联设定
Vim 编程支持

该思维导图由 AI 生成,仅供参考

你好,我是吴咏炜。
在前面的几讲里,我们已经学了很多使用 Vim 的基本知识。今天是编程专题,我来专门介绍一下 Vim 对编程的特别支持。学了这一讲之后,你会进一步了解 Vim 编辑程序时的重要特性,并能够规避、解决编程时的常见问题。

文件类型和关联设定

程序源代码通常由文件组成,每个文件都有一个关联的文件类型。这个文件类型决定了 Vim 对其进行处理的一些基本设定,可能包括:
如何对文件进行高亮
制表符(tab)的宽度(空格数)
是否在键入 <Tab> 时扩展为空格字符
每次缩进的空格数(是的,可以和制表符宽度不同)
采用何种自动缩进方法
其他可适用的选项
文件高亮通常需要一套相当复杂的规则,我们今天就只把它当成一个既成事实了,不讨论这些规则的细节。其他各项在 Vim 里一般以选项的形式出现。这些选项都是文件本地(local)选项,即可以在一个文件里修改其数值而不影响其他文件。对于这样的选项,可以用 :setlocal:setglobal 命令分别访问本地值和全局值。一般的 :set 命令在读取数值时(如 :set tabstop?)返回本地值,在写入数值时(如 :set tabstop=4)同时设置本地值和全局值。
制表符宽度对应的选项是 tabstop。这在不同的语言里可能有不同的惯例,自然不必多说。它的缺省值是 8,但在不同的文件里可以不一样。不同的文件类型也可能会自动设定不同的数值。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Vim 编程特别支持 Vim 是一款强大的文本编辑器,提供了丰富的编程特别支持。本文首先介绍了 Vim 在文件类型和关联设定方面的特性,包括文件高亮、制表符宽度、扩展空格字符等选项的设置。文章详细讨论了 Vim 如何判断文件类型以及根据文件类型设置选项的方法,包括通过后缀和自定义规则进行文件类型判断。此外,还介绍了定制 Vim 行为的方法和在用户 Vim 配置目录里进行文件类型定制的技巧。 另外,文章还介绍了使用 tags 文件进行符号跳转的方法,以及 Tagbar 插件的使用,可以利用 Ctags 来提取符号,生成源代码的结构图。还介绍了 Quickfix 窗口的使用,可以展示外部命令的结果,并可以通过这个窗口中的内容直接跳转到特定文件的特定位置。最后,文章介绍了 `:make` 命令和 `:grep` 命令的使用,分别用于编译和搜索源代码。 此外,文章还介绍了 Vim 8 支持的异步任务,以及如何利用 asyncrun.vim 插件实现在构建过程中仍然可以继续进行其他操作的体验。还介绍了使用 `K` 命令来查看关键字相关文档的方法,以及如何配置 `keywordprg` 选项来优化文档查看体验。 总的来说,本文详细介绍了 Vim 在编程方面的特别支持,包括文件类型设置、tags 文件的使用、Tagbar 插件、Quickfix 窗口、编译和搜索命令的使用,以及异步任务和文档查看的优化配置,为读者提供了全面的 Vim 编程特别支持的概览。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Vim 实用技巧必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(15)

  • 最新
  • 精选
  • 吴咏炜
    置顶
    根据 YouCompleteMe 同学给出的提醒,我文中对 tags 的的写法不是最好。更好的写法是: set tags=./tags;,tags,/usr/local/etc/systags 感谢 YouCompleteMe 同学。语法帮助详见 :help file-searching。
    2020-08-11
    9
  • YouCompleteMe
    我用的 set ctags=./.tags;,.tags 其中的;表示递归向上,这样就不用写..和../..表示多层级了

    作者回复: 这个语法我在资料里没查到过。我也学习了……

    2020-08-10
    4
    5
  • __@948CSheLL
    老师您好,我想请问一下,下好的Universal Ctags应该放到那个目录下合适?

    作者回复: 如果Windows,没有约定俗成位置,我一般用 C:\bin。 Unix 下如果只给自己安装是 ~/bin,给机器上所有人(一般需要 root 权限)是 /usr/local/bin。

    2020-08-19
    1
  • 唐龙
    vim能不能实现,C++类的成员变量一个颜色,函数的形参一个颜色,类似于这样的高亮。感觉就算支持的话也会很麻烦。

    作者回复: 对。这需要理解语言。Vim 本身做这些功能都是用正则表达式的。那就不行了。 理论上来说,写插件跟语言服务器交互,可能还是能做到的。确实很麻烦。

    2020-08-13
    2
    1
  • shyghost
    tags建议增加gtags工具,gtags不仅支出跳转,还支持函数引用的查询,而且文件更新时可以针对单个文件更新

    作者回复: tags属于传统工具,了解一下就行。真正要语义查询,还是用真正理解语言的工具。后面会讨论。

    2020-08-13
    2
    1
  • Geek_b56bf2
    老师,请教下windows下执行make怎么输出到终端呀,不输出到文件

    作者回复: Windows 上 gvim 行为就是这样的。如果终端里运行 vim,则可以看到执行的命令行。 如果你安装了 asyncrun.vim 的话,可以在打开 quickfix 窗口的同时运行 :Make——就可以立即看到 make 的进展了。

    2023-08-23归属地:重庆
  • 大狗爱吃鱼
    grep中文支持,怎么做啊?

    作者回复: 如果 Unix 下全部用 UTF-8,那就自然支持了。 否则可以考虑用 vimgrep 命令,性能就会低点了。

    2020-10-21
  • 李公子胜治
    老师,可以分享一下你的vim配置吗😅还有老师可以详细讲一讲cpp中的不定参模板函数和类吗,我看书感觉好晦涩

    作者回复: 我的Vim配置的主体部分都会进入这个专栏的。 C++的东西,可以在我的C++专栏的相应部分留言。我们在那里讨论吧。

    2020-08-11
  • pyhhou
    感觉这一篇满满的干货,但很多都是我没有接触过的概念。 对于 tags 感觉有点类似于函数跳转,比如在一些其它的编辑器中,按下 CMD,鼠标点击函数名就可以跳转到函数的定义的位置(日常工作中用的比较多,比较在意的一个功能)。不知道 vim 中函数跳转的实现是不是也和 tags 的实现类似? 另外,quickfix 是不是只能用于 make 指令?其功能能否用于语言的编译或运行中的错误定位,比如 Java,Golang 等等的编译。 谢谢老师的分享,知道很多自己从未接触过的东西,看来想要真正学好 VIM 还得多多尝试自己没接触过的东西

    作者回复: 我来也同学已经基本回答了你的问题。再补充一下关于 quickfix。 Quickfix 是 Vim 中的一种“机制”。不同的命令和插件都可以使用它,不只是 make。一般来讲,“全局”的错误或信息定位会使用 quickfix,单文件的错误定位(编辑时发现错误)会使用另一个叫 location-list 的东西。两者概念上非常接近,只是一个是全局的,一个跟随窗口的。

    2020-08-11
    4
  • 我来也
    # 题外话 老师的这些内容都很全面,完全可以当手册来用. 可惜目前的订阅人数不多,留言的人数就更少了. 这也跟vim这个工具有关系吧. 毕竟这玩意的学习曲线陡峭也是出了名的. 但愿以后有兴趣的小伙伴能来这里系统的学习,少走弯路吧. # 制表符配置 说实话,我是记不清那么多tab的配置项含义的. 好在这玩意配置后就不需要怎么改了. 即使有疑问,也可以很方便的用老师后面介绍的`K`命令,看具体的配置项含义. # 文件类型判断 我记得有两种判断方式 1. 根据文件后缀名判断 2. 根据文件内容的前多少行的内容来判断 看了老师的专栏,知道还可以借助路径来辅助判断. # Tags支持 Ctags这玩意在大几年前,绝对是文件跳转用的主力. 但也存在着一些弊端. 最明显的就是如果多个地方有同名的函数名,在跳转时是不准确的. 这样就会遇到老师文中`展示在新窗口中选择并打开 printf 的声明`展示的, 需要按一长串快捷键,后面还需要选择编号`2`. 现在不少vim插件都可以提供完整LSP(Language Server protocol) 功能支持, 现在主流的编程语言好像都有了对应lsp的服务端吧. 有了它,就可以实现很精准的函数跳转啦. 即使是接口类型的,它也可以很方便的去查找所有实现了的类. 还可以查看某个类都实现了哪些接口. 是不是很屌? 这次得感谢微软了. # Quickfix location-list 既然谈到了这些列表跳转的快捷键,那我就再带带货. 推荐一款插件[vim-unimpaired](https://github.com/tpope/vim-unimpaired/blob/master/doc/unimpaired.txt) 看它的快捷键,是不是很有规律? 都是`[``]`开头的,很好记. # make 及异步化支持 推荐一个跟老师提到的`skywind3000/asyncrun.vim`类似的插件吧 [vim-dispatch](https://github.com/tpope/vim-dispatch/blob/master/doc/dispatch.txt) # grep 命令 推荐一款<Modern Vim>书中推荐的插件 [vim-grepper](https://github.com/mhinz/vim-grepper) 可以很方便的选择具体搜索的命令. 比如我最近就很喜欢用ripgrep来搜索. 另外可以很方便的配置搜索当前buffer, 当前所有打开的buffer, 当前路径下的所有文件. (由于涉及大量代码,导致评论超出了2000字限制,故放到另外一个评论中.) # vim的indent缩进 提到了tab的缩进,我就顺便推荐一个我最近三周才接触的一个插件. [vim-indent-guides](https://github.com/nathanaelkane/vim-indent-guides) 以前为了配置tab/空格可见,进程会配置vim的`listchars`选项. 就像文中`GNU 风格的 C++ 代码`图片显示的那样,tab用`>---`展示. 但是针对我这种经常需要用鼠标去复制内容的人很不友好.经常会把这东西给复制进去了. 但是这个插件就很巧妙,是用背景色来对齐缩进. 可以很直观的看到缩进是空格还是tab. 也不存在复制时多出莫名其妙的字符. 由于我配置的背景色非常非常淡,所以不太会干扰正常的视线.
    2020-08-10
    13
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部