vi编辑器功能详述

Posted on 2010-09-24 11:00 子期 阅读(1853) 评论(0)  编辑  收藏

  viunix操作系统提供的一个全屏幕文本编辑器,是程序员编辑源代码的一个重要工具。熟练掌握vi命令及其使用技巧往往能起到事半功倍的作用,大大提高编程工作的效率。在应掌握如i,a,o,0,m,x,u,dd,yy,dw,cw,s,.,/,CtrlF,CtrlB,CtrlG,w,q等基本命令外,下面介绍一些实际工作中所常用的命令技巧。

  1.将多个文件调入缓冲使用命令:vi flname1 flname2 flnameN编辑下一文件用:n;回到首文件:rew;查看当前编辑缓冲文件状态:args

  2.修改包含某一字符串的文件可与grep命令结合使用,如欲编辑当前目录下含有abc字串的所有C源程序:vigrep 1 abc .c

  3.编辑在缓存中的两个文件快速切换命令: e Ctrl^ 使用Ctrl^ 命令更便捷,但如终端类型不正确该功能将无效。

  4.将一个文件的部分内容读入另一文件中,有以下两种操作方式:

  (1)将欲读入的内容用w命令写入一临时文件,再用r命令读入。该方法笨拙,临时文件需清理。

  (2)将欲读入的内容写入一临时缓存器后再切换到目标文件,将光标移至需读入内容处,从缓存器中提出。

  写入缓存器a命令:起始行mk 结束行″ay'k

  从缓存器a中提出:″ap

  该方法操作方便快捷,不会产生垃圾文件

  5.放弃一修改过的文件,重新编辑。

  (1)使用命令 :q!强行退出后再vi flname重新进入。

  (2)使用命令 :e!强行重编辑更便捷。

  6.定位文件尾用G比:更快捷,段落定位用()键,括号匹配定位用%,定位行首0,定位行尾,两行连接J

  7.行左移〈〈,行右移〉〉,该命令用于调整源码缩进格式简便快速。

  8.大小写字母自动切换命令:shilft+~,屏幕刷新Ctrl1

  9.当编辑的移动键失效时可用:map命令,但如终端类型不正确该命令将无效。

  10.替换命令的特殊处理:文件行首用^标识,行尾用$标识。

  如:1s/^/abc/g 表示文件行首加入abc字串

    1.s//abc/g 表示文件首行至光标所在行行尾加入abc字串

  11.vi命令状态直接读入一外部命令执行结果:

  !!+外部命令

  如:

  !!date

  直接读入一系统日期

  12.vi中也可输入非ASCII码,如欲输入打印机的换页控制码^L(码值为12),其输入方法是先输Ctrlv再输Ctrl1即可,其中Ctrlv是静默值。

  13.显示vi文本中的隐含字符:set list 取消显示:set nolist

  14.临时退出至shell状态命令:shexit退出shell后将回到原编辑状态,在同一缓存中编辑另一文件:e flname

  vi编辑器命令很丰富,但没必要各个都需掌握,只要掌握以上提及的基本命令与技巧,即可自如高 效的编辑文件了。

 

 

 

 

 

功能最强在的编辑器——vi

vi是所有UNIX系统都会提供的屏幕编辑器,它提供了一个视窗设备,通过它可以编辑文件。当然,对UNIX系统略有所知的人,或多或少都觉得vi超级难用,但vi是最基本的编辑器,所以希望读者能好好把它学起来,以后在UNIX世界里必将畅行无阻、游刃有余,因为其他几种文本处理器并非UNIX标准配备。说不定别人的Linux机器没安装joepico,如果您不会vi,那您可能就没辄了。

vi的基本概念

基本上vi可分为三种操作状态,分别是命令模式(Command mode)、插入模式(Insert mode)和底线命令模式(Last line mode),各模式的功能区分如下:

1 Comand mode:控制屏幕光标的移动,字符或光标的删除,移动复制某区段及进入Insert mode下,或者到Last line mode

2 Insert mode:唯有在Insert mode下,才可做文字数据输入,按Esc等可回到Comand mode

3 Last line mode:将储存文件或离开编辑器,也可设置编辑环境,如寻找字符串、列出行号等。

不过可以把vi简化成两个模式,即是将Last line mode也算入Command mode,vi分成Command Insert mode

vi的基本操作

?进入vi

在系统提示符号输入vi及文件名称后,即可进入vi全屏幕编辑画面:

$ vi testfile

有一点要特别注意,就是您进入vi之后是处于“Command mode”下,您要切换到Insert mode才能输入文字。初次用vi的用户都会想先用上下左右键移动光标,结果电脑一直叫,把自己气个半死,所以进入vi后,先不要乱动,转换入Insert后再说。

?切换至Insert mode编辑文件

Command mode下按‘i’、‘a’或‘o’三键就可进入Insert mode。这时候您就可以开始输入文字了。

i: 插入,从目前光标所在之处插入所输入的文字。

a: 增加,目前光标所在的下一个字开始输入文字。

o: 插入新的一行,从行首开始输入文字。

?Insert的切换→Command mode,按Esc

您目前处于Insert mode,您就只能一直打字。假如您发现打错字了,想用光标键往回移动,将该字删除,就要按ESC键转换回Command mode,再删除文字。

?离开vi及存文件

Command mode下,可按冒号“:”键入入Last line mode,例如:

:w filename (输入“w filename”,将文章存入指定的文件名filename)

:wq (输入“wq”,因为进入之时已经指定文件名testfile,所以会写入testfile并离开vi)

:q! (输入“q!”,强制离开并放弃编辑的文件)

Command mode功能键列表

在介绍command mode指令的时后,指令后面加上“常用”字眼的功能键,表示比较常用的vi指令,请读者您一定要学会、记住。

1Iao切换进入Insert mode[超级常用]

2)移动光标

vi可以直接用键盘上的光标键来上下左右移动,但正规的vi是用小写英文字母

hjkl,分别控制光标左、下、上、右移一格。

Ctrl+B:屏幕往后移动一页。[常用]

Ctrl+F:屏幕往前移动一页。[常用]

Ctrl+U:屏幕往后移动半页。

Ctrl+D:屏幕往前移动半页。

0 (数字零):移动文章的开头。[常用]

G:移动到文章的最后。[常用]

w:光标跳到下个word的开头。[常用]

e:光标跳到下个word的字尾。

b:光标回到上个word的开头。

$:移到光标所在行的行尾。[常用]

^:移到该行第一个非空白的字符。

0:移到该行的开头位置。[常用]

#:移到该行的第#个位置,例:51121[常用]

3)删除文字

x:每按一次删除光标所在位置的后面一个字符。[超常用]

#x:例如,6x 表删除光标所在位置的后面6个字符。[常用]

X:大字的X,每按一次删除光标所在位置的前面一个字符。

#X:例如,20X 表删除光标所在位置的前面20个字符。

dd:删除光标所在行。[超常用]

#dd:例如,6dd表删除从光标所在的该行往下数6行之文字。[常用]

4)复制

yw:将光标所在处到字尾的字符复制到缓冲区中。

(想在和#x#X的功能相反)

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的资料粘贴

5)取代

r: 取代光标所在处的字符:[常用]

R:取代字符直到按Esc为止。

6)复原(undo)上一个指令

u:假如您误操作一个指令,可以马上按u,回复到上一个操作。[超常用]

.: .可以重复执行上一次的指令。

7)更改

cw:更改光标所在处的字到字尾$处。

c#w:例如,c3w代表更改3个字。

8)跳至指定行

Ctrl+G:列出光标所在行的行号。

#G:例如,15G,表示移动光标至文章的第15行行首。[常用]

Last line mode下指令简介

读者您要使用Last line mode之前,请记得先按Esc键确定您已经处于Command mode下后,再按冒号“:”或“/”或“?”三键的其中一键进入Last line mode

1.列出行号

set nu: 输入“set nu”后,会在文章的每一行前面列出行号。

2.跳到文章的某一行

#:井号代表一个数字,在Last line mode提示符号“:”前输入数字,再按Enter就会跳到该行了,如:15[Enter]就会跳到文章的第15行。[常用]

3.寻找字符串

/关键字:先按/,再输入您想寻找的字,如果第一次找的关键字不是您相尽可能的,可以一直按n会往下寻找到您要的关键字为止。

?关键字:先按?,再输入您想寻找的字,如果第一次找的关键字不是您想要的,可以按n会往前寻找到您要的关键字为止。

4.取代字符串

1$s/string/replae/g:在last line mode输入“1$s/string/replace/g”会将全文的string字符串取代为replace字符串,其中1,$s就是指搜寻区间为文章从头至尾的意思,g则是表示全部取代不必确认。

%s/string/replace/c:同样会将全文的string字符串取代为replace字符串,和上面指令不同的地方是,%s1,$s是相同的功能,c则是表示要替代之前必须再次确认是否取代。

1,20s/string/replace/g:将120行间的string替代为relpace字符串。

5.存文件

w:在last line mode提示符号“:”前按w即可将文件存起来。[超常用]

## w filename:如果您想摘取文章的某一段,存成另一个文件,可用这个指令#代表行号,例如30,50 w nice,将您正在编辑文章的第30~50行存成nice这个文件。

6.离开

q:按q就离开,有时如果无法离开vi,可搭配“!:强置离开vi,如“q!”

qw:一般建议离开时,搭配w一起使用,如此离开时还可存文件。[常用]

 

 

 

 

 

 

 

进入vi的命令

vi filename :打开或新建文件,并将光标置于第一行首

vi +n filename :打开文件,并将光标置于第n行首

vi + filename :打开文件,并将光标置于最后一行首

vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处

vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename

vi filename....filename :打开多个文件,依次编辑

移动光标类命令

h :光标左移一个字符

l :光标右移一个字符

space:光标右移一个字符

Backspace:光标左移一个字符

kCtrl+p:光标上移一行

jCtrl+n :光标下移一行

Enter :光标下移一行

wW :光标右移一个字至字首

bB :光标左移一个字至字首

eE :光标右移一个字j至字尾

) :光标移至句尾

( :光标移至句首

}:光标移至段落开头

{:光标移至段落结尾

nG:光标移至第n行首

n+:光标下移n

n-:光标上移n

n$:光标移至第n行尾

H :光标移至屏幕顶行

M :光标移至屏幕中间行

L :光标移至屏幕最后行

0:(注意是数字零)光标移至当前行首

$:光标移至当前行尾

 

屏幕翻滚类命令

Ctrl+u:向文件首翻半屏

Ctrl+d:向文件尾翻半屏

Ctrl+f:向文件尾翻一屏

Ctrlb;向文件首翻一屏

nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

 

插入文本类命令

i :在光标前

I :在当前行首

a:光标后

A:在当前行尾

o:在当前行之下新开一行

O:在当前行之上新开一行

r:替换当前字符

R:替换当前字符及其后的字符,直至按ESC

s:从当前光标位置处开始,以输入的文本替代指定数目的字符

S:删除指定数目的行,并以所输入文本代替之

ncwnCW:修改指定数目的字

nCC:修改指定数目的行

 

删除命令

ndwndW:删除光标处开始及其后的n-1个字

do:删至行首

d$:删至行尾

ndd:删除当前行及其后n-1

xX:删除一个字符,x删除光标后的,而X删除光标前的

Ctrl+u:删除输入方式下所输入的文本

 

搜索及替换命令 :

/pattern:从光标开始处向文件尾搜索pattern

?pattern:从光标开始处向文件首搜索pattern

n:在同一方向重复上一次搜索命令

N:在反方向上重复上一次搜索命令

s/p1/p2/g:将当前行中所有p1均用p2替代

n1,n2s/p1/p2/g:将第n1n2行中所有p1均用p2替代

g/p1/s//p2/g:将文件中所有p1均用p2替换

 

选项设置

all:列出所有选项设置情况

term:设置终端类型

ignorance:在搜索中忽略大小写

list:显示制表位(Ctrl+I)和行尾标志($)

number:显示行号

report:显示由面向行的命令修改过的数目

terse:显示简短的警告信息

warn:在转到别的文件时若没保存当前文件则显示NO write信息

nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符

nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始

mesg:允许vi显示其他用户用write写到自己终端上的信息

 

最后行方式命令

n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下

n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下

n1,n2 d :将n1行到n2行之间的内容删除

w :保存当前文件

e filename:打开文件filename进行编辑

x:保存当前文件并退出

q:退出vi

q!:不保存文件并退出vi

!command:执行shell命令command

n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指

n1n2,则表示将整个文件内容作为command的输入

r!command:将命令command的输出结果放到当前行

 

 

 

 

 

vi编辑器使用手册 (linux/unix)

 

作者:未知    文章来源:本站原创    点击数:115    更新时间:2005-6-4

 

 

 

1.1  vi 的工作模式

Vi 在初始启动后首先进入编辑模式,这时用户可以利用一些预先定义的按键来移动光标、删除文字、复制或粘贴文字等。这些按键均是普通的字符,例如 l 是向右移动光标,相当于向右箭头键,k 是向下移动光标,相当于向下箭头键。在编辑模式下,用户还可以利用一些特殊按键选定文字,然后再进行删除、或复制等操作。 

 

当用户在编辑模式下键入 i, a, o 等命令之后,可进入插入模式;键入 : 可进入命名模式。在插入模式下,用户随后输入的,除 Esc 之外的任何字符均将被看成是插入到编辑缓冲区中的字符。按 Esc 之后,从插入模式切换到编辑模式。 

 

在命令模式,Vi 将把光标挪到屏幕的最下方,并在第一个字符的位置显示一个 :(冒号)。这时,用户就可以键入一些命令。这些命令可用来保存文件、读取文件内容、执行 Shell 命令、设置 Vi 参数、以正则表达式的方式查找字符串或替换字符串等。 

 

1.2  编辑模式

1. 移动光标

要对正文内容进行修改,首先必须把光标移动到指定位置。移动光标的最简单的方式是按键盘的上、下、左、

右箭头键。除了这种最原始的方法之外,用户还可以利用 vi 提供的众多字符组合键,在正文中移动光标,迅

速到达指定的行或列,实现定位。例如:

kjhl      功能分别等同于上、下、左、右箭头键

Ctrl+b          在文件中向上移动一页(相当于 PageUp 键)

Ctrl+f          在文件中向下移动一页(相当于 PageDown 键)

H               将光标移到屏幕的最上行(Highest

nH              将光标移到屏幕的第 n

2H              将光标移到屏幕的第 2

M               将光标移到屏幕的中间(Middle

L               将光标移到屏幕的最下行(Lowest

nL              将光标移到屏幕的倒数第 n

3L              将光标移到屏幕的倒数第 3

w               在指定行内右移光标,到下一个字的开头

e               在指定行内右移光标,到一个字的末尾

b               在指定行内左移光标,到前一个字的开头

0               数字0,左移光标,到本行的开头

$               右移光标,到本行的末尾

^               移动光标,到本行的第一个非空字符

 

2. 替换和删除

将光标定位于文件内指定位置后,可以用其他字符来替换光标所指向的字符,或从当前光标位置删除一个或多

个字符。例如:

rc              c 替换光标所指向的当前字符

nrc             c 替换光标所指向的前 n 个字符

5rc             c 替换光标所指向的前 5 个字符

x               删除光标所指向的当前字符

nx              删除光标所指向的前 n 个字符

3x              删除光标所指向的前 3 个字符

dw              删除光标右侧的字

ndw             删除光标右侧的 n 个字

3dw             删除光标右侧的 3 个字

db              删除光标左侧的字

ndb             删除光标左侧的 n 个字

5db             删除光标左侧的 5 个字

dd              删除光标所在行,并去除空隙

ndd             删除 n 行内容,并去除空隙

3dd             删除 3 行内容,并去除空隙

 

3. 粘贴和复制

从正文中删除的内容(如字符、字或行)并没有真正丢失,而是被剪切并复制到了一个内存缓冲区中。用户可

将其粘贴到正文中的指定位置。完成这一操作的命令是:

p               小写字母 p,将缓冲区的内容粘贴到光标的后面

P               大写字母 P,将缓冲区的内容粘贴到光标的前面

如果缓冲区的内容是字符或字,直接粘贴在光标的前面或后面;如果缓冲区的内容为整行正文,则粘贴在当前

光标所在行的上一行或下一行。

注意上述两个命令中字母的大小写。vi 编辑器经常以一对大、小写字母(如 p P)来提供一对相似的功能

。通常,小写命令在光标的后面进行操作,大写命令在光标的前面进行操作。

有时需要复制一段正文到新位置,同时保留原有位置的内容。这种情况下,首先应当把指定内容复制(而不是

剪切)到内存缓冲区。完成这一操作的命令是:

yy              复制当前行到内存缓冲区

nyy             复制 n 行内容到内存缓冲区

5yy             复制 5 行内容到内存缓冲区

 

4. 搜索字符串

和许多先进的编辑器一样,vi 提供了强大的字符串搜索功能。要查找文件中指定字或短语出现的位置,可以

vi 直接进行搜索,而不必以手工方式进行。搜索方法是:键入字符 / ,后面跟以要搜索的字符串,然后

按回车键。编辑程序执行正向搜索(即朝文件末尾方向),并在找到指定字符串后,将光标停到该字符串的

开头;键入 n 命令可以继续执行搜索,找出这一字符串下次出现的位置。用字符 ? 取代 / ,可以实现反向

搜索(朝文件开头方向)。例如:

/str1           正向搜索字符串 str1

n               继续搜索,找出 str1 字符串下次出现的位置

?str2           反向搜索字符串 str2

无论搜索方向如何,当到达文件末尾或开头时,搜索工作会循环到文件的另一端并继续执行。

 

5. 撤销和重复

在编辑文档的过程中,为消除某个错误的编辑命令造成的后果,可以用撤消命令。另外,如果用户希望在新

的光标位置重复前面执行过的编辑命令,可用重复命令。

u               撤消前一条命令的结果

.               重复最后一条修改正文的命令

 

6. 文本选中

vi 可进入到一种成为 Visual 的模式,在该模式下,用户可以用光标移动命令可视地选择文本,然后再执行其他编辑操作,例如删除、复制等。 v 字符选中命令 V 行选中命令 

 

 

 

1.3  插入模式

1. 进入插入模式

在编辑模式下正确定位光标之后,可用以下命令切换到插入模式:

i               在光标左侧输入正文

a               在光标右侧输入正文

o               在光标所在行的下一行增添新行

O               在光标所在行的上一行增添新行

I               在光标所在行的开头输入正文

A               在光标所在行的末尾输入正文

上面介绍了几种切换到插入模式的简单方法。另外还有一些命令,它们允许在进入插入模式之前首先删去一段

正文,从而实现正文的替换。这些命令包括:

s               用输入的正文替换光标所指向的字符

ns              用输入的正文替换光标右侧 n 个字符

cw              用输入的正文替换光标右侧的字

ncw             用输入的正文替换光标右侧的 n 个字

cb              用输入的正文替换光标左侧的字

ncb             用输入的正文替换光标左侧的 n 个字

cd              用输入的正文替换光标的所在行

ncd             用输入的正文替换光标下面的 n

c$              用输入的正文替换从光标开始到本行末尾的所有字符

c0              用输入的正文替换从本行开头到光标的所有字符

 

2. 退出插入模式

退出插入模式的方法是,按 ESC 键或组合键Ctrl+[

 

 

1.4  命令模式

vi 的命令模式下,可以使用复杂的命令。在编辑模式下键入“:”,光标就跳到屏幕最后一行,并在那里显示冒号,此时已进入命令模式。命令模式又称“末行模式”,用户输入的内容均显示在屏幕的最后一行,按回车键,vi 执行命令。 

 

1. 退出命令

在编辑模式下可以用 ZZ 命令退出 vi 编辑程序,该命令保存对正文所作的修改,覆盖原始文件。如果只需要

退出编辑程序,而不打算保存编辑的内容,可用下面的命令:

: q             在未作修改的情况下退出

: q!            放弃所有修改,退出编辑程序

 

2. 行号与文件

编辑中的每一行正文都有自己的行号,用下列命令可以移动光标到指定行:

: n             将光标移到第 n

命令模式下,可以规定命令操作的行号范围。数值用来指定绝对行号;字符“.”表示光标所在行的行号;字符

符“$”表示正文最后一行的行号;简单的表达式,例如“.+5”表示当前行往下的第 5 行。例如:

:345                将光标移到第 345

:345w file      将第 345 行写入 file 文件

:3,5w file      将第 3 行至第 5 行写入 file 文件

:1,.w file      将第 1 行至当前行写入 file 文件

:.,$w file      将当前行至最后一行写入 file 文件

:.,.+5w file        从当前行开始将 6 行内容写入 file 文件

:1,$w file      将所有内容写入 file 文件,相当于 :w file 命令

在命令模式下,允许从文件中读取正文,或将正文写入文件。例如:

:w              将编辑的内容写入原始文件,用来保存编辑的中间结果

:wq             将编辑的内容写入原始文件并退出编辑程序(相当于 ZZ 命令)

:w file         将编辑的内容写入 file 文件,保持原有文件的内容不变

:a,bw file      将第 a 行至第 b 行的内容写入 file 文件

:r file         读取 file 文件的内容,插入当前光标所在行的后面

:e file         编辑新文件 file 代替原有内容

:f file         将当前文件重命名为 file

:f              打印当前文件名称和状态,如文件的行数、光标所在的行号等

 

3. 字符串搜索

给出一个字符串,可以通过搜索该字符串到达指定行。如果希望进行正向搜索,将待搜索的字符串置于两个“

/”之间;如果希望反向搜索,则将字符串放在两个“?”之间。例如:

:/str/                      正向搜索,将光标移到下一个包含字符串 str 的行

:?str?                      反向搜索,将光标移到上一个包含字符串 str 的行

:/str/w file                正向搜索,并将第一个包含字符串 str 的行写入 file 文件

:/str1/,/str2/w file        正向搜索,并将包含字符串 str1 的行至包含字符串 str2 的行写

                            file 文件

 

4. 正文替换

利用 :s 命令可以实现字符串的替换。具体的用法包括:

:s/str1/str2/       用字符串 str2 替换行中首次出现的字符串 str1

:s/str1/str2/g      用字符串 str2 替换行中所有出现的字符串 str1

:.,$ s/str1/str2/g  用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1

:1,$ s/str1/str2/g  用字符串 str2 替换正文中所有出现的字符串 str1

:g/str1/s//str2/g   功能同上

从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索

字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。

 

5. 删除正文

在命令模式下,同样可以删除正文中的内容。例如:

:d                  删除光标所在行

:3d                 删除 3

:.,$d               删除当前行至正文的末尾

:/str1/,/str2/d     删除从字符串 str1 str2 的所有行

 

6. 恢复文件

vi 在编辑某个文件时,会另外生成一个临时文件,这个文件的名称通常以 . 开头,并以 .swp 结尾。vi

正常退出时,该文件被删除,若意外退出,而没有保存文件的最新修改内容,则可以使用恢复命令:

:recover           恢复文件

也可以在启动 vi 时利用 -r 选项。

 

 

 

1.5  选项设置

为控制不同的编辑功能,vi 提供了很多内部选项。利用 :set 命令可以设置选项。基本语法为:

:set option         设置选项 option

常见的功能选项包括:

autoindent          设置该选项,则正文自动缩进

ignorecase          设置该选项,则忽略规则表达式中大小写字母的区别

number              设置该选项,则显示正文行号

ruler               设置该选项,则在屏幕底部显示光标所在行、列的位置

tabstop             设置按 Tab 键跳过的空格数。例如 :set tabstop=nn 默认值为 8

mk                  将选项保存在当前目录的 .exrc 文件中

 

 

1.6  shell 切换

在编辑正文时,利用 vi 命令模式下提供的 shell 切换命令,无须退出 vi 即可执行 Linux 命令,十分

方便。语法格式为:

:! command          执行完 shell 命令 command 后回到 vi

另外,在编辑模式下,键入 K ,可命令 vi 查找光标所在单词的手册页,相当于运行 man命令。

 

 

1.7  vim gvim 的高级特色

Vim 代表 Vi IMproved,如同其名称所暗示的那样,Vim 作为标准 UNIX 系统 vi 编辑器的提高版而存在。 Vim 除提供和 vi 编辑器一样强大的功能外,还提供有多级恢复、命令行历史以及命令及文件名补全等功能。 

 

gvim vi X Window 版本,该版本支持鼠标选中,一些高级光标移动功能,并且带有菜单和工具按钮。

 

 

 

 

 

 

 

以文本方式查看主题

 

-  龙行天下  (http://dephp.lync.edu.cn/grzy/dlg/bbs/index.asp)

--  LINUX学习  (http://dephp.lync.edu.cn/grzy/dlg/bbs/list.asp?boardid=5)

----  [原创]LinuxVi编辑器的使用技巧  (http://dephp.lync.edu.cn/grzy/dlg/bbs/dispbbs.asp?boardid=5&id=5)

 

--------------------------------------------------------------------------------

 

--  作者:天地志龙

--  发布时间:2004-12-15 22:47:08

 

--  [原创]LinuxVi编辑器的使用技巧

游标的移动

  本节所述皆是在 common-mode(c-mode,在 vim 又名 normal-mode)下的移动,原始的 vi 只能在 c-mode 移动,在 insert-mode 只做文字的输入,而不做游标的移动。当然 vim elvis 的方向键是不论在那一种 mode 皆可移动自如。

 

基本的游标移动

 

 

  h 左,或 Backspace 或方向键

  j 下,或 Enter +(要 Shift 键),或方向键

 

k 上,或 方向键或 -(不必 Shift 键)

  l 右,或 Space 或方向键

  Ctrl-f PageDown 翻页。

  Crtl-b PageUp 翻页。

 

使用 hjkl 键的移动是为了使手不必离开打字区(键盘中央的部位),

  以加快打字的速度,如果各位不习惯,那就使用方向键吧!

 

Backspace Space 的移动方式是到了行首或行尾时会折行,

  但方向键或 hl 键的移动则在行首或行尾时您继续按也不会折行。

  转折换行的功能是 vim 的扩充功能,elvis 无此功能。

 

jk 及使用方向键的上下移动游标会尽量保持在同一栏位。

  使用 Enter+- 的上下移动,游标会移至上(下)一行的

  第一个非空白字元处。

 

好像有点复杂,各位就暂时使用方向键来移动就简单明白了!

  等您爱上了 vim 后再来讲究吧。

  

 

进阶的游标移动

 

 

  0 是数目字 0 而不是英文字母 o。或是 Hmoe 键,移至行首,(含空白字元)。

  ^ 移至第一个非空白字元,注意,要 Shift 键。

  $ 移至行尾,或 End 键。要 Shift 键。

 

以上两个按键是源自规则表示式(regular expression),

  在 regexp ^ 是匹配行首,$ 是匹配行尾。

  

 

G 移至档尾(最后一行的第一个非空白字元处)

  gg □至档首(第一行之第一个非空白字元处)

 

gg vim 的扩充功能,在 elvis 或原始 vi 中可用 1G

  移至档首(是数字 1 不是英文字 l)。

 

G 之原意是 goto,指移至指定数目之行首,如不指定数目,

  则预设是最后一行。

  

 

w 移至次一个字(word)字首。当然是指英文单字。

  W 同上,但会忽略一些标点符号。

  e 移至前一个字字尾。

  E 同上,但会忽略一些标点符号。

  b 移至前一个字字首。

  B 同上,但会忽略一些标点符号。

  H 移至萤幕顶第一个非空白字元。

  M 移至萤幕中间第一个非空白字元。

  L 移至萤幕底第一个非空白字元。

 

这和 PageDownPageUp 不一样,内文内容并未动,

  只是游标在动而已。

  

 

n| 移至第 n 个字元()处。注意,要用 Shift 键。n 是从头起算的。

  :n 移至第 n 行行首。或 nG

  特殊的移动

 

 

  ) 移至下一个句子(sentence)首。

  ( 移至上一个句子(sentence)首。

  } 移至下一个段落(paragraph)首。

  { 移至上一个段落(paragraph)首。

 

sentence 是以 . ! ? 为区格。paragraph 是以空白行为区格。

  

 

% 这是匹配 {}[]() 用的,例如您的游标现在在 { 上只要按 %,就会跑到相匹配的 } 上。写程式时满好用的。

  另还有一些 vim 的特殊按键,但这得留待最后才来讲述,否则各位恐怕会头昏眼花了。

 

 

  基本编辑指令

  这个单元就开始进入主题了。下编辑指令都是在 commond-mode (c-mode),就是您一进入 vim 时的模式,只能下指令,不能键入文字。如果印象模糊,请瞄一下第一个单元的内容。这个单元说的是基本的指令,有些比较特殊的编辑指令,因为太有个性了,所以会独立成一个单元来说明。

 

进入 i-mode 的指令

 

 

   i 在游标所在字元前开始输入文字(insert)

  a 在游标所在字元后开始输入文字(append)

  o 在游标所在行下开一新行来输入文字(open)

  I 在行首开始输入文字。

   此之行首指第一个非空白字元处,要从真正的第一个字元处开始输人文字,

  可使用 0i gI(vim)

  

 

A 在行尾开始输入文字。

   这个好用,您不必管游标在此行的什么地方,

  只要按 A 就会在行尾等著您输入文字。

  

 

O 在游标所在行上开一新行来输入文字。

  J 将下一行整行接至本行(Joint)

   并无相对的 split 功能,可在 i-mode 下按 Enter 来达成

  

 

,当然如果您熟 macro 的话,可自行定义。

   使用 J 时,预设会消去本行的 EOL,且上下行接缝间会留下一个空白字元,

  这符合英文习惯,却对中文会造成困扰,欲不留空白字元,

  可使用 gJ(大写 J)指令,但这是 vim 的扩充功能,elvis 不适用。

 

请您随便找一个档案来试看看,光看文字说明太抽象了。

  

 

删除指令

 

 

  x 删除游标所在处之字元。在 vim elvis 亦可用 Del 键。

  X 删除游标前之字元。不可使用 Spaceback 键。

   vim 可以正确使用以上两个指令于中文,会删去一个中文字 elvis 则不行,

  一个中文字要删两次,即使用 xx

 

dd 删除一整行(delete line)

  dw 删除一个字(delete word)。不能适用于中文。

  dG 删至档尾。

  d1G 删至档首。或 dgg(只能用于 vim)

  D 删至行尾,或 d$(含游标所在处字元)。

  d0 删至行首,或 d^(不含游标所在处字元)。

   请回忆一下 $ ^ 所代表的意义,您就可以理解 d$ d^ 的动作,

  这就是 vi(m) 可爱之处。

  

 

取代及还原

 

 

  r 取代游标所在处之字元。vi(m) 很有个性的,您在 c-mode 按了 r 她就会停在那里等主人键入所要替代的字元,希望您这个当主人的,不要傻呼呼的也楞在那里,赶快键入您的新字元吧!

   vim 中可用于中文字,也就是可以替换一个中文字,elvis 则不行。

  当然您的 vim 是要设在 taiwan 的才行。怎么样!有没有看过如此

  有个性的取代方式?ㄚ!r 就是 replace 啦!

  

 

R 取代字元至按 Esc 为止。

  cc 取代整行内容。或大写 S 亦可。

  cw 替换一个英文字(word),中文不适用。(change)

  ~ 游标所在处之大小写互换。当然不能用于中文。别忘了 Shift

  C 取代至行尾,即游标所在处以后的字都会被替换。或 c$

  c0 取代至行首,或 c^

  s 替换一个字元为您所输入的字串。和 R 不同,R 是覆盖式的取代,s 则是插入式的取代,您可亲自实验看看。ㄟ!是小写的 s

  u 这个太重要了,就是 undo,传统的 vi 仅支援一次 undovim elvis 就不只了,vim 是没有限制的。

  U 在游标没离开本行之前,回复所有编辑动作。

  Crtl+r 这个也是很重要,就是 redo 键。

  加上数目字

  喔!骚到 vi(m) 的痒处了,这是 vi(m) 一个非常骚包的功能,只此一家别无分号(当然同源的 edsed 等不在此限)。就是您可以在大部份的指令前加上数目字,代表要处理几次的意思。以下用实例来说明比较清楚。

 

5dd 删除游标所在处(含)起算以下五行内容。妙吧!

  3r 按了 3r 后,您键入一个英文字,则三个字元皆会被您所键入的英文取代。很抱歉,这不能用于中文。

  5J 将五行合并成一行。

  3x 删除三个字元。抱歉,不能用于中文。

  5i A 然后按 Ecs,插入五个 A。中文也可以!

  2i system Esc 插入 systemsystem。中文也可以!

  5G 游标移至第五行,是从档首开始起算。

  5l 移至右第五个字元处,当然 j 是可以用方向键取代的。所有移动指令(参考第二单元)都可以加上数目字来控制,中文也通喔!elvis 当然是不能用于中文。

  其它的指令和数目字结合,就留待各位去发掘吧!最重要的是请您亲自操作看看,使用 vi(m) 常常要动动脑筋,会有更妙的操作方式。

 

[此贴子已经被作者于2004-12-15 23:22:31编辑过]

--------------------------------------------------------------------------------

 

--  作者:天地志龙

--  发布时间:2004-12-15 22:50:57

 

-- 

简单重排功能

 

 

  >> 整行向右移一个 shiftwidth(预设是 8 个字元,可重设)。

  << 整行向左移一个 shiftwidth(预设是 8 个字元,可重设)。

   :set shiftwidth? 可得知目前的设定值。:set shiftwidth=4

  可马上重设为 4 个字元。shiftwidth 可简写成 sw。ㄟ,别忘了 Shift 键!

  

 

:ce(nter) 本行文字置中。注意是冒号命令!

  :ri(ght) 本行文字靠右。

  :le(ft) 本行文字靠左。

   所谓置中、靠左右,是参考 textwidth(tw) 的设定。

  如果 tw 没有设定,预设是 80,就是以 80 个字元为总宽度为标准来置放。

  当然您也可以如 sw 一样马上重设。

  

 

gqip 整段重排。中文会出槌!

  gqq 本行重排。

   重排的依据也是 textwidth。这里的重排是指您键入文字时没有按 Enter 键,

  就一直在 keyin,这样会形成一个很长的一行(虽然萤幕上会替您做假性折行),

  重排后,则会在每一行最后加入 EOLgq 重排功能是 vim 才有的功能。

 

 

  复制(yank)

  yank 是什么意思?有疑问的请查一下字典吧!就好像是中医治疗中的「拔罐」的意思啦(是不是叫「拔罐」?知道的朋友指正一下吧)!反正在 vi(m) 中,她就是复制 copy 的意思。这在 vi(m) 的思考逻辑里,就是「拔」yank 起来,「放」put 上去。其实复制的指令就是 y 一个而已,为什么要独立成一个单元来说明呢?因为 vi(m) 复制、贴上的功能实在太独特了,再配合前面介绍的数目字,及 vi(m) 内部的缓冲区来使用的话,您会发现,原来 vi(m) 肚子里还暗藏著秘密武器。

 

指令说明

 

 

  yy 复制游标所在行整行。或大写一个 Y

  2yy y2y 复制两行。ㄟ,请举一反三好不好!

  y^ 复制至行首,或 y0。不含游标所在处字元。

  y$ 复制至行尾。含游标所在处字元。

  yw 复制一个 word

  y2w 复制两个字。

  yG 复制至档尾。

  y1G 复制至档首。

  p 小写 p 代表贴至游标后(下)。

  P 大写 P 代表贴至游标前(上)。

   整行的复制,按 p P 时是插入式的贴在下(上)一行。

  非整行的复制则是贴在游标所在处之后(前)。

  

 

"ayy 将本行文字复制到 a 缓冲区

   a 可为 26 个英文字母中的一个,如果是小写的话,原先的

  内容会被清掉,如果是大写的话是 append 的作用,会把内

  容附加到原先内容之后。

 

" Enter 键隔壁的那一个同上符号(ditto marks)。

  

 

"ap a 缓冲区的内容贴上。

   缓冲区的术语在 vim 称为 registersvim 扩充了相当多的

  功能,有兴趣深入的朋友请 :h registers。您用 dcs

  xy 等指令改变或删除的内容都是放在 registers 中的。

  例如:您用 dd 删除的一行,也是可以使用 p 来贴上的。只

  要是在缓冲区的内容都可以使用 p 来贴上,不是一定要 y

  来的内容才能用 p。因此您认为 p paste 也可以,认为是

  put 可能较正确。

  

 

5"ayy 复制五行内容至 a 缓冲区。

  5"Ayy 再复制五行附在 a 内容之后,现在 a 中有十行内容了!

   ㄟ!不要我一直用 a 您就认为只有 a 可以用喔。26 个英文

  字母都可以的,交叉运用下,您会发觉 vi(m) 肚量不小。

 

问题来了!忘记谁是谁的时候怎么办? :reg(冒号命令)就

  会列出所有 registers 的代号及内容。您现在就试著按看看

  咦!怎么还有数目字、特殊符号的缓冲区,原来您刚刚删除

  (复制)的内容就预设放在 " 这个缓冲区,然后依序是

  0,1,2,...9。也就是说您按 p 不加什么的话,是取出 "

  冲区的内容的。% 指的是目前编辑的档案,# 指的是前一次

  编辑的档案。还有其它的呀!因为没什么重要,就请

  :h registers 吧!registers 有个 "s" 结尾,不要搞错了,

 

而且 Tab 的补全键 vim 也支援的,也就是说您键入 :h regi

  再按 Tab 键,vim 就会帮您补全,按了 Tab 后发现不是您要

  的,那就继续按,总会出现您要的。

 

Tab 补全的功能,elvis 也有,但叫出 registers 列表的命令

  则没有,您得自行记忆在您的脑袋瓜子里。而且 elvis 的补全

  能力并没 vim 强。

  

 

天大的指令

  . 这是什么?ㄚ,是英文句点啦!没错,就是英文句点。什么意思?重复前次的编辑动作。这个指令太高明了,只要是编辑动作(移动游标不算,冒号命令也不算)都可以按英文句点来重复,要重复几次都可以。

 

例如:您按了 yy,然后按 p 就会复制、贴上一整行,如果要重复这个动作的话,就可以按 . ,也可以把游标移到其它地方后再按。其它 dddwrcw 等编辑指令都可以这样来重复。如果您要重复做某些编辑动作时,千万千万一定要想到有这么一个英文句点重复指令。ㄚ,拜托啦!您一定要常用这个指令。

 

疑难杂症

 

 

  那 mouse 中键的剪贴功能还有吗?当然还有,不管在 console X terminal 中都照用不误。当然在 windows 下的话就不能用了,可以用 Shift-Insert 来代替。Ctrl-v vim 中另有作用,在 windows 下就不必去麻烦它了。

  ㄟ,我从 netscape mouse copy 东东过来的时候,常常都搞得天下大乱耶!要设成 :set paste,预设是 map F9 键的,您要 copy 之前先按一下 F9copy 完后再按一次 F9 来回复。这是 vim 的扩充功能,elvis 没有。那在 elvis 怎么办?只好 :set noai 了。在 GUI 的版本应不会有这种情形。

   set 的功能先不必去理它,往后会有一个单元专门讨论。

  

 

朋友!您睡著了吗?不要被吓到了,您只要开个档案,亲自操作一下就能心领神会。那用 mouse 不是更方便吗?不见得,yyp 来复制贴上一整行比较快,还是用 mouse 来拉比较快?您可以试看看。

 

 

  寻找/替换

  搜寻、替换的功能几乎是每个编辑器必备的功能,那在 vi(m) 中有没有特殊的地方呢?当然有,您忘了,vi(m) 是个性十足的编辑器。最特殊的地方是和规则表示式(regular expression,简称 regexp) 结合在一起。简单的说她是一种 pattern 的表示法,在执行动作,如寻找或替换,就会依据这个 pattern 去找,所有符合 pattern 的地方就会执行您所下的动作。在这个单元里不讨论 regexp,会另立一个单元来探讨,以免搞得头昏脑胀。目前就暂不使用 regexp,您要找什么就直接键入什么就对了。

 

寻找

 

 

  / c-mode 的情形下,按 / 就会在左下角出现一个 /,然后键入您要寻找的字串,按个 Enter 就会开始找。

  ? / 相同,只是 / 是向前(下)找,? 则是向后(上)找。

  n 继续寻找。

  N 继续寻找(反向)。

  更方便的寻找操作(vim 才有)

 

 

  * 寻找游标所在处之 word(要完全符合)。

  # 同上,但 * 是向前(下)找,# 则是向后(上)找。

  g* * ,但部份符合即可。

  g# # ,但部份符合即可。

   n,N 之继续寻找键仍适用。

  

 

替换(substitute)

  :[range]s/pattern/string/[c,e,g,i]

 

range 指的是范围,1,7 指从第一行至第七行,1,$ 指从第一行至最后一行,也就是整篇文章,也可以 % 代表。

   还记得吗? % 是目前编辑的文章,# 是前一次编辑的文章。

  

 

 

  pattern 就是要被替换掉的字串,可以用 regexp 来表示。

 

string pattern string 所取代。

 

c confirm,每次替换前会询问。

 

e 不显示 error

 

g globe,不询问,整行替换。

 

i ignore 不分大小写。

   g 大概都是要加的,否则只会替换每一行的第一个符合字串。

  可以合起来用,如 cgi,表示不分大小写,整行替换,替换前

  要询问是否替换。

  

  [实例] :%s/Edwin/Edward/g

  这样整编文章的 Edwin 就会替换成 Edward

 

更进阶的寻找、替换的例子在说明 regexp 的时候还会再详述。目前只知道最基本的用法就可以了!其实光这样就非常好用了。

 

书签功能

  这又是 vi(m) 的一个秘密武器,简单的说,您可以在文章中的某处做个记号(marks),然后跑到其它地方去编辑,在呼叫这个 mark 时又会回到原处。妙吧!

 

mx x 代表 26 个小写英文字母,这样游标所在处就会被 mark

  `x 回到书签原设定位置。

   ` backward quote,就是 Tab 键上面那一个。

  

 

\'x 回到书签设定行行首。

   \' forward quote,是 Enter 键隔壁那一个。

  

 

vim 对于书签的扩充功能

 

 

  小写字母 只作用于单一档案内。

  大写字母 可作用于编辑中之各档案间。

  数目字 可作用于前次编辑的十个档案。

   数目字的用法比较特殊,\'0 是回到前一次编辑档案中离开

  前的最后位置,\'1 则是回到前二次编辑档案的最后位置,

  依此类推。您不必使用 m 来标示,vim 会自动记忆。

  很玄吧!其实这是 viminfo 的功能,您要认真追究的话,

  请 :h viminfo-file-marksviminfo 关掉,就没这个功能了!

 

所谓前次指的是前次启动的 vim

  

 

:marks 得知目前所有书签的列表。

 

 find . -name "*.c"|xargs grep get_offset_leng

 

万年编辑器:VI

万年编辑器: vi

·vi 的工作模式

·编辑模式

·插入模式

·命令模式

·shell 切换

·选项设置

·vim gvim 的高级特色

1.1 vi 的工作模式

Vi 在初始启动后首先进入编辑模式,这时用户可以利用一些预先定义的按键来移动光标、删除文字、复制或粘贴文字等。这些按键均是普通的字符,例如 l 是向右移动光标,相当于向右箭头键,k 是向下移动光标,相当于向下箭头键。在编辑模式下,用户还可以利用一些特殊按键选定文字,然后再进行删除、或复制等操作。

当用户在编辑模式下键入 i, a, o 等命令之后,可进入插入模式;键入 : 可进入命名模式。在插入模式下,用户随后输入的,除 Esc 之外的任何字符均将被看成是插入到编辑缓冲区中的字符。按 Esc 之后,从插入模式切换到编辑模式。

在命令模式,Vi 将把光标挪到屏幕的最下方,并在第一个字符的位置显示一个 :(冒号)。这时,用户就可以键入一些命令。这些命令可用来保存文件、读取文件内容、执行 Shell 命令、设置 Vi 参数、以正则表达式的方式查找字符串或替换字符串等。

1.2 编辑模式

1. 移动光标

要对正文内容进行修改,首先必须把光标移动到指定位置。移动光标的最简单的方式是按键盘的上、下、左、右箭头键。除了这种最原始的方法之外,用户还可以利用 vi 提供的众多字符组合键,在正文中移动光标,迅速到达指定的行或列,实现定位。例如:

kjhl 功能分别等同于上、下、左、右箭头键

Ctrl+b 在文件中向上移动一页(相当于 PageUp 键)

Ctrl+f 在文件中向下移动一页(相当于 PageDown 键)

H 将光标移到屏幕的最上行(Highest

nH 将光标移到屏幕的第 n

2H 将光标移到屏幕的第 2

M 将光标移到屏幕的中间(Middle

L 将光标移到屏幕的最下行(Lowest

nL 将光标移到屏幕的倒数第 n

3L 将光标移到屏幕的倒数第 3

w 在指定行内右移光标,到下一个字的开头

e 在指定行内右移光标,到一个字的末尾

b 在指定行内左移光标,到前一个字的开头

0 数字0,左移光标,到本行的开头

$ 右移光标,到本行的末尾

^ 移动光标,到本行的第一个非空字符

2. 替换和删除

将光标定位于文件内指定位置后,可以用其他字符来替换光标所指向的字符,或从当前光标位置删除一个或多个字符。例如:

rc c 替换光标所指向的当前字符

nrc c 替换光标所指向的前 n 个字符

5rc c 替换光标所指向的前 5 个字符

x 删除光标所指向的当前字符

nx 删除光标所指向的前 n 个字符

3x 删除光标所指向的前 3 个字符

dw 删除光标右侧的字

ndw 删除光标右侧的 n 个字

3dw 删除光标右侧的 3 个字

db 删除光标左侧的字

ndb 删除光标左侧的 n 个字

5db 删除光标左侧的 5 个字

dd 删除光标所在行,并去除空隙

ndd 删除 n 行内容,并去除空隙

3dd 删除 3 行内容,并去除空隙

3. 粘贴和复制

从正文中删除的内容(如字符、字或行)并没有真正丢失,而是被剪切并复制到了一个内存缓冲区中。用户可将其粘贴到正文中的指定位置。完成这一操作的命令是:

p 小写字母 p,将缓冲区的内容粘贴到光标的后面

P 大写字母 P,将缓冲区的内容粘贴到光标的前面

如果缓冲区的内容是字符或字,直接粘贴在光标的前面或后面;如果缓冲区的内容为整行正文,则粘贴在当前光标所在行的上一行或下一行。

注意上述两个命令中字母的大小写。vi 编辑器经常以一对大、小写字母(如 p P)来提供一对相似的功能。通常,小写命令在光标的后面进行操作,大写命令在光标的前面进行操作。

有时需要复制一段正文到新位置,同时保留原有位置的内容。这种情况下,首先应当把指定内容复制(而不是剪切)到内存缓冲区。完成这一操作的命令是:

yy 复制当前行到内存缓冲区

nyy 复制 n 行内容到内存缓冲区

5yy 复制 5 行内容到内存缓冲区

4. 搜索字符串

和许多先进的编辑器一样,vi 提供了强大的字符串搜索功能。要查找文件中指定字或短语出现的位置,可以用 vi 直接进行搜索,而不必以手工方式进行。搜索方法是:键入字符 / ,后面跟以要搜索的字符串,然后按回车键。编辑程序执行正向搜索(即朝文件末尾方向),并在找到指定字符串后,将光标停到该字符串的开头;键入 n 命令可以继续执行搜索,找出这一字符串下次出现的位置。用字符 ? 取代 / ,可以实现反向搜索(朝文件开头方向)。例如:

/str1 正向搜索字符串 str1

n 继续搜索,找出 str1 字符串下次出现的位置

?str2 反向搜索字符串 str2

无论搜索方向如何,当到达文件末尾或开头时,搜索工作会循环到文件的另一端并继续执行。

5. 撤销和重复

在编辑文档的过程中,为消除某个错误的编辑命令造成的后果,可以用撤消命令。另外,如果用户希望在新的光标位置重复前面执行过的编辑命令,可用重复命令。

u 撤消前一条命令的结果

. 重复最后一条修改正文的命令

6. 文本选中

vi 可进入到一种成为 Visual 的模式,在该模式下,用户可以用光标移动命令可视地选择文本,然后再执行其他编辑操作,例如删除、复制等。 v 字符选中命令 V 行选中命令

 

#DEMO#

1.3 插入模式

1. 进入插入模式

在编辑模式下正确定位光标之后,可用以下命令切换到插入模式:

i 在光标左侧输入正文

a 在光标右侧输入正文

o 在光标所在行的下一行增添新行

O 在光标所在行的上一行增添新行

I 在光标所在行的开头输入正文

A 在光标所在行的末尾输入正文

上面介绍了几种切换到插入模式的简单方法。另外还有一些命令,它们允许在进入插入模式之前首先删去一段正文,从而实现正文的替换。这些命令包括:

s 用输入的正文替换光标所指向的字符

ns 用输入的正文替换光标右侧 n 个字符

cw 用输入的正文替换光标右侧的字

ncw 用输入的正文替换光标右侧的 n 个字

cb 用输入的正文替换光标左侧的字

ncb 用输入的正文替换光标左侧的 n 个字

cd 用输入的正文替换光标的所在行

ncd 用输入的正文替换光标下面的 n

c$ 用输入的正文替换从光标开始到本行末尾的所有字符

c0 用输入的正文替换从本行开头到光标的所有字符

2. 退出插入模式

退出插入模式的方法是,按 ESC 键或组合键Ctrl+[

#DEMO#

1.4 命令模式

vi 的命令模式下,可以使用复杂的命令。在编辑模式下键入“:”,光标就跳到屏幕最后一行,并在那里显示冒号,此时已进入命令模式。命令模式又称“末行模式”,用户输入的内容均显示在屏幕的最后一行,按回车键,vi 执行命令。

1. 退出命令

在编辑模式下可以用 ZZ 命令退出 vi 编辑程序,该命令保存对正文所作的修改,覆盖原始文件。如果只需要

退出编辑程序,而不打算保存编辑的内容,可用下面的命令:

: q 在未作修改的情况下退出

: q! 放弃所有修改,退出编辑程序

2. 行号与文件

编辑中的每一行正文都有自己的行号,用下列命令可以移动光标到指定行:

: n 将光标移到第 n 行命令模式下,可以规定命令操作的行号范围。数值用来指定绝对行号;字符“.”表示光标所在行的行号;字符

符“$”表示正文最后一行的行号;简单的表达式,例如“.+5”表示当前行往下的第 5 行。例如:

:345 将光标移到第 345

:345w file 将第 345 行写入 file 文件

:3,5w file 将第 3 行至第 5 行写入 file 文件

:1,.w file 将第 1 行至当前行写入 file 文件

:.,$w file 将当前行至最后一行写入 file 文件

:.,.+5w file 从当前行开始将 6 行内容写入 file 文件

:1,$w file 将所有内容写入 file 文件,相当于 :w file 命令

在命令模式下,允许从文件中读取正文,或将正文写入文件。例如:

:w 将编辑的内容写入原始文件,用来保存编辑的中间结果

:wq 将编辑的内容写入原始文件并退出编辑程序(相当于 ZZ 命令)

:w file 将编辑的内容写入 file 文件,保持原有文件的内容不变

:a,bw file 将第 a 行至第 b 行的内容写入 file 文件

:r file 读取 file 文件的内容,插入当前光标所在行的后面

:e file 编辑新文件 file 代替原有内容

:f file 将当前文件重命名为 file

:f 打印当前文件名称和状态,如文件的行数、光标所在的行号等

3. 字符串搜索

给出一个字符串,可以通过搜索该字符串到达指定行。如果希望进行正向搜索,将待搜索的字符串置于两个“/”之间;如果希望反向搜索,则将字符串放在两个“?”之间。例如:

:/str/ 正向搜索,将光标移到下一个包含字符串 str 的行

:?str? 反向搜索,将光标移到上一个包含字符串 str 的行

:/str/w file 正向搜索,并将第一个包含字符串 str 的行写入 file 文件

:/str1/,/str2/w file 正向搜索,并将包含字符串 str1 的行至包含字符串str2 的行写入 file 文件

4. 正文替换

利用 :s 命令可以实现字符串的替换。具体的用法包括:

:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1

:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1

:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1

:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1

:g/str1/s//str2/g 功能同上从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。

 

vi编辑中替换'^M'字符 关键是^M 字符的输入: 输入方式先按:ctrl+v,再按:enter

 

 

5. 删除正文

在命令模式下,同样可以删除正文中的内容。例如:

:d 删除光标所在行

:3d 删除 3

:.,$d 删除当前行至正文的末尾

:/str1/,/str2/d 删除从字符串 str1 str2 的所有行

6. 恢复文件

vi 在编辑某个文件时,会另外生成一个临时文件,这个文件的名称通常以 . 开头,并以 .swp 结尾。vi

正常退出时,该文件被删除,若意外退出,而没有保存文件的最新修改内容,则可以使用恢复命令:

:recover 恢复文件

也可以在启动 vi 时利用 -r 选项。

#DEMO#

#DEMO#

1.5 选项设置

为控制不同的编辑功能,vi 提供了很多内部选项。利用 :set 命令可以设置选项。基本语法为:

:set option 设置选项 option

常见的功能选项包括:

autoindent 设置该选项,则正文自动缩进

ignorecase 设置该选项,则忽略规则表达式中大小写字母的区别

number 设置该选项,则显示正文行号

ruler 设置该选项,则在屏幕底部显示光标所在行、列的位置

tabstop 设置按 Tab 键跳过的空格数。例如 :set tabstop=nn 默认值为 8

mk 将选项保存在当前目录的 .exrc 文件中

#DEMO#

1.6 shell 切换

在编辑正文时,利用 vi 命令模式下提供的 shell 切换命令,无须退出 vi 即可执行 Linux 命令,十分方便。语法格式为:

:! command 执行完 shell 命令 command 后回到 vi

另外,在编辑模式下,键入 K ,可命令 vi 查找光标所在单词的手册页,相当于运行 man命令。

#DEMO#

1.7 vim gvim 的高级特色

Vim 代表 Vi IMproved,如同其名称所暗示的那样,Vim 作为标准 UNIX 系统 vi 编辑器的提高版而存在。 Vim 除提供和 vi 编辑器一样强大的功能外,还提供有多级恢复、命令行历史以及命令及文件名补全等功能。

gvim vi X Window 版本,该版本支持鼠标选中,一些高级光标移动功能,并且带有菜单和工具按钮。

#DEMO#

 

 

1.vi技巧--在正在编辑的文件中大开另一个文件,并copy

另一文件的指定行数的内容到先打开的文件中:

1).首先打开用vi打开一文件,保证文件存盘;

2).在命令模式下输入e filenmae

3).将光标移动到要copy内容的首行,依次输入shift+",

   选择缓冲区(a-z)26个中其中之一,然后输入要copy的行数,

   然后在按"yy",然后输入"e#"退出当前copy文件回到先前,

   打开的文件,把光标移动到要粘贴出,按下shift+",最后

   按下刚才选择的缓冲区的字母,即可。

2.在同一文件中copyparse

  将光标移动到要copy的首行,输入要copy的行数然后按“y,内容

  就被copy,将光标移动到要粘贴的位置,按下"p"即可粘贴;

3.设置书签

  将光标移动到要设置书签的行处按"m",然后输入书签名,标签就设置好了;

  用书签是只要按“',然后输入书签名,光标就跳的设置书签的行数;

4.按两下“c”删除光标所在的行,并进入插入模式;按“零”光标移到

  光标所在行的行首;按“$”光标移到光标所在行的行末;在光标所在行

  处按大写的“J”,会把下一行的内容移到上一行。

5.shift+d删除光标所在行后面的部分。

6.shift+j将光标所在行字符移到上一行的末尾。~大写变小写,小写变大写;

7. vi filename* 打开所有以filename开头的文件,打开后用:n命令会依次

   跳到不同文件进行编辑.

   vi `grep -l searchname *.c` 在当前目录下打开所有.c文件中包含searchname的文件;

  :e#回到上一编辑文件

 

vi file1 file2

---- yy 在文件1的光标处拷贝所在行

---- :n 切换到文件2 (n=next)

---- p 在文件2的光标所在处粘贴所拷贝的行

---- :n file1 回到file1文件

 

8. tlrpwd -i inst_no  显示机构号为:inst_no所有柜员的编号。

9.连续修改单词为另一同一单词:

1).先把光标移到要修改的单词开头,然后按下"cw",对此单词进行修改,输入完之  ,回到命令行状态;

2).要修改其他单词为刚才输入的单词时,只需要把光标移到要修改单词的开头

然后按"."号就可将该单词修改为刚才输入的单词;

c$从光标位置修改到行末;c0从光标位置修改到行首

10.vi中执行shell命令:

   在命令模式下输入sh,vi会自动跳到shell命令行下,然后可以执行shell命令了,

   shell命令下输入exit又可回到vi界面进行编写.

11.修改包含某一字符串的文件可与grep命令结合使用,如欲编辑当前目录下含有abc字串的所有C源程序

vi`grep l abc .c`

12.编辑在缓存中的两个文件快速切换命令: e Ctrl^ 使用Ctrl^ 命令更便捷,但如终端类

型不正确该功能将无效。

  4.将一个文件的部分内容读入另一文件中,有以下两种操作方式:

  (1)将欲读入的内容用w命令写入一临时文件,再用r命令读入。该方法笨拙,临时文件需清理。

  (2)将欲读入的内容写入一临时缓存器后再切换到目标文件,将光标移至需读入内容处,从缓存器中提出。

  写入缓存器a命令:起始行mk 结束行″ay'k

  从缓存器a中提出:″ap

  该方法操作方便快捷,不会产生垃圾文件

13.替换命令的特殊处理:文件行首用^标识,行尾用$标识。

  如:1s/^/abc/g 表示文件行首加入abc字串

    1.s//abc/g 表示文件首行至光标所在行行尾加入abc字串

  3,15s/from/this/g  表示文件3行到15行替换

  1,$s/    /this/g 表示从第一行到结尾所有的tab键用this替换掉,tab的输入直接输入tab,直接按tab

  1,$s/space(直接按空格)*$//g 删除所有行尾的空格

  :s/s1/s2       replace (``substitute'') (the first) s1 in this line by s2

  :lr/s/s1/s2/g  replace all instances of s1 in the line range lr by s2

                    (lr is of form `a,b', where a and b are either explicit

                    line numbers, or . (current line) or $ (last line)

 

1,$ s/str1/str2/g  用字符串 str2 替换正文中所有出现的字符串 str1

:g/str1/s//str2/g   功能同上

从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索

字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。

 

 

:3r /etc/passwd”从新文件的第3行开始读入 /etc/passwd的所有内

 

我们还可以使用以下方法删掉文件中所有的空行及以#开始的注释行。

---- #cat squid.conf.default | grep -v '^$' | grep -v '^#'

14.yw copy一个单词,yE copy一个串,dw删除一个单词,dE删除一个串,d$从光标当前位置删除到行尾,d0从光标当前位置删除到行首;d+G从当前行删除到文件结束;d+H从当前行删除到文件的开头;w >> filename 把当前文件

内容追加到文件filename;":numj!"num行合成一行;":%j!"把当前行一下的所有的行的合成一行;

d1G 刪除游標所在到第一行的所有資料

dG 刪除游標所在到最後一行的所有資料

15.set sw=4设置>>或者<<移动的空格数 set ai enter时会自动和上一行对齐;set ts=4 设置tab键为4ge空格

16.r 修改当前字符,R修改当前字符以后的字符,输入几个就修改几个;

16.vi的特殊字符

^

Beginning of the line. (At the beginning of a search expression.)

.

Matches a single character.

*

Matches zero or more of the previous character.

$

End of the line (At the end of the search expression.)

[

Starts a set of matching, or non-matching expressions... For example: /f[iae]t matches either of these: fit fat fet In this form, it matches anything except these: /a[^bcd] will not match any of these, but anything with an a and another letter: ab ac ad

< 

Put in an expression escaped with the backslash to find the ending or beginning of a word. For example: /\<the\> should find only word the, but not words like these: there and other.

> 

See the '<' character description above.

 

 

 

g/\#include/d      delete all lines that have include directives

        :g!/\#define/p      print lines that are not define statements

        :g/^\/\*/p          print lines that start with /*

        :g/^[ ^I]*$/d       delete empty lines as well as lines with only tabs

                            or spaces

        :g/strcmp/d5        delete lines that have strcmp in them as well

                            as the following 4 line


17.:n1,n2 m n3             n1-n2 行的資料般移到 n3 行之後

:n1,n2 co n3             n1-n2 行的資料複製到 n3 行之後


只有注册用户登录后才能发表评论。


网站导航:
 

posts - 0, comments - 0, trackbacks - 0, articles - 16

Copyright © 子期