normal模式下的命令行模式
在vim中除了normal模式能进入命令行模式,也可以在visual模式下进入。两者有所不同visual模式下进入会自动识别范围
normal模式进入命令行模式
: 单次进入命令行模式,此时光标会在窗口下方的边缘的上面(也就是状态栏的下面),执行一次命令自动退会normal模式
Q 进入命令行模式,可以一直执行命令,直到打visual
指令会退出命令行模式
操作文件命令
接下来规定一下命令描述格式,方括号[]
代表可以省略,花括号{}
代表参数必须出现,省略号...
表示重复前面的参数
命令名字前的:
表示进入命令行模式,使用这种格式说好听点就是和官方手册对接,说不好听点就是本人技术比较差需要参考手册
:w[rite] [++opt] 保存当前文件缓冲区
:w[rite]! [++opt] 强制保存当前文件缓冲区
:w[rite] [++opt] {file} 将当前缓冲区保存到{file}文件
:w[rite]! [++opt] {file} 将当前缓冲区强制保存到{file}文件
:[range]w[rite] [++opt] {file} 将[range]范围内的内容保存到{file}文件
:[range]w[rite]! [++opt] {file} 将[range]范围内的内容强制保存到{file}文件
:r[ead] [++opt] [name] 将文件[name]中的所有内容复制到当前光标下,不指定[name]默认为本文件
:{range}r[ead] [++opt] [name] 将文件[name]中的{range}范围内的文本复制到当前光标下,不指定[name]默认为本文件
:{range}r[ead] [++opt] !{cmd} 执行一条shell指令将指令的结果复制到当前光标下
:edit 编辑当前文件。当文件在 Vim 之外被修改时,此命令可用于重新编辑当前文件。执行此命令必须当前文件已经保存了
:ar[gs] 显示文件参数列表,当前文件用方括号括起。
:ar[gs] [++opt] [+cmd] {arglist} 将 {arglist} 定义为新的参数列表并编辑其中的第一个文件。丢弃当前缓冲区的所有修改。
看起来非常乱,但是实际上[++opt]和[+cmd]选项比较少用大多数可以省略。以后再讲这两个选项。比如:
<cr>
表示回车
:w<cr> 保存当前文件
:w test<cr> 将当前缓冲区保存到test文件中
:e test<cr> 编辑test文件
范围range
其中的[range]和{range}是指一个范围,范围的制定有以下这几种方式:
{number} 第{number}行
. 当前行
$ 最后一行
% 整个缓冲区
't 标记t的那一行
/{pattern}/ 向下搜索到{pattern}的那一行
?{pattern}? 向上搜索到{pattern}的那一行
/ 向下搜索到上一次搜索的内容的那一行
? 向上搜索到上一次搜索的内容的那一行
例子:
15,$w test<cr> 从15行到最后一行保存到test文件中
%w test<cr> 和w test<cr>一样
?test?,/node/w test<cr> 将向上搜索到test的那行,到向下搜索到node那行写入到test文件中
.,$w test<cr> 或者缩写为,$w test<cr>将当前行到最后一行保存到test中
文本操作指令
:[range]y[ank] [x] 将范围[range]中的文本复制到x寄存器中,[range]默认为当前行,x默认为0
:[range]d[elete] [x] 将范围[range]中的文本剪切到x寄存器中,[range]默认为当前行,x默认为"
:[range]co[py] {address} 将[range]中的文本复制到{address}行下
:[range]m[ove] {address} 将[range]中的文本移动到{address}行下
这些命令比较简单就不做例子了,接下来看比较重要的:
:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
将[range]范围内的搜索到的{pattern}替换成{string},没有指定[range]默认为本行,如果指定[count]但是没指定[range]默认从本行向下替换[count]行
如果指定[count]并且[range]也指定了,是从[range]从最后一行向下替换[count]行
其中[flags]可以指定:
& 和上次的选项一样
c 询问确认每一个替换
g 替换所有(如果不指定此选项默认一行只替换一个)
i 关闭大小写敏感
I 开启大小写敏感
n 不做真正的替换,显示一共搜索到多少个符合{pattern}的字符串例子:
:%s/\v(foo|bar)/test/g 此文件所有foo和bar替换成test
:3,$s/(foo)//g 将3到最后一行的(foo)删除掉,注意这里没有开启very magic模式所以()没有特殊意义
:%s/\v\a+//gn 显示此文件有多少个单词
:s/\v\d+//gn 显示当前行有多少数字
:s/\v(foo|bar)/\1ar/g 将此行出现的foo和bar后面加上ar高级用法:
在{string}中如果开头写\=此时就不是简单的替换文本功能了,\=后面写的会被当作vimscript语句执行,返回值被替换出来,返回值必须是string,数字会自动
转化为string,你可以用submatch()函数获取捕获组的内容例如:
:%s/\v(foo|bar)/\={"foo":"bar","bar":"foo"}[submatch(1)]/g
此命令用于将文件中所有的foo和bar互换,原理是用{"foo":"bar","bar":"foo"}创建一个字典,每一个key对应要替换的内容value,然后用[submatch(0)]
索引字典的key中的value
:s/\v<test>/\=toupper(submatch(0))/g
将此行test单词全部大写,<是单词开头,>是单词末尾,详细请看教程3。toupper是vim内置函数用来将字符串中出现的字母变为大写
对于{pattern}请看教学3
:[range]g[lobal]/{pattern}/[cmd]
将[range]范围内搜索到{pattern}的行执行一条[cmd]指令,[range]默认为全文件,[cmd]默认为print指令例如:
:g/foo/d 将整个文件匹配到foo的行删除
:g/bar/y A 将整个文件匹配到bar的行累加复制到A寄存器
有关寄存器的操作请看教学2