写给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 的关系
功能 Vi Vim 基本编辑功能 支持基础的文本编辑 完全兼容 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 的设计思想鼓励用户在不同模式之间快速切换,以实现高效编辑。例如:
- 从 正常模式 用 i 进入 插入模式,完成输入后按 Esc 返回正常模式。(这里我更喜欢使用Ctrl+C)
- 在 可视模式 中选中文本后,直接按 d 删除,或按 y 复制,再用 p 粘贴。
对于我而言,日常使用主要集中在正常模式,插入模式,最近逐渐学习使用可视化模式复制文版,命令行模式替换字符。
四,Vim的基础操作
文件操作:打开、保存、关闭文件
打开文件
在终端中,我们可以使用
Vim <file_name>
打开文件并进入正常模式,这也是我目前使用最多的办法。 除了上述在终端操作的办法,我们打开
Vim
后,在命令行中输入:ls
就能浏览当前缓冲区(已打开)的内容,使用:e <file_name>
来创建或者打开文件,这个命令还可以打开并将光标跳转到指定文件的指定行:e <file_name> <line_number>
。如果你在Vim
中打开了多个文件,可以使用:b <file_name>
进行切换。这样的操作对我来说有点繁琐,所以我更愿意使用:Ex
命令(Explore)打开目录浏览器进行操作,该页面下:cd <path>
可以切换路径,\n
可以选中文件,R
可以修改文件名称,-
可以回到上级目录。q
退出。保存、关闭文件
在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+u
或Ctrl+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
是粘贴,粘贴复制的内容。 这里还有个寄存器的概念,
d
,y
的内容会存到寄存器中,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的常用技巧(组合操作)
多行行首插入
举例场景:需要多行添加注释时候。
解决办法:
进入可视化页面选择行,再使用
I
向行首插入。使用替换实现,例如向2到4行插入{word}就可以使用
2,4s/^/{word}/g
。
全文代码格式化
举例场景:需要代码格式化。
解决办法:
ggvG=
选中全文进行代码格式化。文本格式化
举例场景:文本宽度过长,阅读不方便。
解决办法:使用
gq
命令格式化,全文格式化可以按下gggqG
完成。注意该命令不适用于代码格式化。重复上一台命令
举例场景:需要查找上一条替换命令,或者重新执行以前的命令。
解决办法:
- 按下
:
进入命令行模式之后,可以使用Ctrl+p
或Ctrl+n
检索 上/下 一条命令。 - 按下
:
进入命令行模式之后,可以使用方向键检索 上/下 一条命令。
- 按下
快速移动当前行
举例场景:代码中需要整行移动。
解决办法:
在命令行中使用
move +1
或move -1-
实现整行移动。在.vimrc中配置,再使用
[e
或]e
就可以实现整行移动。1 2
nnoremap [e :<c-u>execute 'move -1-'. v:count1<cr> nnoremap ]e :<c-u>execute 'move +'. v:count1<cr>
调整单/多行缩进
举例场景:代码中需要调整缩进的地方。
解决办法:
按
v
进入选择模式,选中行,使用>
或<
就可以快速调整缩进,但是不能连续调整,在vimrc中做如下配置:1 2
xnoremap < <gv xnoremap > >gv
删除特定标志内的内容
举例场景:需要删除双引号之间的内容。
解决办法:使用
di"
就会删除光标最近的""
内的内容
七,在工作流中使用Vim
除了单独使用 Vim,还可以探讨:
- 在终端中与其他工具配合(如 grep、awk)
- 作为 IDE 的替代品或补充(借助插件)
- 如何与 Git 等版本控制工具集成
八,Vim 的学习资源与社区
帮助初学者找到学习途径:
- 推荐的 Vim 教程与文档(如 vimtutor、官方文档)
- 在线学习资源与书籍推荐
- Vim 社区与讨论平台(如 Reddit、Stack Overflow)