##一个笑话
有人说,想快速生成一串无序字符串,就让新手来关闭vim吧,-_-!!!。
的确,在一开始接触vim的时候我也不会关闭,只是简单地按叉叉了事,可是第二次打开该文本,却有提示,很是不爽。一切都只能怪自己无知了。
那么究竟如何才是正确的关闭vim呢?这个问题涉及到这篇文章要讨论的vim另一个经常要用到的模式–命令行模式。进命令行模式的方法是在普通模式下按:,没错,是冒号。你会看到光标跳到最下面,这就对了。
除了按冒号,还记得之前的用vim做计算机吗?在编辑模式按<C-r>=,还有就是普通模式按下/也算是特殊的命令行模式了,这个主要用来搜索文本用的。
在冒号下的命令行模式我们可以做什么吗?答案是我们可以做很多事情,你会发现这又是vim强大的另一个原因。现在我们看看下面这个表
| 命令 | 效果 |
|---|---|
| :[range]delete [x] | 删除指定的行 [放到寄存器x中] |
| :[range]yank [x] | 复制指定的行 [放到寄存器x中] |
| :[line]put [x] | 把寄存器x的内容放到指定的行后面 |
| :[range]copy {address} | 复制特定行到指定的地址 |
| :[range]move {address} | 移动特定的行到指定的地址后 |
| :[range]join | 合并特定的行 |
| :[range]normal {commands} | 在特定的行运行命令 |
| :[range]substitute/{pattern}/{string}/[flags] | 把指定行的pattern替换为string |
| :[range]global/{pattern}/[cmd] | 匹配pattern的行运行命令 |
可能你会有疑问,range是什么,address是什么? 好,让我们来看看。
range and address
range是范围的意思,在这里的范围,可以是一行,例如12,可以是连续几行,例如12,18表示12到18行(中间用逗号隔开),也可以是.即当前行,又或者$最后行,具体可看表格。
| 符号 | 含义 |
|---|---|
| 1 | 文件的一行 |
| $ | 文件最后一行 |
| 0 | 文件第0行(虚拟的) |
| . | 当前光标行 |
| ’m | 标记为m的行 |
| ‘< | 选择模式的开始 |
| ‘> | 选择模式的结束 |
| % | 整个文件(相当于:1,$) |
##使用:t和:m命令来复制和移动文本
:t相当于:copy,我们可是使用这个命令来复制。例如下面的文本
:::java
Shopping list
Hardware Store
Buy new hammer
Beauty Parlor
Buy nail polish remover
Buy nails
我们想把第六行复制到第二行下面,我们就使用这个命令:6t.。还有其他的例子如下
| 命令 | 效果 |
|---|---|
| :6t. | 复制第6行到光标的下一行 |
| :t6 | 复制当前行到第6行的下一行 |
| :t. | 复制当前行,相当于yyp |
| :t$ | 复制当前行到最后 |
| :’<,’>t0 | 复制选中行到最前 |
:m的使用类似
##运行普通模式的命令
如果想在命令行模式运行普通模式的命令,可以简单的使用:normal。
还记得我们使用.命令来在代码最后加分号吗?我们可以使用命令模式来批量操作,而不是一行一行的按. 。下面让我们来演示一下。
:::java
A;<Esc>
jVG
:normal .

除了这个命令,还推荐两个很不错的命令
:%normal A;,这个命令和上述的作用一样,却比上面简单,也很好理解,就是每一行都执行A;
:%normal i//,这个命令的意思是每一行的开头都加上//,这个用来添加代码注释很有用
##重复执行上一个命令
很简单,只需要在普通模式输入@:就可以了。
##tab自动完成
在输入命令时我们可以使用tab键来自动完成输入,如果你多个候选,可以使用<C-d>来列出,非常方便。
<C-n>和<C-p>可以回滚上个命令或者是下一个命令。
同样的,我们可以使用上下箭头来查看历史命令。在普通模式下输入q:可以列出用过的命令。
##运行shell命令
在命令模式可以运行shell命令,例如想看文件的目录有那些文件,可以使用:!sh,还有著名的%!xxd,可以把文件转为HEX。