Linux运维之vim基础使用
————————————————
“你未看此花时,此花与汝同归于寂;你来看此花时,则此花颜色一时明白起来。”
导言:在网上看了小甲鱼关于vim入门的系列视频后,我写了这片文章,主要内容包括:光标移动,进入与退出插入模式,删除命令,数字的用法,撤销和恢复命令,粘贴命令,替换命令,修改命令,文件信息,括号定位,搜索命令,替换命令,执行shell命令,文件另存为,合并文件,打开多文件。
多讲一下个人感受,vim命令是我们使用linux系统不得不去接触和了解的,熟练的使用vim的相关命令会让提升我们的编辑速度和质量,学习方法就是不断练习,形成肌肉记忆,和打太极是一个道理,不要去死记,融会贯通,自然运用才是最好的。
第一节:移动光标
h j k l 四个按键分别代表左、下、上、右。在此之前,你可能听说过 vim最具特色的功能就是支持多种模式,并允许你在这些模式间自由切换,以实现它的强大功能。那vim 有多少种模式呢?告诉你吧,vim 具有 6种基本模式和 5 种派生模式。(基本模式:普通模式、插入模式、可视模式、选择模式、命令行模式和 Ex 模式。派生模式:操作符等待模式、插入普通模式、插入可视模式、插入选择模式和替换模式)
在 Linux 的命令行通过vi文件名或vim 文件名 即可用 vim编辑器打开你的文件,打开文件后默认是进入了普通模式,我们可以用h、j、k、l 四个按键分别左、下、上、右地移动光标。
第二节:进入和退出插入模式
当光标抵达目标位置之后,敲一下 i 按键使得 vim 切换到插入模式(界面左下角显示 -- INSERT -- 字样),此时你可以自由的编辑文档了,就像你在 Windows 下使用记事本那样去编辑:
回到普通模式,仅需要敲一下键盘左上角的 Esc 按键即可(界面左下角的 -- INSERT -- 标志消失)。
并不只有敲击按键 i 才能进入插入模式,其实方法很多,比如:
注意:最后这个大 S 是清除所在行,而不是删除。清除的意思就是保留行,把内容清空,然后在行首进入插入模式。
一般退出 vim分两种:一种是保存修改并退出;另一种则是直接退出。
对于第一种(保存修改并退出),这里教大家两招:
(1) ZZ(两个大写字母Z,也就是Shift+z+z)
(2) :wq(这是一个组合命令,如果是 :w 表示保存,而 :q 表示退出)
对于第二种(直接退出)则要区分情况:
如果你打开文件只是看看,并不做任何改动,那么直接输入 :q 即可
如果对文件动过手脚,但不希望保存(放弃修改)而直接退出,则需要再后边加上一个感叹号 :q!。
第三节:删除命令,数字的用法,撤销和恢复命令
有一句话叫做:”对于真正的vim用户,插入模式根本不存在“。
在普通模式下,删除单一字符可以用 x 命令。跟在插入模式按下 Delete 键一样,x 命令是删除光标指定的字符。
删除更多字符可以使用 d 命令。
使用删除操作符 d 的删除命令的格式是
d motion
d 是 Delete(删除)的意思,motion 即指定要删除的对象,所以这个命令可以很灵活。
motion 其实是一些表示操作范围的指令,比如:
没错,使用上面这几个按键移动光标,比单纯多次点击 h、j、k、l 按键省心省力。与d命令结合:
熟能生巧的规律:d0、db、dh 这类往前删除字符的命令,它们是不会删除光标所指定的字符;而删除方向是往后的则相反(d$、dw、dl),会将当前字符也一并删除。
数字的奥义:即 3h 则是将光标向前移动 3 格,依此类推 3j 则是将光标向下移动三行,3w 则是将光标跳到三个单词后的开始位置,同样的,d3h 表示删除光标前的 3 个字符,d3j 表示删除光标所在行以及下面 3 行的所有字符,而 d3w 则表示向后删除当前光标到后面第三个单词前的所有字符。
撤销和恢复命令:其中小写的 u 表示撤销最后一次修改;而大写的 U 表示撤销对整行的修改。如果撤销后悔了,vim还是有办法!Ctrl + r 快捷键可以恢复撤销的内容,同时,要明白:这上面所有的“删除”操作并不是真的删除,它们事实上是存放在 vim的一个缓冲区(VIM 把它称之为寄存器)中,相当于 Windows 的剪切功能。
第四节:粘贴命令,替换命令,替换模式和修改命令
使用 p 命令可以将最后一次删除的内容粘贴到光标之后。(大写的 P 则是粘贴到光标之前)
dd+p 可以是一个小组合,其他删除命令加p也可以是组合。
这里需要注意的是:如果你需要粘贴的是整行为单位,那么 p 命令将在光标的下一行开始粘贴;如果你拷贝的是非整行的局部字符串,那么 p 命令将在光标后开始粘贴。
拷贝命令:其实我们用的最多的还是拷贝粘贴,vim用 y 命令实现拷贝。语法跟删除的 d 命令一样:y motion
其中的 motion 同样是用来表示操作范围的指令,即 yy 表示拷贝当前行,3yy 则表示拷贝 3 行;y$ 表示从光标所在的位置拷贝到行尾的所有字符;yG 则表示从光标所在行拷贝到文件末尾行的所有字符。
拷贝完成之后同样使用 p 命令进行粘贴,没什么好说的。
替换命令:vim还提供了一个简单的替换命令:r 命令。
r 用于替换光标所在的字符,做法是先将光标移动到需要替换的字符处,按一下 r 键,然后输入新的字符。注意,全程无需进入插入模式,也不会进入插入模式。
然后你可能猜到了,数字 + r 可能会产生一些物理反应。先输入数字再输入 r,最后输入新字符,说明从当前光标的位置开始,替换数字个新字符。
替换模式:对于需要替换多个字符,更好的方案是直接进入替换模式。按下大写的 R 键,屏幕左下角出现 -- REPLACE -- 字样,说明你已经处于替换模式。此时输入字符可以连续替换光标及其后边的内容。注意:退格键(Backspace)在替换模式中被解释为如果左边内容被替换过,则恢复到原来的样子;如果没有被替换过,则简单的向左移动。修改完毕后,按下 Esc 回到普通模式。
修改命令:修改命令我们使用 c 键来启动,格式是:c [number] motion
没错,motion 依然表示范围,[数字]依然拥有奥义,同样是可选的,加上数字表示重复执行多次 motion 范围。
比如 cw 是修改光标指定单词的内容(vim 的做法就是删除当前光标位置到下个单词前的所有字符,并进入插入模式);而 c2w 便是修改当前光标指定的单词以及下一个单词共计两个单词的内容。
修改==删除+进入插入模式,但不全等,因为光标定位有区别。
第五节:文件信息,跳转和定位括号
有时候,你可能需要知道当前的文件信息,比如文件名,文件状态,文件的总行数,以及光标所在的相对位置。快捷键 ctrl + g 可以解决你的需求。
在 VIM 有两种方式可以将光标跳转到指定的位置:
(1) 行号 + G
(2) :行号
比如将光标跳转到第 333 行的位置,你就输入数字 333,再输入大写字母 G 即可见证奇迹;或者输入冒号(:)进入命令行模式,再输入数字 333,最后回车,也可以跳转到目的地。
注意:如果单独输入 G 键(前边没有输入数字),那么光标是直接去到文件的最后一行;如果输入两个小写 g,即 gg,则将光标跳转到文件的第一行。
vim 有个按键可以帮你快速定位到另一半括号,就是 % 键。将光标移动到 (),[],{},中的任何一半括号上,按下 % 键,便可看到此时光标已经跳转到另外一半的括号上了。在调试代码程序时,这个快捷键可以帮你检查一些由于括号问题出现的错误。注意:别拿书名号什么的来开玩笑,% 无法识别它们,因为 vim 是为了编程而生的。
vim 可以使用尖括号(< 或 >)来控制缩进,我们常用的就是两个同方向的尖括号表示将光标所在的语句进行缩进和反缩进操作。很明显 >> 表示缩进,而 << 则表示反缩进。但是这样一次只能缩进一行,一行行来也挺麻烦,因此你想到了数字的奥义:先输入数字 2 在输入 >> 表示将光标所在行以及下一行共两行同时插入一个缩进。不过行数一多……到底要缩进多少行就成了一个问题……
这时,你可以按一下 v 进入可视模式(左下角出现 -- VISUAL -- 字样),然后通过 h、j、k、l 或 其他 motion 来移动你的光标,此时光标所到之处必被一道亮光所包围(表示被选中),选择好需要缩进的目标后,只需按一下 > 即可完成任务。
第六节:搜索命令和替换命令
在普通模式下按下斜杠(/)也是进入命令行模式,此时该字符和光标均出现在屏幕的底部,这跟冒号(:)一样。
紧挨着斜杠(/)的是搜索目标,比如 /love,说明你找的是 love 这个字符串在光标后边第一次出现的位置
那如果要找下一个目标怎么办?这时你只需按 n 键即可定位到下一个符合的目标(向下查找),而按 N 键则返回上一个(向上查找)。
注意:第一个搜索到的目标不是文件中的第一个目标,而是从你的光标所在处开始找到的那个目标。所以你如果想要搜索文件中第一个匹配的目标,你应该先 gg 将光标移动到文件头,然后再使用搜索命令。
在普通模式下按下问号(?)也是进入命令行模式,实现的也是搜索功能。不过这回它是反过来的,你可以认为它是斜杠(/)功能的“反面派”。
前边我们说过 /love 是从光标位置向后开始搜索 love 这个字符串,而 ?love则相反,是从光标位置向前开始搜索。
当搜索到了文件的末尾(/目标)或开头(?目标),页面下方面会显示“Search hit BOTTOM, continuing at TOP”或“Search hit TOP, continuing at BOTTOM”的字样。表示一轮搜索到文件尾/头了,搜索下一个就是从文件头/尾开始咯。
告诉你怎么取消高亮,输入冒号(:)进入命令行模式,然后输入 nohl 即可。
最后提个醒:在搜索命令中,、.、*、[、]、^、%、/、?、~ 和 $ 这 10 个字符有着特殊意义,所以在使用这些字符的时候要在前面加上一个反斜杠(\),比如你要搜索问号,则输入 /\?
替换命令:搜索在很多情况下都是为了替换。
通过搜索功能,我们将光标定位到目标位置,如果你确定这个目标是可恶的,需要被替换的,你可以输入 :s/old/new,这样即可将光标所在行的第一个 old 替换为 new;你如果输入的是 :s/old/new/g,则表示将光标所在行的所有 old 替换为 new。
但如果要替换整个文件的所有匹配字符串怎么办?总不能每一行来一下吧?只要你能想到的vim就有办法!输入 :%s/old/new/g表示替换整个文件中每个匹配的字符串。如果希望 vim 在每次替换前都咨询一下你可以,输入 :%s/old/new/gc
看到页面下方的 (y/n/a/q/l/^E/^Y) 了吗?这是 VIM 在咨询您的意见呢!
如果你只想替换第 5 行到第 13 行之间的所有 XX,可以使用 :5,13s/old/new/g 即可胜任你的要求:
我想你已经猜到了:5 表示开始替换的行号,13 表示结束替换的行号。
第七节:执行shell命令,文件另存为,合并文件和打开多文件
运行在命令行下的 vim,貌似不可能“最小化”,这就有诸多不方便的地方了。比如有时我需要知道某个路径下有哪些文件(我的程序需要调用它们),那我可能就需要先关闭,然后查看有哪些文件,最后重新打开 vim。这就显得有点折腾了,不符合 vim一直强调的高效作风!
解决办法是当你想知道根目录(/)下面有哪些目录和文件,可以在vim中输入 :!ls
然后敲一下回车即可显示根目录(/)下边有哪些目录和文件:
总之,在输入冒号(:)进入命令行模式,输入感叹号(!),在其后便可以加上 shell 命令。此后 vim将临时跳转回 shell,并执行命令。再次按下 Enter 键回到 vim。
文本另存为:一般的文本编辑工具都会有“另存为”的功能,用于将文件重新存放到一个新的文件中(旧文件保留不变)。vim也可以这么干,做法是输入 :w 新文件名
全文件另存为(文件拷贝):我用 vim打开的是 test 文件,然后我输入 :w test2该命令会以 test2 为文件名拷贝保存整个 test 文件。
局部另存为:vim 除了支持文件另存为之外,还支持另一种新技能:文件局部另存为。言下之意就是,vim可以将文件中的局部文本另存为一个新的文件。
这就需要你进入一种新的模式,叫:可视模式
在普通模式中按下 V 键即进入可视模式,进入后左下角显示 -- VISUAL --
此时光标的位置开始为选中状态,你可以通过任何移动或范围的按键来移动光标,光标所到之处皆为选中状态(h、j、k、l 移动光标,$ 去到行尾,0 去到行首……):
选好范围之后的操作就跟“文件另存为”一样了。
按下冒号(:)屏幕左下方出现 :'<,'>
现在请输入 w test2
表示新建一个 test2 文件,并将选中的内容单独存放进去。
这里有个问题,如果路径中已经存在 test2 文件,那么 VIM 会提醒你需要加感叹号(!)才能强制覆盖文件。即输入 w! test2
合并文件:便是在 VIM 打开的一个文件中读取并置入另一个文件。
命令很简单,只需要输入冒号(:)进入命令行模式,然后输入 r 文件名
即可将指定文件的内容读取并置入到光标的下一行中。
打开多文件:vim 还可以同时打开多个文件,并且允许你通过水平或垂直的方式并排它们。vim 使用 –o 或 –O 选项打开多个文件,其中 –o 表示垂直并排,例如 vim -o lesson4 lesson5 lesson6
-O 表示水平并排,例如 vim -O lesson4 lesson5 lesson6
打开后默认光标是落在第一个文件中的,此时之前学过的所有命令都可以上,不过仅限于第一个文件。那如何将焦点(光标)切换到另一个文件中呢?很简单,使用 ctrl + w + w 将光标切换到下一个文件;或者使用 ctrl + w + 方向(方向键或 h、j、k、l)。
退出单个文件的话可以使用原来的 q、q!、wq 或者 ZZ(shirt + z + z)。
同时关闭所有文件是只需在原来退出命令的后边加上小写 a,则表示退出动作是针对所有的(ALL):qa、qa!、wqa。
最后给一个打开多文件的效果图。(配上超大显示,再修改一下背景颜色和字体颜色,结果超赞哦!)
总结:vim命令的记忆和打代码是一个道理,明白了相关“语法”后,只有通过不断的练习才能融会贯通,同时,vim的常用命令也就那么几个,一些偏僻难记的命令和模式都可以先不用理会。最后,因为这篇文章中都是一些基础操作,命令也浅显易懂,所以截图比较少,但还是需要自己去实践的。(不能只看文章,有些搞不懂的问题亲自打一遍就明白了!!)
“在你观察之前有无限种可能发生,但真正观察时除真正所看之外,其他可能会无限坍塌。”
1
END
1