0%

Vim(2)

Main Takeaway

Following missing semester of MIT to learn Vim.

希望通过Learn Vimscript the Hard Way (stevelosh.com)+Vim Adventures 来进一步练习Vim的使用

Vim(2)——Vim的进阶知识(我也还没用到宏,以后重新整理填坑)

双手离开鼠标!

Vim 进阶

一个好的对策是: 当你在使用你的编辑器的时候感觉 “一定有更好的方法来做这个”, 那么很可能真的有:上网搜寻一下。

缓存,标签页,窗口

Vim 会维护一系列打开的文件,称为“缓存”。一个 Vim 会话包含一系列标签页,每个标签页包含 一系列窗口(分隔面板)。每个窗口显示一个缓存。跟网页浏览器等其他你熟悉的程序不一样的是, 缓存和窗口不是一一对应的关系;窗口只是视角。一个缓存可以在多个窗口打开,甚至在同一 个标签页内的多个窗口打开。这个功能其实很好用,比如在查看同一个文件的不同部分的时候。

Vim 默认打开一个标签页,这个标签也包含一个窗口。

搜索和替换

:s (替换)命令(文档)。

  • %s/foo/bar/g
    • 在整个文件中将 foo 全局替换成 bar
  • %s/\[.*\](\(.*\))/\1/g
    • 将有命名的 Markdown 链接替换成简单 URLs

多窗口

  • :sp / :vsp 来分割窗口
  • 同一个可以buffer在多个窗口中显示。

  • q{字符} 来开始在寄存器{字符}中录制宏

  • q停止录制

  • @{字符} 重放宏

  • 宏的执行遇错误会停止

  • {计数}@{字符}执行一个宏{计数}次

  • 宏可以递归

    • 首先用q{字符}q清除宏
    • 录制该宏,用 @{字符} 来递归调用该宏 (在录制完成之前不会有任何操作)
  • 例子:将 xml 转成 json (

    file

    )

    • 一个有 “name” / “email” 键对象的数组

    • 用一个 Python 程序?

    • 用 sed / 正则表达式

      • g/people/d
      • %s/<person>/{/g
      • %s/<name>\(.*\)<\/name>/"name": "\1",/g
    • Vim 命令 / 宏

      • Gdd, ggdd 删除第一行和最后一行

      • 格式化最后一个元素的宏 (寄存器

        1
        e

        • 跳转到有 <name> 的行
        • qe^r"f>s": "<ESC>f<C"<ESC>q
      • 格式化一个

        的宏

        • 跳转到有 <person> 的行
        • qpS{<ESC>j@eA,<ESC>j@ejS},<ESC>q
      • 格式化一个

        标签然后转到另外一个的宏

        • 跳转到有 <person> 的行
        • qq@pjq
      • 执行宏到文件尾

        • 999@q
      • 手动移除最后的 , 然后加上 [] 分隔符

自定义 Vim

Vim 由一个位于 ~/.vimrc 的文本配置文件(包含 Vim 脚本命令)。你可能会启用很多基本设置。

我们提供一个文档详细的基本设置,你可以用它当作你的初始设置。我们推荐使用这个设置因为它修复了一些 Vim 默认设置奇怪行为。 这儿 下载Missing semester的设置,然后将它保存成 ~/.vimrc.

Vim 能够被重度自定义,花时间探索自定义选项是值得的。你可以参考其他人的在 GitHub 上共享的设置文件。 有很多好的博客文章也聊到了这个话题。尽量不要复制粘贴别人的整个设置文件, 而是阅读和理解它,然后采用对你有用的部分。

扩展 Vim

Vim 有很多扩展插件。跟很多互联网上已经过时的建议相反,你不需要在 Vim 使用一个插件 管理器(从 Vim 8.0 开始)。你可以使用内置的插件管理系统。只需要创建一个 ~/.vim/pack/vendor/start/ 的文件夹,然后把插件放到这里(比如通过 git clone)。

以下是一些好用的我们最爱的插件:

我们尽量避免在这里提供一份冗长的插件列表。可以查看missing semester讲师们的开源的配置文件 (Anish, Jon, Jose) 来看看我们使用的其他插件。 浏览 Vim Awesome 来了解一些很棒的插件。 这个话题也有很多博客文章:搜索 “best Vim plugins”。

References