使用vi编辑器.docx
- 文档编号:7841768
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:17
- 大小:317.40KB
使用vi编辑器.docx
《使用vi编辑器.docx》由会员分享,可在线阅读,更多相关《使用vi编辑器.docx(17页珍藏版)》请在冰豆网上搜索。
使用vi编辑器
使用vi编辑器
关于vi编辑器的使用,完全可以写一本厚厚的书。
本节所介绍的,都是较为实用的内容,可在使用vi编辑器的过程中,不断回头来看看本节,应该有所收获。
最后一部分所讲述的进阶使用技巧,初次阅读时可以跳过。
有一定经验后再来看,才不会觉得很突兀。
图21220世纪70年代的计算机(Amdahl470计算机)
图213BillGates和PaulAllen在使用电传打字机
vi编辑器的过去和现在
UNIX上最古老最基本的编辑器应该是ed,最初由UNIX之父KenThompson编写。
正则表达式(RegularExpression)这一威力强大的工具在ed中首次得以从理论走向实现。
这对UNIX造成了深远的影响。
其实,ed是受来自加州大学伯克利分校的QED编辑器的影响,Ken便是从这所学校毕业的。
ed是一种行模式编辑器,每次编辑和设置都在一行中进行,现在大家觉得这个编辑器很难用。
可是要想一想,在20世纪70年代,许多使用UNIX的人都是用廉价的终端机通过电话线连到UNIX服务器(图212是那个年代的产品)上的,传输速率非常慢,输入后往往需要等一会才能收到系统的响应,所以这种简洁的行模式编辑就很有意义。
虽然现在ed编辑器用的很少了,但是它的很多理念比如命令字符、正则表达式却在它的很多后辈身上得以发展。
1977年,加州大学伯克利分校的研究生BillJoy开发了ex编辑器,这是一种行模式编辑器。
行模式编辑器现在已经很少在交互界面下使用了,但在Shell脚本编程等非交互式应用下仍在使用。
现在在非交互式应用中,多使用流编辑器来替换行模式编辑器。
流编辑器是将待处理的文本视为一整行,称为文本流,因此流编辑器可视为行模式编辑器的变种。
awk和sed都是非常强大的流编辑器。
ex编辑器随1BSD(FirstBerkeleySoftwareDistribution)发布,它具有一种可视化模式(VisualMode),称为vi。
1978年,在2BSD(SecondBerkeleySoftwareDistribution)发布时,vi编辑器作为ex编辑器的可视化版本单独发布了。
vi编辑器首次使用了全屏编辑的模式。
随着硬件的发展,用户可查看的区域从行扩展到全屏,UNIX上开发了很多种全屏模式编辑器:
pico、nano、joe、jed、jove等,但最广泛使用和最有影响力只有两种:
vi和Emacs。
据说,程序员只有三种:
用vi的、用Emacs和用其他的。
只是,这两种编辑器的粉丝已经掐架数十年了,因此不要随意在论坛上表现出太强烈的倾向性,不然容易爆发口水战。
vi编辑器的巨大用户群体爆发出了种类众多的功能需求,再加上vi编辑器本身不是自由软件。
因此,大家试图改进vi编辑器,vim编辑器是众多尝试之一。
BramMoolenaar于1991年首次发布vim编辑器,它是一种自由软件。
vim是“ViImproved”的缩略词。
vim已经成为当今绝大多数Linux发行版中的标准配置:
默认的安装中都包括了vim编辑器,当然还有ed编辑器。
我们所能见到的vi编辑器其实都是vim编辑器兼容模式。
若没有特别说明,本书中将vi编辑器和vim编辑器混为一谈。
vim编辑器目前在各主流操作系统下都有了相应的版本。
是的,你没看错,DOS、Windows和MacOSX下也有vim编辑器可用,更不用说那些类Unix系统了。
gvim编辑器是vim编辑器的图形化版本。
vi编辑器入门
最基本的vi编辑器操作前面已经介绍了,因此用户可以打开文件并退出了。
什么?
你困在不知道名字的模式中,总是提示无法退出?
好吧,狂按ESC键,输入:
q!
——这是快速逃生通道,至于你修改的东西可能不会幸存,至少你幸存了,足够了。
最初使用vi编辑器一般都会感到比较茫然,不知如何去使用。
我们所推荐的解决办法是首先要尝试去理解vim编辑器的设计理念,然后坚持使用。
虽然,通过设置Putty和vi编辑器,可以在vi编辑器中使用鼠标来定位、选择和滚动,但在使用vi编辑器的初级阶段,应该坚持在打字时就不要想着去使用鼠标来定位,坚持尝试用各种按键组合来快速定位。
做到手不离开键盘,自然输入速度就渐渐不再成为编程设计的障碍。
想想看,本来打算定义一个变量,结果低头看着键盘寻找应该输入的字母,很容易就打断头脑中的设计,甚至完全忘记这个变量用来做什么了。
所以,我们至少要做到能盲打后再来编写程序,这就像先要发音正确后再来学习组织语言一样。
图214IBM键盘(1984年)
对这种把手约束在键盘上的设计理念,导致vi编辑器需要引入命令模式。
总是会有很多非文本输入的操作,例如保存、退出、搜索等等。
vi编辑器的设计选择了使用命令模式来将键盘上的按键映射成功能键,比较复杂和不太常用的功能就使用特殊字符开头的字符串来实现。
为了避免错误的文件覆盖,vi编辑器使用缓冲区(Buffer)来保存当前正在编辑的内容。
也就是说,只要用户没有手动保存,这些内容并没有写入到硬盘上的对应文件中,而是仅仅呆在内存中。
为选择一部分文字,vi编辑器有可视模式、可视行模式和可视列块模式。
在可视模式下,以进入该模式的位置为一点,使用光标移动的指令控制文字块的另一点。
在可视行模式下,选择的文字块以行为单位。
在可视列块模式下,选择起点和终点为对角位置的矩形。
对选中的文字块,可使用各种指令来进行操作。
具体的情况用户应自行探索一下,想一想该功能对文本编辑是否可以有所帮助。
表25列出了在命令模式下较为常用指令(单个字符或字符串)。
注意,是输入字符而非按下该键,例如“$”就需要按住上档键来输入。
同样,大小写也是有区别的。
这些命令不需要全部记住再去使用。
用多了自然就记住了。
这就是类似于新到一个地方居住,道路不太熟悉,多住一段时间,再复杂的道路也都能熟悉了。
使用vi编辑器一段时间后,再看看表格中的这些操作,或许找到更加快捷的操作方法。
表格中只列出了部分常用的操作,读一读vim用户手册可以更加深入全面的理解这些操作。
表25命令模式常用指令
功能
指令
简评
功能操作
退出vi编辑器
:
q
无Buffer需要保存
强行退出vi编辑器(忽略待保存的Buffer)
:
q!
ZQ(大写)也可实现
保存当前Buffer到文件
:
w
保存并退出
:
wq
ZZ(大写)也可实现
另存文件(例如abc
:
wabc
打开文件(例如abc)
:
eabc
可指定带路径的文件名
撤销上一步操作
u
小写字母u
重做上一步操作(撤销刚才的撤销操作)
Ctrl-r
先按Ctrl键不放,再按r键
重复上一个编辑命令
.
在屏幕底端显示文件信息
Ctrl-g
文件名、行数、当前位置百分比
进入可视模式,逐字符选择
v
小写
进入可视行模式,逐行选择
V
大写
进入可视列块模式
Ctrl-v
试试看就知道了
光标所在位置的整数加一
Ctrl-a
负数、多位整数也有效
光标所在位置的整数减一
Ctrl-x
负数、多位整数也有效
重复上一次操作
.
光标控制
左移光标
h
与左方向键等效
右移光标
l
与右方向键等效
上移光标
k
与上方向键等效
下移光标
j
与下方向键等效
向前翻一屏
Ctrl-f
与PageUp键等效,f指front
向后翻一屏
Ctrl-b
与PageDown键等效,b指back
光标移动到行首
0
(数字0)与Home键等效
光标移动到行末
$
与End键等效
光标移动到屏幕最上面一行
H
光标移动到屏幕中间一行
M
光标移动到屏幕最下面一行
L
光标移动到第n行(例如n=34)
34G
也可输入34gg来实现
光标移动到文件最后一行
G
光标移动到文件第一行
gg
当前行左移一个TAB的距离
<<
代码反缩进一层
当前行右移一个TAB的距离
>>
代码缩进一层
光标(在括号处)移动到匹配的另一括号
%
()[]{}三种括号
移动到上一个函数
[[
移动到下一个函数
]]
搜索
从光标开始搜索指定字符串(例如abc)
/abc
回车后才开始搜索
从光标开始向前搜索字符串(例如abc)
?
abc
回车后才开始搜索
从光标开始向前搜索上次指定的字符串
n
从光标开始向后搜索上次指定的字符串
N
向前搜索光标所在的单词
*
向后搜索光标所在的单词
#
替换删除
替换当前光标后的字符(例如换为’a’)
ra
修改少量字符时很方便
删除当前光标后的字符,切换到编辑模式
s
小写字母,将一个字符换为多个
删除光标后的一个字符
x
小写字母x,dl可实现相同功能
删除光标前的一个字符
X
小写字母X,dh可实现相同功能
删除当前行
dd
删除当前行,切换到编辑模式(修改此行)
cc
c指change
删除当前行和及其上一行
dk
k表示向上
删除当前行和及其下一行
dj
j表示向下
删除本行光标之后的字符
D
复制粘贴
复制当前行
yy
y指yank,Y也是相同效果
复制n行(n=3)
y3y
3Y或者3yy也是相同效果
粘贴(插入)到光标之前
P
大写字母
粘贴(插入)到光标之后
p
小写字母
在bash下运行:
vimtutor
可以开始一个vi编辑器的入门教程,交互式的,不妨试试。
vi编辑器对中文的支持还是很给力的:
vi编辑器中直接就可以输入中文,教程也是中文版的。
但这需要中文的本地化环境(locale)。
管理员若已按本书所示范的Debian/Linux平台设置方法设置了中文本地化支持,用户可设置中文的本地环境:
exportLANG=zh_CN.gbk
最好的进阶办法是坚持使用,并使用中想想正在做的事情有没有更快更好的方法来实现。
或许现在做的一大堆事情已经有很简便的方法来完成了呢?
我们不需要从轮子造起。
如何知道有哪些技巧呢?
最好的办法是在命令模式下使用“:
help”来寻找所需的帮助。
这个指令将会使用vi编辑器打开自带的帮助文件。
这个帮助文件是英文的,但非常简单易懂。
只要花点时间,很容易能看明白。
这个帮助文件同时也是一个很容易上手的教程,耐心读完是大有裨益的。
毕竟,在写程序的过程中,简单的英文阅读和写作能力是非常必要的。
至少在Linux平台上编程,就只能使用英文注释。
只需要简单的英文注释,很多母语不是英语的高手即使英语都是比较蹩脚的,也同样可以写英文注释的。
语法是否正确没关系,只要关键词没写错,看程序的人可以猜得出来,那就足够了。
当然,翻阅中文版的《vim用户手册》是一种捷径。
中文版的《vim用户手册》可Internet上在线阅读:
vi编辑器设置
vi编辑器启动时,将试图按用户主目录下的.vimrc文件(文件名是固定的)来设置vi编辑器。
这是一个文本文件,双引号“””开始的行是注释。
在本书所使用的DebianGNU/Linux系统中,管理员可设置/etc/vim/vimrc来对全体用户的vi编辑器进行设置。
用户可在主目录下创建或修改.vimrc文件,在该文件中写入设置指令,这些设置将会覆盖全局设置。
每个指令一行,以“””开始的行表示该行为注释。
这些设置指令也可在vi编辑器运行时设置。
方法是在命令模式下输入冒号,然后输入设置指令。
以下列出一些常见的设置指令。
1)语法高亮
syntaxon
vi编辑器根据文件后缀名来判定文件类型。
C语言源代码以“.c”为后缀名,C语言头文件以“.h”为后缀名。
Vi编辑器根据文件类型来实现语法高亮,也就是对关键字、数字等采用不同的颜色显示,以便用户阅读源代码。
用off替代on可关闭语法高亮。
2)自动缩进
setcindent
缩进让程序充满了抑扬顿挫,面对毫无缩进的代码无疑是很痛苦的。
从图215可以看到这一点。
使用缩进将极大的提高程序的可读性,因为可以从缩进关系了解语句的层次。
vi编辑器为用户设计了若干种自动缩进的策略,有autoindent、smartindent、cindent、lisp等。
不过对于C语言编程来说,cindent是最合适的。
图215缩进与不缩进的对比
对于使用Debian/Linux系统的用户,在安装vim后,可将其自带的配置文件模版(/usr/share/vim/vimrc)复制为/etc/vim/vimrc(管理员)或~/.vimrc(普通用户)。
其中有一段是
"ifhas("autocmd")
"filetypepluginindenton
"endif
将每行前的引号去掉,让这些语句生效。
下次打开vi编辑器的时候就可以获得自动缩进的效果了。
Debian/Linux发行版的开发者为vi编辑器的用户已经设计好了缩进的自动处理,对于后缀名为.c的文件使用cindent选项。
3)暗背景
setbackground=dark
使用Putty终端程序,默认背景为黑色。
黑色背景下看vi编辑器的语法高亮配色方案总是有点别扭,特别是注释部分的颜色,对比度很低。
vi编辑器不能改变终端的背景颜色,但准备了针对深色背景和浅色背景两种配色方案,调整语法高亮的颜色配置。
浅色背景应使用:
setbackground=light
4)设置行号
setnumber
使用行号对于编写代码无疑是很有用的。
特别是在vi编辑器中,常常需要定位到某一行,行号对此帮助很大。
取消行号使用:
setnonumber
5)使用鼠标
setmouse=a
虽然vi编辑器的设计是为全键盘输入优化的,但在Windows平台上使用鼠标这项伟大的发明还是非常有用的。
可使用鼠标来实现:
1.单击定位光标;
2.双击选中单词;
3.拖动选择文本块(进入可视模式);
4.滚轮滚动屏幕;
5.多窗口拖动窗口分割线(参见后文);
最激动人心的是,vi编辑器可以通过鼠标访问Windows平台的剪贴板。
要将vi编辑器的内容复制到Windows平台剪贴板中,需要按住Shift键来选择。
而要将Windows平台剪贴板中的内容复制到vi中,则需要先进入编辑模式,再按住Shift点击鼠标右键,即可完成粘贴。
需要注意的是,从Windows平台剪贴板上复制到vi编辑器中时,若vi编辑器设置了自动缩进,粘贴效果会很难看。
解决的办法是设置粘贴模式,:
setpaste
使用了粘贴模式会有一些副作用,例如:
右下角的光标位置指示(光标所在行和列,也称为标尺)会消失,自动缩进会失效,等等。
因此,建议仅在需要从Windows平台粘贴时才设置为粘贴模式,粘贴完毕后立即取消粘贴模式:
setnopaste
Shift键的作用是忽视终端上运行的应用程序(例如vi编辑器)对鼠标的设置。
这是在Putty终端程序的会话属性中的默认设置。
vi编辑器进阶
1)快速输入冒号命令
在命令模式下,某些操作需要输入冒号再输入一长串字符串,很是让人恼火。
vi编辑器为此准备了两种手段。
第一,输入冒号后就可以用TAB补全了,不过不像bash那样全部列出备选,而是依次出现;第二,冒号后的命令不用输入完整的名字,只要没有歧义,vi编辑器都懂的。
例如,“:
setnumber”可以只输入“:
setnu”,“:
write”可以只输入“:
w”……这种对用户的体贴,是我们程序设计的榜样。
优秀的程序员总是竭尽所能的节省力气,通俗的说就是懒惰。
KISS原则还记得吗?
那才是我们需要的。
只有懒惰的程序员才会去开发那些能够替代人的自动化工具,而不是为了实现相似功能的大堆冗余代码。
复制粘贴都嫌麻烦,更麻烦的是有可能用户需求改变而要求全部都要改,那才是惨案。
只要有可能再次用上,这种懒惰就会驱使专业的程序开发者开发各种工具来使用。
这就是所谓的“磨刀不误砍柴工”。
只有懒惰的程序员才会追求可靠的程序设计(Solidcode),只为了减少彻夜调试的风险。
为此还要准备一堆错误检查,避免自己陷入困境。
这是一种有预见性的懒惰,那种不管三七二十一把代码堆出来就交货的野蛮做法只会让自己陷入泥潭。
新入门的程序员应尝试去维护别人的代码,最好是同学写的代码,从而能够知道怎样设计代码才是合理的。
只有懒惰的程序员才会追求用户操控的简洁,若是程序员能保持专业精神,多用一用自己写的程序,特别是有用户输入的程序,大量测试时的乏味感会让操控的设计变得简洁的。
vi编辑器开发者的懒惰为我们提供了减少键盘、手指和肩肘腕磨损的机会,为此理应向他们致敬。
2)在Putty中使用小键盘
使用Putty时无法用小键盘在vi编辑器中输入数字,这是因为Putty的默认设置中,将小键盘作为功能键使用了。
需在Putty的属性设置中修改。
具体来说,就是Terminal->Features中,选中“Disableapplicationkeypadmode”,则键盘上小键盘锁定打开时,可在vi编辑器中使用小键盘输入数字。
3)撤销与重做以及重复
在尝试vi编辑器的各种强大功能时,撤销(Undo)指令u是一种安全保证:
在命令模式下输入u,烦恼全无。
输入“:
undo”也是一样的。
撤销错了也不要紧,还有重做(Redo)指令Ctrl-r可以撤销这个错误的撤销。
当然,输入“:
redo”也等效。
在撤销和重做之前先输入一个数值,可指定操作的层数。
例如,撤销刚才的10次操作,可输入“10u”。
重复(repeat)指令“.”用于多次重复的操作,该指令用于重复上一次的操作。
例如,仅将部分地方的abc改为xyzt,可先输入“/abc”移动到下一个abc,输入“cwxyzt”后按ESC退出编辑模式。
若这个abc不是要修改的,可输入“u”来撤销修改。
但接下来就简单了,输入“n”让光标移动到下一个abc,看看是不是要改的地方,若需要修改,就按“.”就可以完成了。
美妙的是,这个修改的操作将可以不断重复。
于是,事情就变得简单了。
从这个例子,我们还可以看到,搜索比移动光标快捷省事。
当然,才开始使用vi编辑器的用户还是先老老实实移动光标吧,等用得多了,再用这种方式就会有很强烈的幸福感了。
预告:
后面我们会提及使用鼠标来滚动和定位的。
4)搜索
在命令行模式下,输入“/”后,在屏幕最下面会出现该符号,然后输入要搜索的单词,回车后,将会跳转到文件中下一个该单词出现的地方。
若搜索到达文件末尾,则自动从文件开始处继续搜索。
若全文都未能找到该单词,则会提示匹配失败。
使用“?
”替代“/”则仅仅带来搜索方向上的改变:
搜索下一个改成了搜索上一个,到达文件头时则跳转到文件末尾。
在命令行模式下按“n”或“N”进行向前或向后再次搜索,很快就可以找遍整个文件。
注意,搜索到达文件头或文件尾时,会自动跳转到文件尾或者文件头继续搜索。
搜索不仅仅限于单词,还可以使用正则表达式来描述,因此vi编辑器使用模式这个术语来表示所搜索的表达式,因此用匹配能更好的表示这种搜索。
搜索指定的单词只是最简单的模式匹配。
例如,“\
在vi编辑器中试试看就明白了。
再例如,“^abc”只匹配在行首的abc;“a[bc]d”匹配abd,也匹配acd。
关于vim的正则表达式就实在太复杂了,尽管它非常好用。
可在Internet上搜索一下“vim正则表达式”,应该可以找到很多实用和有趣的技巧,要掌握这些技巧只能通过实际应用来做,不然就成屠龙之术了。
搜索光标所在的单词,使用“*”和“#”无疑是最方便的一种,两者的差别只在于搜索的方向。
在命令行模式下,假设光标所在的单词为abc,那么按“*”则等价于输入“/\
其中,“\<”和“\>”在正则表达式的语法中分别表示匹配一个单词的开始和结束。
5)替换
在命令模式下输入
:
%s/abc/cde/g
可将整个文件中所有的abc(包括abcd中的abc)都替换为cde。
冒号后的“%”表示在整个文件范围进行替换。
若没有这个指示范围的符号,则该指令只处理光标所在行。
范围符号也可使用m,n来表示从m行到n行,例如从10行到20行进行替换:
:
10,20s/abc//g
在这个例子中可以看到,替换字符串可以为空字符串,这将会导致从10行到20行的abc都被去除。
这就是说,这可以用于去除指定模式的全部匹配。
也可使用可视模式选定文本块后输入冒号,vi编辑器自动将文本块首尾(’<,’>)作为替换范围。
i
在这个例子中,“/”是分隔符,完全可以用其他不包括“\”、“|”和“””的非字母字符来替代。
例如
:
%s@abc@cde@g
3个分隔符将整个指令分成了4个部分,从左往右依次是:
s(substitute的首字母)指令(在s前可指定替换范围)、搜索模式、替换字符串、选项。
当然,分隔符不能出现在各部分中,否则就无法区分了。
当特定分隔符是搜索模式或替代字符串的一部分时,这种分隔符可替换的设计,可很好的解决这个问题。
6)剪切、复制与粘贴
在vi编辑器中,在命令模式下删除一个字符或一段文本后,被删除的内容并不会直接丢弃,而是保存起来。
也就是说,vi编辑器使用删除操作来实现剪切功能。
注意,在命令模式下用“r”来替换操作,和编辑模式下所删除的内容,并不会自动保存。
在命令模式下使用“p”或“P”进行粘贴时,将使用最后一次剪切或复制的操作所保存的内容。
这对于搬运一行或多行代码来说,完全就是福音。
其实,vi编辑器中有很多寄存器可用,完全可以实现较复杂的剪切、复制和粘贴。
若没有指定寄存器,复制的内容将会被放在寄存器1。
删除(剪切)的情况要稍微复杂一点:
不包含换行符的内容将会放在寄存器-(减号)中,否则将会放在寄存器2到寄存器9。
寄存器2到9的内容在每次删除操作时变化:
寄存器n的内容将会被移到寄存器n+1中去;寄存器9原来的内容将会被丢弃;寄存器2保存最新的删除内容。
可直接观察到各寄存器中的内容:
:
reg
注意,在所显示的寄存器内容中,可能出现表示换行符的^J。
在Windows平台和Unix平台(包括Linux平台)下,文本文件中使用了不同的方式来实现行的结束。
Windows平台下依次使用回车和换行两个字符,Unix平台和Linux平台下使用单个换行符。
换行符的ASCII码为0xD,英文缩写为NL(NewLine)或者LF(LineFeed),可用转义字符“\n”表示;回车符的ASCII码为0xA,英文缩写为CR(CarriageReturn),可用转义字符“\r”表示。
这一特征很鲜明的区分了三个平台,但也在不同平台之间的文件交换过程中带来了烦恼,例如用vi编辑器打开在Windows平台上生成的文本文件会在行尾有个^M,而在Windows平台上用系统自带的记事本打开Linux平台上用vi编辑器写的文件时,全部内容都挤成了一行。
在Windows平台上推荐使用UltraEdit这个编辑器来做文本编辑,其文本编辑功能非常强大和全面,在Windows平台上有不少程序员不满意集成开发环境的文本编辑功能时,常常选择UltraEdit来编辑源代码。
当然,用UltraEdit来解决平台间的换行差异是非常容易和方便的。
vi编辑器中可使用替换功能直接搞定,需要注意的是回车符可使用Ctrl-V、Ctrl-M来输入^M,或者用转移字符来表示。
用户可借此练习一下替代的用法。
改得不满意可以在命令模式下按u来恢复。
7)打开多个文件
在vi编辑器中可以打开多个文件。
vi编辑器打开文件后,将会把文件缓存在Buffer中,因此打开多个文件就是多次读取文件到不同Buffer的过程。
Buffer其实是vi编辑器用来缓
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 vi 编辑器