Post

写给bamuwe的Vim入门指北

写给bamuwe的Vim入门指北

​ 都2024年了,为什么还要学习使用Vim? ​ 相信这是很多人的疑问,但是在我看来,Vim的使用,颇有古典朴素学派之感受,固然便捷高效的现代编辑器百花齐放,各样风采,但在风采之外,还有个质朴无华但满有历史厚重感的Vim默默躺在许多Unix系统之上。

​ Vim作为最长寿的计算机软件之一,到如今已经有超过三十年的历史,不论是其设计思想,还是工作哲学,亦或开源精神,无不影响着数以千万计的码农。

​ 或许我们不用将这次的学习看作是技能的提升,而是对Vim哲学的感受。


关于这篇指南

目标: 这是写给我自己的Vim指南,作为Vim小白的我,希望通过制作这篇指南的过程学习Vim。这篇指南会随着我对Vim的学习不断更新,尤其是常用技巧的部分。

适用对象: A man named bamuwe.

一,什么是Vim?

  • Vim的定义与用途

    Vim,全称 Vi IMproved(Vi 的增强版),是一款功能强大且高度可配置的文本编辑器。它是 Unix 系统中经典编辑器 Vi 的改进版,继承了 Vi 的核心设计哲学,同时加入了许多现代化特性。Vim 通常运行在终端环境中,但也支持图形界面 (GVim)。

    Vim主要有四个方面的用途,分别是 文本编辑 , 多文件管理 , 自动化任务 , 终端中的 IDE 。本篇主要还是侧重在文本编辑的方面。

  • Vim 的起源与历史背景

    Vim 的历史可以追溯到 1976 年,比大多数现代编辑器的诞生早了数十年。它起源于 Unix 系统上的经典编辑器 Vi,而 Vim 是对 Vi 的增强版本。

  • Vi 的诞生(1976 年) Vi 编辑器由 Bill Joy 在 Unix 系统的早期开发,是当时 Unix 的标准文本编辑器之一。Vi 的设计极具前瞻性,通过模态编辑模式和强大的快捷键组合,让用户在键盘上即可完成高效的文本编辑。

  • Vim 的诞生(1991 年) Bram Moolenaar 在 1991 年开发了 Vi 的增强版,命名为 Vim,即 “Vi IMproved”。最初,Vim 是在 Amiga 计算机上开发的,后来被移植到其他平台。相比 Vi,Vim 增加了许多功能,例如多级撤销、语法高亮、脚本支持等。

    从 Vi 到 Vim,再到如今的 Neovim,Vim 的发展历程是开源文化和软件设计不断演进的一个缩影。它并非只是一个文本编辑器,而是一个时代的象征,一种简洁、高效且优雅的编辑哲学。

  • Vim 和 Vi 的关系

    功能ViVim
    基本编辑功能支持基础的文本编辑完全兼容 Vi 的所有功能
    多级撤销仅支持一次撤销支持多级撤销 (u 撤销,Ctrl-R 重做)
    语法高亮不支持支持语法高亮,便于代码阅读
    插件支持不支持丰富的插件生态,支持扩展功能
    搜索与替换支持简单的搜索替换功能增强搜索功能(高亮匹配、正则表达式支持更好)
    窗口分屏不支持支持多窗口分屏和标签页
    图形界面不支持提供图形化版本(GVim)
    内置帮助文档极其有限提供详细的帮助文档(:help)
    自动补全不支持支持自动补全(文件名、代码、命令等)
    文件系统浏览器提供内置的文件系统浏览器(netrw)
  • 学习Vim的价值

    学习 Vim 好比长线投资,前期能看到的回报少之又少,但是随着对Vim学习的深入,相信Vim能够成为你的神兵利器。

    学习 Vim 不仅仅是掌握一个工具,更是对一种高效工作方式和经典哲学的认同,相信Vim的哲学也会影响着你。

二,我眼中的Vim哲学

轻便,快捷,集中。

​ Vim采用模态编辑,命令的设定都与对应的单词相关,同时复杂的操作可以通过简单的按键拼接使用实现,在知晓其意义之后,我们能够很快地记忆并高效地应用。

三,Vim的工作模式

​ Vim 的独特之处在于它的 模态编辑。不同的模式赋予用户不同的操作功能,让文本编辑更加高效和灵活。以下是 Vim 的主要模式及其功能解析:

  • 正常模式 (Normal Mode)

    Vim 的默认模式,主要用于导航和操作文本。无需输入文字,所有按键直接对应命令。

  • 插入模式 (Insert Mode)

    用于输入文本。进入该模式后,按键输入会直接在光标位置插入文字。

  • 可视模式 (Visual Mode)

    用于选中文本以便执行操作,如复制、删除或替换。光标移动会同时选中相应文本。

  • 命令行模式 (Command-Line Mode)

    执行文件操作、搜索替换等命令。输入命令以实现特定功能,最常用于全局操作和设置。

  • 替代模式 (Replace Mode)

    替换文本内容。输入的文字会逐字符替换掉已有的内容,而非插入。

Vim 的设计思想鼓励用户在不同模式之间快速切换,以实现高效编辑。例如:

  1. 从 正常模式 用 i 进入 插入模式,完成输入后按 Esc 返回正常模式。(这里我更喜欢使用Ctrl+C)
  2. 在 可视模式 中选中文本后,直接按 d 删除,或按 y 复制,再用 p 粘贴。

对于我而言,日常使用主要集中在正常模式,插入模式,最近逐渐学习使用可视化模式复制文版,命令行模式替换字符。

四,Vim的基础操作

  • 文件操作:打开、保存、关闭文件

    1. 打开文件

      在终端中,我们可以使用Vim <file_name>打开文件并进入正常模式,这也是我目前使用最多的办法。

      ​ 除了上述在终端操作的办法,我们打开Vim后,在命令行中输入:ls就能浏览当前缓冲区(已打开)的内容,使用:e <file_name>来创建或者打开文件,这个命令还可以打开并将光标跳转到指定文件的指定行:e <file_name> <line_number>。如果你在Vim中打开了多个文件,可以使用:b <file_name>进行切换。这样的操作对我来说有点繁琐,所以我更愿意使用:Ex命令(Explore)打开目录浏览器进行操作,该页面下:cd <path>可以切换路径,\n可以选中文件,R可以修改文件名称,-可以回到上级目录。q退出。

    2. 保存、关闭文件

      ​ 在Vim中退出命令是:q,对应了单词quit。但当你对文件内容做出修改后,使用该命令退出会引发告警,因为你没有明确是否保存修改的内容。所以当你编辑完文件,想保存并退出时,可以使用:wq或者:x命令,这两者的作用相同。如果不想保存修改而是直接退出,你可以使用:q!,表示强制退出。如果你同时打开了多个文件,可以使用:qa!,对应了quit all force。举一反三,保存所有就是:wqa

  • 移动光标:基本和高级移动命令(h, j, k, l, w, b, %)

    ​ Vim中使用h,j,k,l分别代表 左、下、上、右。w表示跳转到下一个单词,b表示跳转到上一个单词。%用来匹配括号、花括号、方括号,在附近按下%,光标会跳转到对应的处,如果没有匹配的项目,也会提示错误。 ​ 除了上述按键操作,我们也可以使用一些组合键帮助我们更高效的移动光标,例如我们可以使用10j这个按键组合使光标向下移动10行,其他同理。还可以使用Ctrl+uCtrl+d实现页面上下浏览。按下gg可以快速定位到文章首部,G可以快速跳转到文章尾部。

    ​ 在实际使用中还有许多高效操作,按下&快速定位到行末,^快速定位到行首,这不需要我们刻意记忆,这与正则表达式所用的符号都是一致的。

  • 文本编辑:插入、删除、复制、粘贴(i, a, d, y, p)

    ​ 在正常模式下,我们不能够对文本内容进行编辑,我们需要使用命令按键进入文本编辑模式,最常见的就是i对应了单词(insert)在当前位置插入。a对应单词(apend)表示在当前位置之后插入。除了这些基础单个按键的操作,我们还可以使用I在行首插入,A在行末插入。

    d表示删除,对应单词(delete)它需要配合其他按键一起使用,例如dd删除当前行,dw表示删除到下个单词,d$删除到行末,10dd删除10行,d\<char>删除到指定匹配字符等等…….可以将基础按键组合使用实现复杂操作。我常用的还有s,删除当前字符并切换到插入模式。在可视模式下,选中再按d可以删除选中部分。有个类似的按键c可以做到删除并且进入插入模式。

    y是复制,我常用的是yy,复制当前行;10yy复制10行。

    p是粘贴,粘贴复制的内容。

    ​ 这里还有个寄存器的概念,dy的内容会存到寄存器中,p粘贴的内容就是寄存器中所取,所以我们删除内容后不用额外复制, 直接粘贴即可。

  • 选择

​ 按下v即可进入选择模式,配合其他命令完成操作,V可以快速选择当前行。

  • 搜索与替换(/, ?, :s)

    ​ 在正常模式下,可以输入/{pattern}搜索当前文本中的匹配内容,并且使用回车将光标跳转到对应位置,如果存在多个匹配项,可以按下n跳转到下一个匹配项,N跳转到上一个匹配项。默认情况下,这是匹配大小写敏感的。?的使用与/基本相同,区别在于一个是向下文匹配,一个是向上文匹配,基本上我只用/

    :s是Vim超级强大的命令,实现内容的替换,类似于sed的操作。例如:s/{pattern}/new/g就是把当前行所有匹配项换成new,在前面加上%,即:%s/{pattern}/new/g实现全文件中匹配项的替换。这个命令配合一手正则使用,非常舒适,非常强大,虽然我使用的时间不久,但是已经深刻感受到它的威力。

  • 代码格式化

=可以对选中代码进行格式化。配合选择使用。

五,Vim的配置与个性化

  • .vimrc 基础入门(常见设置,如显示行号、缩进)

  • 使用颜色主题

  • 配置快捷键(映射键位)

  • 推荐基础插件和安装方法(通过 vim-plug 或其他包管理器)

  • 我的.vimrc

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    filetype plugin indent on
    syntax on
    set nu
    set hlsearch
    set textwidth=80
    nnoremap [e  :<c-u>execute 'move -1-'. v:count1<cr>
    nnoremap ]e  :<c-u>execute 'move +'. v:count1<cr>
    xnoremap <  <gv
    xnoremap >  >gv
    

六,Vim的常用技巧(组合操作)

  • 多行行首插入

    举例场景:需要多行添加注释时候。

    解决办法:

    1. 进入可视化页面选择行,再使用I向行首插入。

    2. 使用替换实现,例如向2到4行插入{word}就可以使用2,4s/^/{word}/g

  • 全文代码格式化

    举例场景:需要代码格式化。

    解决办法:ggvG=选中全文进行代码格式化。

  • 文本格式化

    举例场景:文本宽度过长,阅读不方便。

    解决办法:使用gq命令格式化,全文格式化可以按下gggqG完成。注意该命令不适用于代码格式化。

  • 重复上一台命令

    举例场景:需要查找上一条替换命令,或者重新执行以前的命令。

    解决办法:

    1. 按下:进入命令行模式之后,可以使用Ctrl+pCtrl+n检索 上/下 一条命令。
    2. 按下:进入命令行模式之后,可以使用方向键检索 上/下 一条命令。
  • 快速移动当前行

    举例场景:代码中需要整行移动。

    解决办法:

    1. 在命令行中使用move +1move -1-实现整行移动。

    2. 在.vimrc中配置,再使用[e]e就可以实现整行移动。

      1
      2
      
      nnoremap [e  :<c-u>execute 'move -1-'. v:count1<cr>
      nnoremap ]e  :<c-u>execute 'move +'. v:count1<cr>
      
  • 调整单/多行缩进

    举例场景:代码中需要调整缩进的地方。

    解决办法:

    1. v进入选择模式,选中行,使用><就可以快速调整缩进,但是不能连续调整,在vimrc中做如下配置:

      1
      2
      
      xnoremap <  <gv
      xnoremap >  >gv
      
  • 删除特定标志内的内容

    举例场景:需要删除双引号之间的内容。

    解决办法:使用di"就会删除光标最近的""内的内容

七,在工作流中使用Vim

​ 除了单独使用 Vim,还可以探讨:

  • 在终端中与其他工具配合(如 grep、awk)
  • 作为 IDE 的替代品或补充(借助插件)
  • 如何与 Git 等版本控制工具集成

八,Vim 的学习资源与社区

帮助初学者找到学习途径:

  • 推荐的 Vim 教程与文档(如 vimtutor、官方文档)
  • 在线学习资源与书籍推荐
  • Vim 社区与讨论平台(如 Reddit、Stack Overflow)
This post is licensed under CC BY 4.0 by the author.