##一个笑话

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

command-dot

除了这个命令,还推荐两个很不错的命令

:%normal A;,这个命令和上述的作用一样,却比上面简单,也很好理解,就是每一行都执行A;

:%normal i//,这个命令的意思是每一行的开头都加上//,这个用来添加代码注释很有用

##重复执行上一个命令

很简单,只需要在普通模式输入@:就可以了。

##tab自动完成

在输入命令时我们可以使用tab键来自动完成输入,如果你多个候选,可以使用<C-d>来列出,非常方便。

<C-n><C-p>可以回滚上个命令或者是下一个命令。

同样的,我们可以使用上下箭头来查看历史命令。在普通模式下输入q:可以列出用过的命令。

##运行shell命令

在命令模式可以运行shell命令,例如想看文件的目录有那些文件,可以使用:!sh,还有著名的%!xxd,可以把文件转为HEX。