VI是Linux/Unix下标配的一个纯字符界面的文本编辑器。由于不支持鼠标功能,也没有图形界面,相关的操作都要通过键盘指令来完成,需要记忆大量命令。因此很多人不大喜欢它,但同时由于键盘的方式往往比鼠标来得快,一旦熟练后用起来是有种非常流畅的感觉的,也有人因此而非常喜欢它。

不管你喜欢也好,不喜欢也好,VI是Linux的标配编辑器,很多时候你也只有这一个编辑器可用,如果要做一个Linux Coder,熟悉VI还是非常有必要的。

PS:由于VI的命令非常多,本文主要只介绍一些基础命令。并且就算是这些基础命令中,也有许多是不大常用的,我就把这些命令以灰色文字显示了,初学者可以不用太关注这些灰色命令。

两种工作模式

前面已经说过,由于VI没有图形界面,如翻页、移动光标、保存、退出等操作都必须借助键盘来完成。另外,VI还提供了大量快捷键来加速操作,因此,VI统的编辑模式下,还引入了一种新的工作模式——命令模式。

编辑模式: 在此模式下,输入可见字符时和传统Windows环境下输入字符的功能相同。按Esc键可切换值命令模式。
命令模式: 在此模式下,输入的可见字符对应的是命令。当插入命令执行后进入编辑模式。

PS:有的文章中还列举了一种Last Line模式,这个可以算作一种特殊的命令模式,只不过命令会显示在最后一行,并且需要敲回车才能执行。这些命令通常以 :/?$ 等特殊字符开头。

模式查询:要判断当前处于那种模式,可以通过最后一行(状态栏)来判断:如果处于编辑模式,则显示为如下两种状态。

模式间的切换:在编辑模式下,通过Esc键可以进入命令模式;命令模式下,执行某些插入命令后进入编辑模式。如果你不知道当前处于那种模式下,按ESC进入命令模式,按Insert进入编辑模式。

启动VI

VI的启动参数有不少,但通常的使用方式如下:vi filename

如果参数中的文件存在,则打开该文件,如果参数中的文件不存在,则会新建该文件(不是立即创建,而是在保存的时候创建)。

插入文本

刚进入VI时,是出于命令模式的,这是是无法输入文本的,因此需要进入插入模式。进入插入模式的命令有如下几个:

i    从目前光标所在之处插入文字
a 从目前光标所在下一个字符插入文字
o 往下插入一个空行
O 往上插入一个空行

输入这几个命令后,就进入了编辑模式,可以通过屏幕下方最后一行看到当前为插入状态:

可以通过Insert键切换插入状态和改写状态(和图像界面中一样)。

另外,在命令模式下,也可以通过Insert键进入编辑模式(插入状态),不过通常还是前面介绍的四个命令来进入编辑模式。

离开和保存文件

在VI中,离开和保存文件对应的命令有这几个(使用前记得进入命令模式):

:w            保存
:w filename 另存为
:wq 保存并退出 [常用]
:q! 强制退出
SHIFT+zz 保存并退出,功能同:wq [常用]

移动光标

在VI中,移动光标并不是我们游戏中常用的WASD,而是h、j、k、l,分别控制光标左、下、上、右移一格,分别分布在右手四个指头,新手需要一段时间来适应。使用非常频繁,需要熟练掌握。

其它一些光标控制命令如下:

Ctrl+B:屏幕往后移动一页。
Ctrl+F:屏幕往前移动一页。
Ctrl+U:屏幕往后移动半页。
Ctrl+D:屏幕往前移动半页。
gg:移动文章的开头。
G:移动到文章的最后。
w:光标跳到下个word的开头。
e:光标跳到下个word的字尾。
b:光标回到上个word的开头。
$:移到光标所在行的行尾。
^:移到该行第一个非空白的字符。
0:移到该行的开头位置。
#:移到该行的第#个位置,例:51、121。

另外,还有几个行操作相关命令集中介绍一下

:set nu        显示行号
:set nonu 隐藏行号
:# 移动到第#行,如:15
Ctrl+G: 在状态栏显示当前进度
#G: 移动到第#行,例:15G

删除文字

x:删除光标所在位置的后面一个字符。
#x:例如,6x 表删除光标所在位置的后面6个字符。
X:大字的X,每按一次删除光标所在位置的前面一个字符。
#X:例如,20X 表删除光标所在位置的前面20个字符。
dd:删除光标所在行。
#dd:例如,6dd表删除从光标所在的该行往下数6行之文字。

复制粘贴

我个人并不是很习惯VI提供的复制粘贴,由于没有高亮选中,用起来感觉不是很方便。平时大都是用的终端工具的复制粘贴功能,因此这里的命令我都加灰了,感兴趣的可以看看。

yw:将光标所在处到字尾的字符复制到缓冲区中。
p:将缓冲区内的字符粘贴到光标所在位置(指令'yw'与'p必须搭配使用)。
yy:复制光标所在行。[超常用]
p:复制单行到您想粘贴之处。(指令'yy'与'p'必须搭配使用)
#yy:如:6yy表示拷贝从光标所在的该行往下数6行之文字。[常用]
p: 复制多行到您想粘贴之处。(指令'#yy'与'p'必须搭配使用)
ayy:将复制行放入buffer a, vi提供buffer功能,可将常用的数据存在buffer
ap:将放在buffer a的数据粘贴。
b3yy:将三行数据存入buffer b。
b3p:将存在buffer b的资料粘贴

撤销和重做

撤销和重做在任何编辑器里都是非常有用的命令:

u:假如您误操作一个指令,可以马上按u,回复到上一个操作。
.: 重复执行上一次的指令

查找和替换

查找和替换的语法笔记复杂,先简单的介绍一下查找的语法:

/pattern<Enter> :向下查找pattern匹配字符串
?pattern<Enter> :向上查找pattern匹配字符串

使用了查找命令之后,使用如下两个键快速查找:

n:按照同一方向继续查找
N:按照反方向查找

至于替换的语法,限于篇幅所限,这里就不介绍了,给一个链接供大家参考一下:http://blog.csdn.net/lanxinju/article/details/5731843

VI对编程的支持

VI对编程还是提供了一定的支持的。例如,它是支持括号配对、语法高亮显示的。

不过,由于并不支持语法解析功能,作为编码工具和专业的代码编辑器如SourceInsight、VisualStudio等比起来还是有很大差距的。个人感觉做小型项目和临时修改代码用还行,但做大型项目是有点力不从心的。

Linux高级编程--01.vi命令的更多相关文章

  1. 【视频】Linux高级程序设计01.3命令行选项及参数

    [课程笔记] [命令行参数] 选项:-l -a -i 参数:-l /home main 函数形式: int main(int argc, char *argv[]) main函数是有参数的,而且有返回 ...

  2. linux高级编程基础系列:线程间通信

    linux高级编程基础系列:线程间通信 转载:原文地址http://blog.163.com/jimking_2010/blog/static/1716015352013102510748824/ 线 ...

  3. linux高级编程补充知识

    F: 计算机系统结构: ------------------------------- 应用程序 ----------------- |  库函数 -------------------------- ...

  4. linux 修改文件内容 vi命令

    vi编辑器是所有Unix及Linux系统下标准的编辑器,介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它 ...

  5. linux或者shell进入vi命令

    vi的基本操作 a) 进入vi     在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi file  不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(comman ...

  6. Linux Shell 编程 教程 常用命令

    概述: Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户 ...

  7. Linux高级编程--02.gcc和动态库

    在Linux环境下,我们通常用gcc将C代码编译成可执行文件,如下就是一个简单的例子: 小实验:hello.c #include <stdlib.h> #include <stdio ...

  8. 【视频】 Linux高级程序设计01.2开发平台及Linux环境限制

    [课程笔记] Linux环境限制 遵循规范,使用现有资源,明确系统限制,增量开发. (1)规范问题 编码的规范,让程序更易读.Linux编码规范. “见着如意”:变量,函数命名等能够让人看到名称就知道 ...

  9. Linux高级编程--11.信号

    基本概念 信号在Linux中是一个比较常见的概念,例如我们按Ctrl+C中断前台进程,通过Kill命令结束进程都是通过信号实现的.下面就以Ctrl+C为例简单的说明信号的处理流程: 用户按下Ctrl- ...

随机推荐

  1. MUI设置卡头卡位的形式进行切换

    这是mui的官方帮助文档,一切问题都能在这里找到http://dev.dcloud.net.cn/mui/ui/解决方案. 下面是MUI官方对卡头卡尾的一些描述: 在mobile app开发过程中,经 ...

  2. 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息

    项目的Github地址:https://github.com/ggrcwxh/LastTime 采用基于git的多人协作开发模式 软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了 ...

  3. Java & hashCode作用

    首先,想要明白hashCode的作用,你必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set.你知道它们的区别吗?前者集合内的元素 ...

  4. 使用字符界面 qemu-kvm 创建虚拟机

    qemu-kvm的基本用法:指定系统类型,CPU运行模式,NUMA(Non Uniform Memory Access Architecture), 软驱设备,光驱设备,硬件设备   # 查看qemu ...

  5. js登录界面代码自用

    var btn = document.getElementById("a4"); var usne = document.getElementById("username ...

  6. PAT L1-015 跟奥巴马一起画方块

    https://pintia.cn/problem-sets/994805046380707840/problems/994805124398956544 美国总统奥巴马不仅呼吁所有人都学习编程,甚至 ...

  7. 这些天php面试的总结

    面试总结 记录一些本人在面试中遇到的觉得有些掌握不好的面试题,下面的答案都是本人回答的,如果哪里不对的话,希望各位能够指出. 1.Git fetch和git pull的区别 Git fetch相当于从 ...

  8. 【Linux学习笔记】Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)

    http://blog.csdn.net/slvher/article/details/8864996 https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm. ...

  9. css & text-overflow & ellipsis

    css & text-overflow & ellipsis https://developer.mozilla.org/en-US/docs/Web/CSS/text-overflo ...

  10. BZOJ 1924 所驼门王的宝藏(强连通分量缩点+DAG最长链)

    思路不是很难,因为宝藏只会在给出的n个点内有,于是只需要在这n个点里面连边,一个点如果能到达另一个点则连一条有向边, 这样用强连通分量缩点后答案就是DAG的最长链. 问题在于暴力建图是O(n^2)的, ...