Vim的基础使用

vim是一个基于vi开发的编程工具,它被设计为可移植的,最终,古老的vi在九十年代被更现代的vim取代,在任何现代的*nix发行版中你都可以见到vim(这包括OSX)。
在漫长的时间中,vim的灵活性造就了许许多多的预配置,这包括SpaceVim,NvChad,SonarLint,AstroNvim及LunarVim。值得注意的是,装载了不同预配置的vim与不同的vim版本是不同的。neovim在使用上与vim没有太大的区别,它只是重写了大量的冗余代码并且添加了更多现代的特性——这些变化使vim变得更灵活,其中vimscript被lua所取代,这成为了大量的nvim预配置开发的关键——不得不说,neovim更顺手一点。
本文使用LunarVim编撰,它是一个在neovim上运行的IDE层,由lua脚本提供支持。(它的开发者将它简称为lvim)

vim基础概念
vim和它的对手emacs有些不同,它很少使用快捷键,取而代之的是独特的CommondMode。
依照惯例,在首页按n进入命令行模式,按i进入插入模式,开始编撰你文件的内容。在ESC+:后,你会在屏幕下方看到一个小窗口,现在,按下w并输入你的文件的名字,然后wq保存它,你就完成了一篇文档的编写。
在之后的篇幅中,我们将简单地了解vim的使用(或者说,对于使用预配置方案vim的用户来说,插件的使用在你方案的官网的手册中都可以找到——更何况预配置的插件已经很好用了——而原生vim的插件管理策略令人头疼,对于vim自定义命令,只需要知道esc换成双击space或者jk即可)。
以及非常重要的一点,vim接受的输入不是直接监控键盘的硬件输入,而是通过系统所定义的IM,在英文环境下当然没有切换输入法的需要,但对于中文输入,vim的命令只支持英文,如果出现vim没有反应的情景,请检查你的输入法和自定义热键及命令。

写在最前面:关于w,q,!和三种模式。
w,write,写
q,quit,退出
!,强制的
在vim中,q!的意义为不保存并强制退出,wq的意义为写入并退出,wq!表示写入并强制退出,w后跟文件名,表示为文件命名。
vim具有三种模式,但在实际使用中通常只分为两种:InsertMode与CommondMode。(CommondMode与LastLineMode统称为CommondMode)
直接打开vim,你会看到几行经典的提示,我们按n进入CommondMode,再按i进入InsertMode,在使用ESC退后到CommondMode后输入:进入LastLineMode。(日常中,在终端中直接输入vim,后接文件路径即可)

A1,关于i,a,o。
命令行下,按i,从光标位置进入编辑,按a,从光标后一个字符开始进入编辑,按o,则从光标所在位置的下一行开始进入编辑。
A2,关于方向键。
原则上,vim在LastLineMode下使用hjkl来控制光标,但你也可以使用自带的方向键。
A3,关于A。
无论光标在何处,按A强制将输入位置移至行末。
A4,关于d。
d后跟w,则将光标后一个单词删除,d后跟e则忽略光标后空格,d后跟$将从光标处一直删除到行末,特别地,d[number]w将删除光标后[number]个单词。
(如果你想删除一整行文字,则可以在0后跟d$,它的作用是将光标移至行首,然后删除光标后内容直至行末,当然,你也可以使用作用相同的dd,删除当前行则dd,连续删除[number]行则[number]dd)
A5,关于u。
u是悔棋命令,u撤销上一步的操作,U则撤销整行的更改,ctrl+r会将上一步的撤销撤销。
A6,关于剪切操作。
vim有一个被称为寄存器的机制,你对文件的更改并不会即时写入磁盘,而是会滞留在缓存中,因而,使用d*命令后在当前光标处使用p则可以将内容移至光标后。
A7,关于r。
在光标后的字符将会在使用r命令后被替换为你输入的字符。
A8,关于g。
ctrl+g,输入gg则跳转至顶行,输入G则跳转至尾行,输入[number]+G则跳转至[number]行。

B1,关于查询命令。
/后输入查询字符串,按n查找下一个,按N查找上一个。当括号的某一边在光标处时,按%将会找到括号的另一半。
B2,关于s-g。
对于光标所在行,s/[old]/[new]/g将会将[old]替换为[new]。特别地,在该命令前加入代表特定行行数的字符,它将会将特定行数行之内的[old]替换为[new],语法为[number1],[number2]s/[old]/[new]/g。当需要对全文进行替换操作时,有两种情形,也即需要确认是否替换每个匹配项和直接全部替换,对于前者,%s/[old]/[new]/g,对于后者,%s/[old]/[new]/gc。

C,关于分屏。
sp后跟文件名将会将你的vim分为上下两个部分,第二个屏幕将显示你刚刚打开的新文件,类似地,vsp将会将你的vim分为左右两部分。
sview是特别的,它将以只读模式打开文件。
以及,vim的分屏有着直接从terminal开始的命令,格式为vim -O/o [number] <files1><files2>...<files number>,大写O将会左右分开你的屏幕,而小写o则上下分开。
光标所停留界面的分屏长宽可以使用ctrl+w>/<[number]来调整,>加宽<缩减+增高-变矮,[number]缺省为1。在ctrl+w后跟方向键可以切换分屏,对于互换分屏位置,使用ctrl+w+r,将r替换为c则可以关闭窗口,对于其他的参数,q会在只有一个分屏存在时关闭vim。
对于分屏时的其他命令,only只会保留当前分屏,hide则会关闭当前分屏,res[number]会指定当前高度为[number]。
##vim的高度与宽度使用字高与字宽衡量,在不同环境上是不统一的。
某些git插件会利用这一机制可视化你对文件的更改,对于这些需求,建议你使用更现代的工具,例如vsc和sublime。

D,关于vimdiff和vimtutor。
diff是一份说明书,它将教会你vim的简单使用,vimtutor是一份教程,它将在你动过很多次手之后矫正你的不良习惯。(而且它们都是内置的)
关于vimscript的学习,你可以在官网找到文档,但我仍建议你使用现代化的lua,vimscript简直是一片稀烂。
(我觉得vsc真的比vim好用多了