先说下,vim 的学习经历是曲折的,但一旦上手后就会觉得用起来很爽,我从三年前开始接触linux ,使用vim 起,到现在也才掌握着vim 常用命令,只要用熟了就能用的得心应手!
先说下vim 的三种工作模式:
- 命令模式
- 文本模式
- 末尾模式
从命令模式进入到为文本模式有8个命令:a/A,i/I,o/O,s/S ,看下这几个命令有什么区别:
命令 | 说明 |
a | 在当前光标后进行编辑 |
A | 将光标定位在行尾进行编辑 |
i | 在光标处进行编辑 |
I | 将光标定位在行首进行编辑 |
o | 在光标所在行向下插入一行进行编辑 |
O | 在光标所在行向上插入一行进行编辑 |
s | 删除当前光标所在字符并进行编辑 |
S | 删除当前行内容,并将光标定位在行首进行编辑 |
除了以上表列出来的外,在命令行模式下还可按下 c + w ,即从光标所在位置删除至单词的尾部并且进入文本模式。
1.命令行模式常用命令:
光标移动命令:
最简单的莫过于上下左右移动光标了,可以使用小键盘的上下左右,但不推荐哦,请使用 上(k)、下(j)、左(h)、右(l)键 替代。
上面是字符级别的光标移动,还有单词级别的光标移动,比如:
- w :跳转到下一个单词首字母
- b :跳转到上一个单词首字母
- e :跳转到下一个单词尾部
ps:w、b、e这几个单词,小写和大小功能是一样的。
下面看下行级光标移动:
- 0(阿拉伯数字0) :光标移动到行首
- $ : 光标移动到行尾
- ^(shift + 6):光标移动到行首
段落级(翻屏)光标移动:
- {:上(本)个段落首部
- }:下(本)个段落尾部
屏幕级(不翻屏)光标移动:
- H : 当前屏幕首部
- L : 当前屏幕尾部
- M : 当前屏幕中间
- Ctrl-d : 向下翻半屏
- Ctrl-u : 向上翻半屏
- Ctrl-f : 向下翻一屏
- Ctrl-b : 向上翻一屏
文档级光标移动:
- gg : 定位到当前文档第一行
- G : 定位到当前文档尾部
- nG : 移动到第n行 (1G 第一行)
复制粘贴剪切删除命令:
删除:
- 删除当前光标字符:x
- 删除当前光标前的一个字符:X
- 删除一个单词:dw
- 删除当前光标至行尾的字符:D
- 删除当前行:dd
- 向后删除多行内容: n + dd (比如 5dd ,表示从当前光标开始删除5行)
上面说过0是把光标移动到行尾,$是把光标移动到行首。组合键 d0 是把光标前的字符给删除,d$ 是把当前光标 后的字符给删除。
ps: 在命令行模式下,敲入 u 可以撤销上一步操作,ctrl + r 组合键可以反撤销。
剪切:
在vim下 , dd 后并不会立马删除,而是会写入到缓冲区中,所以,在vim 下剪切是 删除dd(删除有多种命令,这里只拿dd来举栗) 后 再按下 粘贴p 。
操作示例:
这是操作前的内容状态:
然后按下6dd:
然后将光标移动到要剪切的位置,按下p(小写),即可在光标后一行剪切内容,完成操作。
按下P(大写),即可在光标前一行剪切内容。
上面操作演示了剪切操作,还体现了p和P命令的区别。
复制:
- 复制当前行的命令是:yy
- 复制多行的命令是: n + yy (包括光标当前行)
操作演示:
ps:这里按下的是小写p,p 是指paste ,粘贴的意思,小写p是指在光标后粘贴,大写P是指在光标前粘贴。
看到这里不知道你有没有个疑问?我要是操作不连续的内容怎么办?比如:我有这样的一个需求,复制第一整行和第二行部分内容,那我要怎么操作呢?
vim 还有一种工作模式,上面没有提到,那即是可视模式,在命令模式下按 v 键 即可进入。在可视模式下,即可选择连续的文本来进行操作。
在命令模式下,
按下 v 进入可视模式,并且进行文本选择
选中相应的文本后,按下y(复制),然后光标移动到20行(20G),按下p,即可完成复制。
ps: 是y ,而不是yy ,两者虽然都是复制,但行为却不一样的哦。y 可以复制连续的文本,而且yy不行,而且在可视模式下,p(小写) 的行为也是不一样的哦,在当前案例中并没有在第21行复制(在命令模式下,p操作是在当前光标所在行下面进行的粘贴),而是在第20行复制的。
其它删除剪切操作类似。
在命令模式下搜索
/string
向下搜索字符string ,此时在遍历时,N 是上一个,n 是下一个。
?string
向上搜索字符string ,此时在遍历时,N 是下一个,n 是上一个。
# 在关键字上按下 #
此时,我将光标移动到了 第 21 行 list 这个单词的 l 上
然后按下:# 键
然后即可按n / N 键进行遍历。
在命令模式下,按下 r 键 即可进行单字符的替换操作。
在命令模式下进行系统函数跳转:
有些时候我们在写 C/C++ 的时候,需要查看下系统函数,这时候我们在命令模式下,可以敲下 K ,即可进入函数帮助文档,但如果所查找函数又是系统提供的命令,那就需要提供准确的章节。
按下 K (大写) ,即可进入到函数详情
但会发现,根本不是我们想要的内容,我们要的是Linux Programmer's Manual 这一章节的内容啊。那要怎么才能进入到我们想要的页面呢?上面也说了,加上具体章节。 3 + K 即可。
然后就跳转到了我们想要看的内容页面,如果想返回按下q 即可退出。
这里在提下,如果需要缩进的话,可以按下: >> (两个大于号,向右缩进)和 << (两个小于号,向左缩进) 。
下面说下末行模式的一些操作
前面说了,从命令模式中按下: 即可进入到末行模式。
在末行模式下替换:
替换当前光标所在行所匹配内容:
模式: :s/替换的内容/要替换为的内容 (替换光标所在行第一个 )
在要替换为的内容后面加g 表示全局替换(当前行全局)。
:s/替换的内容/要替换为的内容 /g (替换光标所在行的全部目标)
上面的命令操作只是在当前光标所在行进行的替换操作。
也可以带上具体的行号来操作 :
我们把36到40行的man 来替换成手册
在末行模式下,输入:
:36,40s/man/手册/g
即可。
当然,如果你想全文档内进行替换,那么可以这样做
:%s/man/手册/g
%表示在所有行内。
有时候,我们需要像其它编辑器一样,需要分屏打开不同的文件(或相同的文件),那这个在vim 中怎么做呢?在vim 中可以末行模式下用sp (split 分割的意思) fileName 来实现。
水平分屏 ( sp ):
在末行模式下: sp fileName 即可。
我这里是 vim 在已经打开的文件下(man.txt) ,再进入末行模式,键入:sp 1.txt 就OK啦。
垂直分屏( vsp ):
v -- vertical 垂直
:vsp fileName
我这里是 vim 在已经打开的文件下(man.txt) ,再进入末行模式,键入:vsp 1.txt 就OK啦。
好了,分屏后,如何进行光标的切换呢? 在vim 下 ,按下 ctrl + w l两次 ,即可把光标从屏幕一侧切换到另一侧。
- 显示行号:set number (或者 set nu )
- 取消行号:set nonu
在vim 种还可以执行其它的命令的,具体使用方法:
:! cmdName
示例 :
在末行模式下,敲入:! ls -l
按下回车键:
然后按下回车键即可再次进入到vim .
当要保存的时候,可以按下:w ,wq 保存并退出,shift + z (两次,即大Z两次)即可保存并退出,wq all 报存所有的并退出vim。
退出可按:q ,强制退出:q! (q + !) 。
ps:如果你不小心在vim 下按了 ctrl + s (也就是常用的保存),那么linux会进入"假死" 状态,要结束这种状态,按下ctrl + q 即可退出这种状态!!
要从末行模式退出到命令模式,按下两次esc 即可!