VI高级用法
前面我们已经学习了vi的基本用法,现在我们将要更进一步,学习更多和vi相关的内容。
VI编辑器
只读选项
在打开某些配置文件的时候,为了安全起见应该避免修改源文件,这时候vi编辑器就提供了只读启动选项。
-R
作为vi的选项,使一个文件只读并允许用户逐行查看内容并且不会意外修改文件。
编辑多文档
在大部分情况,我们并不止打开一个文件,而是需要打开一系列文件,vi自然也提供了多文档编辑的能力,可以不退出vi而继续编辑下一个文件。
其原理来自vi的缓冲区功能。vi内部每个buffer打开一个文件,多个buffer也可以同时打开一个文件。相对应的一个tab对应了一个buffer,每个buffer可以由不同的buffer相对应。
在vi外部的话,可以一次打开多个文件,如
vi a.txt b.txt c.txt
使用:next(:n)
编辑下一个文件。:2n
编辑下2个文件。
使用:previous
或:N
编辑上一个文件。
使用:args
或:ar
显示文件列表。
如果打开了vi的话:
首先:tabnew
创建一个标签
然后:e
+文件名打开一个文件:tabnext
在窗口上打开下一个tab:tabprevious
在窗口上打开前一个tab:q
或者:tabclose
关闭tab
vi/vim的定制
vi最大的优点就在于可定制化,基于你的习惯可以最大限度强化vi/vim的功能,有个vi/vim的配置网上有很多人晒出自己的配置,就不在这里叙述了。
文字重排
相关内容在三中已经总结过了,这里就跳过,如果有不明白的话就请看3中对于剪切、复制、粘贴等操作的总结。
vi操作符的域
在先前的学习中,其实就出现了有关操作域的应用。使用vi命令结合域控制键能让用户在进行编辑工作时具有更多的控制能力。这类命令格式为:
命令=操作符+域
以下是常用的域控制键:
域 | 功能 |
---|---|
$ | 标识域从光标所在位置到行的行尾 |
0 | 标识域从光标前一个位置到该行所在行首 |
e或w | 标识域从光标所在位置到光标所在单词的末尾 |
b | 标识域从光标前一个字母到光标所在单词的开始 |
寄存器
vim中设计了特别的暂存机制——寄存器,用于保存拷贝和删除的文本。例如当用户键入dd命令时,vi将删除行放入缓冲区1,再次使用dd时,vi将缓冲区1中内容后移到缓冲区2,以此类推。
其中,有名寄存器a-z,一共26个,供用户使用
- 编号寄存器0-9,10个,vim自己使用,存放删除和拷贝的文本
- “0号寄存器是visual模式下拷贝的问题
- “1-“9号寄存器是dd删除、yy拷贝的行文本
类似的,默认寄存器有:
- % 当前窗口对应的文件名
- # 当前窗口的其它文件名
- : 命令行模式最近输入的命令
- . 最近插入的文本
- “ 最近删除或拷贝的文本
在命令模式下以”双引号开头引用这些寄存器。比如想要使用2号寄存器中的内容,只需要输入”2p。
指定缓冲区的格式可以总结为
"+指定寄存器+命令
命令行模式下,:reg显示寄存器。
寄存器加操作符作用域
刚刚所学的寄存器和操作符作用域是可以结合起来使用的:
寄存器+[range]+d/y+[motion]组合,完成拷贝/删除动作到寄存器,例如
“wdd 删除当前行到”w寄存器
“z7yy 拷贝从当前光标开始算,一共7行,到”z寄存器
光标定位
首先我们能够知道当前行在文本的百分之多少,在命令状态想按[Ctrl-g]可以查看当前行号。
然后是快速定位到文件的特定行:
- :n定位到文件的第n行
- :0或:1定位到第1行的行首
- :$定位到最后一行
- 1G定位到第1行的行首
- G或0G定位到最后一行的行首
- nG定位到第n行的行首
运行shell命令
跟多文档编辑类似的,我们希望能够不离开vi直接查看shell命令的运行结果。这也是可以实现的。
- :shell命令切换到shell,exit回到vim
- :!命令,执行shell命令
- :r!命令,将shell命令输出粘贴到当前位置
搜索
vi中的搜索要结合正则表达式才能发挥强大的效果,在这里先提前学习一下。
/something: 在光标后面的文本中查找something
?something: 在光标前面的文本中查找something
n: 向后查找下一个。
N: 向前查找下一个。