13-3 vi编辑模式和移动光标
四、编辑模式(准)
0.创建新文件
(1)传递1个不存在的文件名
再次启动 vi,并向其传递一个不存在的文件名,就可以通过 vi 创建新文件。
rm -f foo.txt
# 删除foo.txt文件
vi foo.txt
正常情况下,屏幕显示如下图所示。
vi-创建新文件.png
每行开头的波浪线代表此行没有任何内容,也就是说此时的 foo.txt 文件是一个空白文件。
(2)不要轻举妄动
① 命令模式
知道如何退出 vi 之后,接下来需要了解的就是 vi 是一个模态编辑器。 vi 启动后进入的是命令模式。 在命令模式中,几乎键盘上的每一个按键都代表一条命令,所以在这时对 vi 进行普通输入的话,vi 基本上就要崩溃,会把文件弄得一团糟。
1.进入插入模式(准)
(1)按 I 键进入
若用户需要向文件中添加一些内容,那么首先要做的就是按 I 键(或 i )进入插入模式。 若此时 vim 是在增强模式下正常运行,那么会在屏幕底部出现以下内容; 若 vim 是以兼容模式运行,则不会出现。
vi-按i进入插入模式.png
现在用户就可以进行插入操作了,例如:
vi-插入操作.png
(2)Esc退出插入模式
最后按 Esc 键退出插入模式并返回命令模式。
2.保存工作(准)
要保存用户修改过的文件,在命令模式下输入一条 ex 命令,也就是按“ : ”键。 这样之后,一个冒号会出现在屏幕的底部。
:
(1)写入硬盘
① 语法格式
要将文件写入硬盘,在冒号之后输入 w。
:w
② 确认信息
文件写入硬盘驱动器之后,用户会在屏幕底部得到一条确认信息。
vi保存到硬盘后的确认信息.png
3.注意
若用户阅读 vim 的说明文档,会发现命令模式被称为普通模式,而使用 ex 命令则被称为命令模式。 这方面要多加留意。
五、移动光标(准)
在命令模式下,vi 提供了很多移动光标命令,其中有一些命令是与 less 命令共用的。
光标移动功能键
键 |
光标动作 |
---|---|
L 或 右方向键 |
右移 1 位。 |
H 或 左方向键 |
左移 1 位。 |
J 或 下方向键 |
下移 1 行 |
K 或 上方向键 |
上移 1 行。 |
数字 0 |
至本行开头。 |
Shift-6(^) |
至本行第 1 个非空字符。 |
Shift-4($) |
至本行的末尾。 |
W |
至下 1 单词 或 标点的开头。 |
Shift-W(W) |
至下 1 单词的开头(忽略标点)。 |
B |
至上 1 单词 或 标点的开头。 |
Shift-B(B) |
至上 1 单词的开头(忽略标点)。 |
Ctrl-F 或 Page Down |
下翻 1 页。 |
Ctrl-B 或 Page Up |
上翻 1 页。 |
number-Shift-G |
至第 number 行(如 1G 会将光标移到文件的第 1 行)。 |
Shift-G(G) |
至文件的最后一行。 |
1.为何使用H、J、K、L
为什么使用 H、J、K、L 键来移动光标呢? 这是因为在 vi 最初出现的阶段,并不是所有的视频终端都有方向键,这样的设计使得 vi 高手可以手不离键盘地移动光标。
(1)命令前缀数字
像上表中的 G 命令一样,许多 vi 的命令的前面都可以缀上数字。 前缀数字可以控制命令执行的次数,比如 5J 可以使得光标下移 5 行。
- 常见Web源码泄露总结
- 浅析Entity Framework Core2.0的日志记录与动态查询条件
- ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
- 【weakfilescan】敏感文件扫描工具
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
- ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
- CVE-2017-11882漏洞复现
- ASP.NET Core使用静态文件、目录游览与MIME类型管理
- Python 黑客——使用Python破解门禁系统
- ASP.NET Core文件上传与下载(多种上传方式)
- 采用Opserver来监控你的ASP.NET项目系列(三、监控你的服务器状态)
- eclipse中运行hbase时不能显示表中的值
- 从 PHP 到 Java
- 用Lua定制Redis命令
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 网站日志实时分析之Flink处理实时热门和PVUV统计
- 大数据量下的集合过滤—Bloom Filter
- 实时数仓链路分享:kafka =>SparkStreaming=>kudu集成kerberos
- rocketmq broker启动报错,找不到或无法加载主类
- 视频监控联网RTSP平台EasyNVR用户管理权限与实际权限不匹配,该如何排查?
- 2020CHINC,来赴一场“共建智慧医院”的约会
- 《闲扯Redis十》Redis 跳跃表的结构实现
- 图数据库HugeGraph源码解读 (1) —— 入门介绍
- String及StringTable(一):String源码解读
- 四、原型模式与建造者模式详解
- LeetCode 23. 移动零
- LeetCode 11. 盛最多水的容器
- 29.MyBatis体系结构与工作原理
- 五、代理模式详解
- 六、门面模式与装饰器模式详解