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
登录|注册

02|基本概念和基础命令:应对简单的编辑任务

吴咏炜 2020-07-27
你好,我是吴咏炜。
这一讲,我们会讨论 Vim 的基本概念和配置。先强调一下,请务必确保你在学习这一讲之前,已经通过 Vim 教程熟悉了 Vim 的基本用法。

Vim 教程的内容概要

上节课我给你留的作业,就是花时间学习一下 Vim 教程,下面我们就来检验一下。只有你自己先对照着教程操作了一遍,今天我再带着你过一遍里面的基本概念和配置,你才能查漏补缺,发现自己遇到的问题,明确自己需要多加练习的地方。
好,现在请查看下面的键盘图。简单说明一下,这张图上展示了一个键盘。图中的“•”表示,单个字母不是完整的命令,必须再有进一步的输入。比如,单个“g”没有意义,而“gg”表示跳转到文件开头。(对于命令后面明确跟一个动作的,如“c”,我们不使用“•”。)一个键最多有三排内容:最底下是直接按键的结果,中间是按下 Shift 的结果(变大写),上面偏右的小字是按下 Ctrl 的结果。我们还用了一些特殊符号来表示操作的位置,如果你已经了解了这些命令的功能,你也自然就明白它们的意义了。
Vim 命令速查(教程版)
请检查一下有颜色的那些键,看看你是否有任何不熟悉的地方。如果看下来有让你感到陌生的内容,请复习 Vim 教程。
这张图里没有写出 Vim 的命令行命令。你现在应该已经掌握了以下这些:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Vim 实用技巧必知必会》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥19.9
立即订阅
登录 后留言

精选留言(27)

  • 一步
    生成的 undofile 怎么使用的? 我用 vim打开这个文件 是乱码的

    作者回复: 不是让你自己打开的。Vim 会自动用这个文件来做 undo (<u>)和 Redo(<C-r>)。

    2020-07-27
    5
    1
  • 唐龙
    老师的撤销文件和对于鼠标的处理我都挺喜欢的,后面的中文支持自己之前解决过,有一端时间在gitbash里使用vim,出现过乱码。也顺便了解了vim不同层面对于编码的处理和转换。贴一下自己在Windows里的配置文件:
    set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
    set termencoding=utf-8
    set encoding=utf-8
    后两行好像是展示到终端时采用的编码,还有vim内部处理时使用的编码,记不大清了。
    所以我真的挺不喜欢Windows的。

    作者回复: 你的第一行等价于

    set fileencodings=utf-8,ucs-bom,gb18030

    不可能走到后面几种编码。

    termencoding要跟你的终端编码匹配。Windows上大概率不是 UTF-8。事实上在 Windows 上不需要设。

    2020-07-27
    2
    1
  • doge
    这个undofile的功能太强大了,以前把backup禁用后,老是碰到远程掉线,然后不记得上次修改的情况,这以后就不用怕了啊。

    作者回复: 如果没存盘的话,还是要靠交换文件,而不是撤销文件。

    2020-07-27
    1
  • Adoy
    老师怎么看待新的NeoVim,貌似更多人选择NeoVim来替代Vim因为更加开放和更加现代。同时VSCode也有插件支持NeoVim作为后端,提供vim的便利。

    作者回复: 参见01评论下我的回答。

    2020-07-27
    1
  • 绝尘而去
    很同意老师的说法,没有必要用了vim后就不用鼠标,任何工具都是为了提高工作效率,在合适的情况使用合适的工具就可以了。

    作者回复: 还跟个人习惯有关。这个不求大家都有相同的用法。每个人找到最适合自己的方法。

    2020-07-27
    1
  • 我来也
    话说一个undo插件是真的厉害,像git一样保存着历史的修改记录,可以随时撤回到指定状态。

    说实话,在使用vim的内置功能时,我极少数会用到鼠标。
    虽然我设置了一个快捷键,在set mouse=a和n间切换。
    但除了调整分割窗口的大小时,平常几乎不会用鼠标了。

    平常在vim中使用鼠标最多的场景是:在编辑状态,想插入屏屏幕上其他某个内容时,会借助iTerm2的选取即复制功能,然后按下Cmd+v来粘贴。

    开启鼠标模式下,点击内容,光标会切换到指定地方。
    但在vim中,有两个方法可以快速的跳转和选取内容。
    1.使用插件,easymotion。
    2.使用书签和ctrl-i/o。
    使用书签可以快速的选中大段的范围。类似鼠标框选的效果。

    作者回复: 这也是一种用法。跟我的不太一样。

    2020-07-27
    1
    1
  • 范程怡
    老师您好,请在在Vim中代码块的大括号{ }一般是用怎样的输入顺序比较顺手?需要怎么配置括号自动填充吗?填充之后光标能否自动跳转到左右括号之间呢?

    作者回复: 目前没看到完美实现这类功能的插件。我试过 jiangmiao/auto-pairs,已经不错了,但仍有我不喜欢的副作用。你需要这类功能也许可以试一下。

    2020-08-09
  • 瀚海星尘
    这一讲真的是干活满满,学到了!已收藏。
    2020-08-08
  • 瀚海星尘
    跨会话撤销真的好牛逼啊!真的是第一次见到!!
    2020-08-08
  • Gin
    在mac上用brew安装的命令行vim。不会自动生成undofile,所以设置了undodir之后还需要set undofile打开自动生成undofile。

    作者回复: 用了我的参考配置吗?默认是不打开的,但我的配置会间接打开,文中有说明。

    2020-08-03
  • __@948CSheLL
    在设置了set mouse=nui后,切换到命令行模式,不能点击右键,请问老师应该怎么办?

    作者回复: 不清楚你的意思。我试下来,这种情况下右键都是弹出终端的右键菜单。

    2020-08-02
  • Kevin⚡️Zhou
    老师, 请问vim生成的swp file的保存机制是什么样的, 是每次用户开启编辑模式, vim会同时用另外的线程写入到swp文件中么?

    作者回复: 这个不清楚,我也没仔细研究 Vim 的源码。比较大的概率,并不是使用异步的线程做的。

    2020-08-02
  • 何不食夜糜
    老师请问您的中文帮助文档是怎么设置的 在哪里可以获取

    作者回复: 安装那讲里有专门“中文帮助文档”一节的。看漏了?

    2020-08-01
    1
  • pyhhou
    老师,请教另一个问题,配置字体那里,在 Mac home 下的 .vimrc 文件中添加了

    set guifont=DejaVu\ Sans\ Mono\ 32

    但是用 vim 或是 mvim 启动并没有看到字体大小和样式的改变,但是在 Mac vim 的图形界面中,命令行模式下输入上面的配置项就可以立刻看到字体的改变。不知道是哪里出了问题?

    作者回复: 格式不对吧?我试一下来,MacVim上接受的格式是这个样子的:

    set guifont=DejaVu\ Sans\ Mono:h32



    set guifont=DejaVu_Sans_Mono:h32

    你是认真地要设 32 磅的大字体吗?

    2020-07-31
    12
  • Fstar
    老师你觉得 vscode 的 vim 插件怎么样?感觉挺有潜力的。

    作者回复: 还可以。一般编辑功能都有了。如果希望自己安装使用Vim插件,那就不适用了。

    2020-07-30
  • JustDoIt
    vimtutor学习关键点:
    注意右下角会显示操作符。
    2020-07-30
  • 我来也
    我觉得vim的备份文件还是有必要设置一下的.
    与undo目录一样,backupdir也可以设置到外面.
    类似这样:
    ```
    set backup
    set writebackup
    set backupdir=~/.cache/vimbackup//
    ```

    今天就遇到了一个尴尬的事情.
    rm错了文件,而vim只保留了undo文件.恰好备份的文件没备份成功.
    导致文件内容无法恢复.

    讲讲我备份失败的原因:
    看到上面backupdir路径最后面的两个`//`了么?
    之前没备份成功,就是因为只有一个`/`.
    导致备份时,只保留了文件名,而没有保留完整的路径名.
    而当我发现我删除了文件时,已经编辑了另外的一个同名文件,导致被我误删的文件无法恢复了.

    我也是找到了这个链接才知道这么配置的:
    https://stackoverflow.com/questions/26742313/why-vim-backup-filenames-are-not-correct-backupdir-option-not-performing-as-expected
    发现在vim 8.1.0251版本中就修复了该问题
    https://github.com/vim/vim/commit/b782ba475a3f8f2b0be99dda164ba4545347f60f

    ---
    好像也没有什么好办法从undo文件直接恢复文件内容.
    https://stackoverflow.com/questions/18630937/recover-a-vim-file-from-the-un-file-without-the-undo-command

    作者回复: 误删这事就不好说了……不过你这也算一种方法吧。

    我在Mac上,文件系统本身就有快照功能。加上云的年代,重要文件在云端/Git里。Vim的撤销文件很方便,备份文件对我就很鸡肋。

    2020-07-30
  • return
    我的 ~/ 下面 居然有一个 .viminfo的文件, 进去看 貌似是 vim的编辑记录。

    作者回复: 这个是记录一些历史的。一般不用去动它。

    2020-07-30
  • 諸葛御風
    这个mac下显示按键的app是?

    作者回复: KeyCastr 开源,免费

    https://github.com/keycastr/keycastr

    2020-07-29
  • pyhhou
    请教老师,和前面几个同学一样的问题,在 Mac 终端下试了很多次没有找到 $VIMRUNTIME。

    尝试 $> echo $VIMRUNTIME,输出为空行
    另外尝试 $> which vim,输出的路径是 /usr/local/bin/vim

    这种情况下 >$ source $VIMRUNTIME/vimrc_example.vim 输出就是
    source: no such file or directory: /vimrc_example.vim

    但是在 vim 中,运行 $> echo $VIMRUNTIME 是有结果输出的,结果是:
    /usr/local/Cellar/macvim/8.2-163_2/MacVim.app/Contents/Resources/vim/runtime

    我尝试着用上面的那个在 vim 终端输出出来的 path 替换 .vimrc 中的 $VIMRUNTIME,但 source .vimrc 文件后还是会报错:(或者说这里我们不需要 source .vimrc?感觉 vim 进去之后颜色变了,说明成功导入 vimrc_example.vim?)

    /usr/local/Cellar/macvim/8.2-163_2/MacVim.app/Contents/Resources/vim/runtime/vimrc_example.vim:1: command not found: An example for a vimrc file.\n
    /usr/local/Cellar/macvim/8.2-163_2/MacVim.app/Contents/Resources/vim/runtime/vimrc_example.vim:3: command not found: Maintainer:\tBram Moolenaar <Bram@vim.org>\n
    /usr/local/Cellar/macvim/8.2-163_2/MacVim.app/Contents/Resources/vim/runtime/vimrc_example.vim:5: command not found: \n
    /usr/local/Cellar/macvim/8.2-163_2/MacVim.app/Contents/Resources/vim/runtime/vimrc_example.vim:7: command not found: \t for Unix: ~/.vimrc\n
    /usr/local/Cellar/macvim/8.2-163_2/MacVim.app/Contents/Resources/vim/runtime/vimrc_example.vim:9: command not found: \t for MS-Windows: \_vimrc\n
    /usr/local/Cellar/macvim/8.2-163_2/MacVim.app/Contents/Resources/vim/runtime/vimrc_example.vim:11: command not found: \t for OpenVMS: sys:.vimrc\n\n
    /usr/local/Cellar/macvim/8.2-163_2/MacVim.app/Contents/Resources/vim/runtime/vimrc_example.vim:14: command not found: out.\nif v:progname =~? evim\n finish\nendif\n\n
    /usr/local/Cellar/macvim/8.2-163_2/MacVim.app/Contents/Resources/vim/runtime/vimrc_example.vim:source:20: no such file or directory: /defaults.vim
    /usr/local/Cellar/macvim/8.2-163_2/MacVim.app/Contents/Resources/vim/runtime/vimrc_example.vim:53: parse error near `\n'
    .vimrc:12: parse error near `)'

    不知道是不是安装了 MacVim,需要改变配置项?按老师之前的安装配置,一般使用 vim 都会默认使用 mvim ?还烦请老师解答

    作者回复: 我提到的 source 命令都是 Vim 命令,是在 Vim 里面,不是在 Bash 里……

    如果安装了 MacVim,并且 printenv PATH 看到 /usr/local/bin 在 /usr/bin 前面,那 vim 命令启动的就是 MacVim 的版本。

    2020-07-29
收起评论
27
返回
顶部