Vim 实用技巧必知必会
吴咏炜
前 Intel 资深软件架构师
立即订阅
2250 人已学习
课程目录
已更新 12 讲 / 共 24 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词|我们为什么要学 Vim?
免费
导读|池建强:Vim 就是四个字“唯快不破”
基础篇 (10讲)
01|各平台下的 Vim 安装方法:上路前准备好你的宝马
02|基本概念和基础命令:应对简单的编辑任务
03|更多常用命令:应对稍复杂的编辑任务
04|初步定制:让你的 Vim 更顺手
05|多文件打开与缓冲区:复制粘贴的正确姿势
06|窗口和标签页:修改、对比多个文件的正确姿势
07|正则表达式:实现文件内容的搜索和替换
08|基本编程支持:规避、解决编程时的常见问题
09|七大常用技巧:让编辑效率再上一个台阶
10|代码重构实验:在实战中提高编辑熟练度
Vim 实用技巧必知必会
15
15
1.0x
00:00/00:00
登录|注册

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

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

文件类型和关联设定

程序源代码通常由文件组成,每个文件都有一个关联的文件类型。这个文件类型决定了 Vim 对其进行处理的一些基本设定,可能包括:
如何对文件进行高亮
制表符(tab)的宽度(空格数)
是否在键入 <Tab> 时扩展为空格字符
每次缩进的空格数(是的,可以和制表符宽度不同)
采用何种自动缩进方法
其他可适用的选项
文件高亮通常需要一套相当复杂的规则,我们今天就只把它当成一个既成事实了,不讨论这些规则的细节。其他各项在 Vim 里一般以选项的形式出现。这些选项都是文件本地(local)选项,即可以在一个文件里修改其数值而不影响其他文件。对于这样的选项,可以用 :setlocal:setglobal 命令分别访问本地值和全局值。一般的 :set 命令在读取数值时(如 :set tabstop?)返回本地值,在写入数值时(如 :set tabstop=4)同时设置本地值和全局值。
制表符宽度对应的选项是 tabstop。这在不同的语言里可能有不同的惯例,自然不必多说。它的缺省值是 8,但在不同的文件里可以不一样。不同的文件类型也可能会自动设定不同的数值。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Vim 实用技巧必知必会》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥19.9
立即订阅
登录 后留言

精选留言(9)

  • 吴咏炜 置顶
    根据 YouCompleteMe 同学给出的提醒,我文中对 tags 的的写法不是最好。更好的写法是:

    set tags=./tags;,tags,/usr/local/etc/systags

    感谢 YouCompleteMe 同学。语法帮助详见 :help file-searching。
    2020-08-11
    1
  • 我来也
    # 题外话
    老师的这些内容都很全面,完全可以当手册来用.
    可惜目前的订阅人数不多,留言的人数就更少了.

    这也跟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
    4
  • YouCompleteMe
    我用的 set ctags=./.tags;,.tags 其中的;表示递归向上,这样就不用写..和../..表示多层级了

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

    2020-08-10
    3
    2
  • 我来也
    针对vim中Alt映射键不生效的问题,可以参考这篇文章.
    [Vim 中正确使用 Alt映射](http://www.skywind.me/blog/archives/1846)

    我最近参考这篇文章,成功的在Mac上把Option键映射为了Alt键.
    该文章对`Xshell` `putty` `MinTTY` 都有所涉及.
    2020-08-10
    2
  • 我来也
    接上文.

    这就是我就针对`vim-grepper`插件,配置的两个快捷键:
    ```
    " 如果安装了`ripgrep`就优先选择它 否则使用默认的grep
    if exists(':GrepperRg')
    " 这种方式没法直接使用rg的命令行参数 但可以实现
    " -dir 指定文件或目录 cwd | file | filecwd | repo `h:g:grepper.dir`
    " -buffer 只搜索当前文件
    " -buffers 所有打开的文件
    vnoremap <F3> <Esc>:<C-u>Grepper -dir cwd -tool rg -noprompt -query '\b<C-r>=GetVisual('rg')<CR>\b' <C-h>
    vnoremap <F4> <Esc>:<C-u>Grepper-buffers -dir cwd -tool rg -noprompt -query '\b<C-r>=GetVisual('rg')<CR>\b' <C-h>
    nnoremap <expr> <F3> ":<C-u>Grepper -dir cwd -tool rg -noprompt -query '\\b" . expand('<cword>') . "\\b' "
    nnoremap <expr> <F4> ":<C-u>Grepper-buffers -dir cwd -tool rg -noprompt -query '\\b" . expand('<cword>') . "\\b' "
    elseif exists(':GrepperGrep')
    vnoremap <F3> <Esc>:<C-u>Grepper -dir cwd -tool grep -noprompt -query '\<<C-r>=GetVisual('grep')<CR>\>' <C-h>
    vnoremap <F4> <Esc>:<C-u>Grepper-buffers -dir cwd -tool grep -noprompt -query '\<<C-r>=GetVisual('grep')<CR>\>' <C-h>
    nnoremap <expr> <F3> ":<C-u>Grepper -dir cwd -tool grep -noprompt -query '\\<" . expand('<cword>') . "\\>' "
    nnoremap <expr> <F4> ":<C-u>Grepper-buffers -dir cwd -tool grep -noprompt -query '\\<" . expand('<cword>') . "\\>' "
    endif

    # 可视模式下的函数`GetVisual`来自于下面这个连接. 方便转义当前选中区域的特殊字符!!!
    # https://stackoverflow.com/questions/676600/vim-search-and-replace-selected-text/6171215#6171215
    ```

    这是我映射的为数不多的几个F开头的功能键.
    希望对大家有帮助.
    2020-08-10
    1
  • 唐龙
    vim能不能实现,C++类的成员变量一个颜色,函数的形参一个颜色,类似于这样的高亮。感觉就算支持的话也会很麻烦。

    作者回复: 对。这需要理解语言。Vim 本身做这些功能都是用正则表达式的。那就不行了。

    理论上来说,写插件跟语言服务器交互,可能还是能做到的。确实很麻烦。

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

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

    2020-08-13
    1
  • 李公子胜治
    老师,可以分享一下你的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
    3
收起评论
9
返回
顶部