##一个笑话
有人说,想快速生成一串无序字符串,就让新手来关闭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。