0.前言
自从我的学习linux笔记开始更新后,阅读量挺高,说明大家使用linux热情很高。在前边几篇博客中我未指明参考书籍,这里做下说明,将慢慢补充之前几篇的参考说明。
我的博客源于对以下书本学习中的笔记,大家如果有兴趣可以在网上购买学习。
《Linux命令行大全》 [美] William E. Shotts. Jr 著 郭光伟 郝记生 译, 人民邮电出版社
如有侵权,可联系博主删除。
1. 为什么要学习vi
- vi总是可用的。包括没有图形界面,例如远程服务器等
- vi是轻量级软件,运行速度快,且通过快捷键的组合,可以完全键盘操作
- 用户不想被其它Linux和Unix用户蔑视(额,原书是这么写的,博主也深有同感)
当然,现在比较流行vim,是vi的一个扩展。
注意,在本节我使用的ubuntu系统为中文语言环境,英文对应下就好了.
2.启动和退出vi
$ vi
输出为
~ VIM - Vi IMproved
~
~ 版本 7.4.1099
~ 维护人 Bram Moolenaar 等
~ 修改者 <bugzilla@redhat.com>
~ Vim 是可自由分发的开放源代码软件
~
~ 帮助乌干达的可怜儿童!
~ 输入 :help iccf<Enter> 查看说明
~
~ 输入 :q<Enter> 退出
~ 输入 :help<Enter> 或 <F1> 查看在线帮助
~ 输入 :help version7<Enter> 查看版本信息
退出即输入
:q
注意,冒号也是命令的一部分
如果由于一些原因,vi不能够退出(通常是因为没有保存修改过的文件),可以通过在命令后添加感叹号的方式强制退出。
:q!
3.编辑模式
启动vi,向其传递一个存在的文件路径,即可打开已经存在的文件;若路径不存在,则新建一个文件
$ rm -f foo.txt
$ vi foo.txt
屏幕显示
~
~
~
~
~
~
~
"foo.txt" [新文件] 0,0-1 全部
其中,每行的波浪线代表此行没有任何内容.
4.1 进入插入模式
如果用户想向文件中添加一些内容,首先要按下I键
(或者Insert)进入插入模式。插入模式下,屏幕底部会显示
-- 插入 -- 0,1 全部
现在可以随便输入了
I like coding!!!!
要退出,按下ESC键
退出插入模式并返回命令模式。
4.2 保存工作
要保存用户修改过的文件,在命令模式下输入一条ex命令
,也就是按“:
”键。这样之后,一个冒号会出现在底部。要将文件写入磁盘,在冒号之后输入w.
:w
屏幕底部显示
"foo.txt" [新] 1L, 18C 已写入 1,17 全部
注意,在vim中,命令模式被称为普通模式,使用ex命令则被称为命令模式。
4.3 移动光标
vi提供了很多移动光标的命令,一些与less是共用的
表1 光标移动快捷键
键 | 光标动作 |
---|---|
L或右方向键 | 右移一位 |
H或左方向键 | 左移一位 |
J或下方向键 | 下移一位 |
K或上方向键 | 上移一位 |
数字0 | 至本行开头 |
Shift+6(^) | 至本行第一个非空字符 |
Shift+4($) | 至本行末尾 |
W | 至下一个单词或标点的开头 |
Shift+W | 至下一个单词的开头,忽略标点 |
B | 至上一个单词或标点的开头 |
Shift+B | 至上一个单次或标点的开头,跳过标点 |
Ctrl+F或PgDn | 下翻一页 |
Ctrl+B或PgUp | 上翻一页 |
number+Shift+G | 至第number行 |
Shift+G | 至文件的最后一行 |
5.基本编辑
下面介绍插入、删除、剪切、复制等基本的文本编辑操作。并且vi支持有限的撤销操作。
5.1 添加文本
在命令模式下,光标移动到文本的末尾是不能跳出行末的,此时按下a
,光标就会跳过文本的末尾,同时vi进入插入模式。这样用户就可以在行末添加文本了。
5.2 插入一行
当需要在文本中重开一行时,有以下两种方式
表2 插入一行功能键
命令 | 开行 |
---|---|
o | 当前行的上方 |
O | 当前行的下方 |
5.3 删除文本
首先,我们首先要知道,按u
可以撤销命令,就像windows的Ctrl+Z一样,但是,vi只能取消一次操作,而vim可以取消多次操作.
表3 文本删除命令
命令 | 删除内容 |
---|---|
x | 当前字符 |
3x | 当前字符和之后2个字符 |
dd | 当前行 |
5dd | 当前行和之后的4行 |
dW | 当前字符到下一个单词的起始 |
d$ | 当前字符到当前行的末尾 |
d0 | 当前字符到当前行的起始 |
d^ | 当前字符到当前行下一个非空字符 |
dG | 当前行到文件末尾 |
d20G | 当前行到文件第20行 |
5.4 剪切、复制和粘贴文本
命令d不只是删除文本,而是在“剪切”文本,其作用类似于剪切板。然后用户可以使用p
命令将缓存中的内容粘贴到光标之后或者使用P
命令将内容粘贴到光标之前.
而命令y会复制文本。
表4 复制命令
命令 | 复制内容 |
---|---|
yy | 当前行 |
5yy | 当前行和之后的4行 |
yW | 当前字符到下个单词的起始 |
y$ | 当前字符到行的末尾 |
y0 | 当前字符到行的起始 |
y^ | 当前字符到下一个非空字符 |
yG | 当前行到文件末尾 |
y20G | 当前行到第20行 |
5.5 合并行
vi提供了J命令来合并行.
可以将光标移动到行的开头和结尾测试。
6.查找和替换
vi提供了在一行或者整个文件中,根据搜索条件将光标移动至指定位置的功能。vi也可以执行文本替换工作,用户可以指定替换时是否需要用户确认。
6.1行内搜索
命令f
在行内进行搜索,将光标移至搜索到下一个指定字符,例如fa会将光标移动到下一行出现字符a的地方。在执行过一次行内搜索之后输入分号可以使vi重复上一次搜索.
6.2搜索整个文件
命令“/
”可以完成对单词或短于的搜索,当用户使用“/”命令后,一个“/”符号会出现在屏幕的底部。接下来,输入需要搜索的单次或短语,以Enter键结束,光标会移动到下一处包含被搜索字符串的地方,使用n
命令可以重复此搜索。
6.3全局搜索和替换
vi使用ex
命令来执行几行或者整个文件中的搜索和替换操作。输入以下命令可将文件的like替换为love
:%s/like/love/g
表5 全局搜索和替换语法范例
组成 | 含义 |
---|---|
: | 分号用于启动一条ex命令 |
% | 确定了操作作用的范围。%简介地代表了从文件的第一行到最后一行。本命令的范围还可以表示为1,5(从第1行到第5行)或者1,$,意思是从第1行到文件的最后一行。如果不给出范围,那么仅在当前行生效。 |
s | 指定了具体的操作——本次是替换操作(搜索和替换) |
/like/love | 搜索和替换的文本 |
g | 代指global(全局),也就是说对搜索到的每一行和每一个实例进行替换。如果g缺失,则只替换每一行第一个符合条件的实例。 |
如果在命令末尾添加c,则命令在每次替换之前都会请求用户确认。
:%s/like/love/gc
显示器最下面会出现
替换为 love (y/n/a/q/l/^E/^Y)?
含义如下
表6 替换确认功能键
功能键 | 行为 |
---|---|
y | 执行替换 |
n | 跳过本次替换 |
a | 执行此替换和之后的所有替换 |
q或者ESC | 停止替换 |
l | 执行此次替换并退出替换,是last的缩写 |
Ctrl+E,Ctrl+Y | 分别为向下滚动和向上滚动,能用于查看替换处的上下文 |
7.编辑多个文件
用户会遇到同时编辑多个文件,例如从文件A拷贝内容到文件B。用户可以在命令行通过制定多个文件方式打开多个文件。
语法为
vi file1 file2
现在,我们创建一个新的文件,并与之前的foo.txt同时打开
$ ls -l /usr/bin | ls-output.txt
$ vi foo.txt ls-output.txt
7.1 切换文件
使用以下ex命令来从一个文件切换到下一个文件
:n
切换回上一个文件
:N
当用户从一个文件切换到另一个的时候,vi要求用户必须先保存对当前文件作出的修改才能切换到其它文件。若要放弃对文件的修改并使vi强制切换到另一个文件,可在命令后添加感叹号(!)。
除了切换文件之后,还有其它命令来帮助用户编辑文档。
例如:buffers
命令来查看正在编辑的文件列表。
:buffers
1 %a "foo.txt" 第 1 行
2 # "ls-output.txt" 第 1 行
输入:buffer加文件(buffer)编号
可以切换到另一个文件(buffer)。例如要切换到ls-output.txt可以使用
:buffer 2
7.2 载入更多的文件
可以在现有的编辑会话中载入更多文件,使用ex命名:e(edit的缩写)+文件名
可以载入另一个文件。
7.3 文件之间内容的复制
有时需要将一个文件中的一部分复制到另一个文件中。可以使用之前讲过的复制粘贴,并切换文件实现。
首先,在载入的两个文件中,切换到文件1(foo.txt)
:buffer 1
然后,将光标移动到文件的第一行并输入yy命令来复制第1行
再切换到文件2
将光标移动到第一行并使用p命令将文件1复制的内容粘贴到本文件
7.4 插入整个文件
用户还可以将一个文件完全插入正在编辑的文件中。
先结束7.3的会话并重启vi的同时只打开一个文件
$ vi ls-output.txt
光标移动到需要插入的行,例如第3行,并输入如下ex命令:
:r foo.txt
命令:r(read的缩写)
将制定的文件内容插入到光标位置之前。
8.保存工作
- 方法1: ex命令
:w
- 方法2:在命令模式下输入ZZ将保存当前文档并退出vi.