vi的命令

 

进入vi的命令 1

移动光标类命令 1

屏幕翻滚类命令 2

编辑插入文本类命令 2

删除命令 4

搜索及替换命令 4

选项设置 5

组合命令 6

最后行方式命令 9

寄存器操作 10

进入vi的命令

vi filename :打开或新建文件,并将光标置于第一行首 
vi +n filename :打开文件,并将光标置于第n行首 
vi + filename :打开文件,并将光标置于最后一行首 
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处 
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename 
vi filename....filename :打开多个文件,依次进行编辑 

移动光标类命令

h :光标左移一个字符 
:光标右移一个字符 
space:光标右移一个字符 
Backspace:光标左移一个字符 
kCtrl+p:光标上移一行 
jCtrl+n :光标下移一行 
Enter :光标下移一行 
w:光标右移一个字至字首 
b:光标左移一个字至字首 
e:光标右移一个字至字尾 
:光标移至句尾 
:光标移至句首 
}:光标移至段落开头 
{:光标移至段落结尾 


nG:光标移至第n行首 
n+:光标下移n 
n-:光标上移n 
n$:光标移至第n行尾 
:光标移至屏幕顶行 
:光标移至屏幕中间行 
:光标移至屏幕最后行 
0:(注意是数字零)光标移至当前行首 
$:光标移至当前行尾 

^  光标移到行首 
f  光标移到当前光标位置后面的第一个指定的字符下

F  光标移到当前光标位置前面的第一个指定的字符下

t  光标移到当前光标位置后面的第一个指定的字符前

T  光标移到当前光标位置前面的第一个指定的字符前

%  光标移动到与当前括号匹配的括号处

:n  光标移动到指定行

按数字:0:移到文章的开头。

G:移动到文章的最后。

w:光标跳到下个字的开头 

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

b:光标回到上个字的开头 

按:#l:光标移到该行的第#个位置,如:5l,56l

跳至指定的行 

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

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

14.光标控制
k:上移 nk 上移n
j:下移 nj 下移n
将光标移到第n行,按下 mk
将光标移到第m行,按下 "ay'k
即将第nm的行存到a寄存器,以此类推,bc........寄存器等

屏幕翻滚类命令

Ctrl+u:向文件首翻半屏 
Ctrl+d:向文件尾翻半屏 
Ctrl+f:向文件尾翻一屏 
Ctrlb;向文件首翻一屏 
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。 
zz  将当前行置于屏幕中央

zt  将当前行置于屏幕顶端

zb  将当前行置于屏幕底端

编辑插入文本类命令

:在光标前 
:在当前行首 
a:光标后 
A:在当前行尾 
o:在当前行之下新开一行 
O:在当前行之上新开一行 
r:替换当前字符 
R:替换当前字符及其后的字符,直至按ESC 
s:从当前光标位置处开始,以输入的文本替代指定数目的字符 
S:删除指定数目的行,并以所输入文本代替之 
ncwnCW:修改指定数目的字 
nCC:修改指定数目的行 
J  删除换行符

u  取消上次操作

ctr-R  重做

c  修改指定的内容,和d相似

p  将删除缓冲区中的内容插入光标当前的位置

y  复制

vi a b c

:n跳至下一个文件,:e#回到刚才编辑的文件。

比如当前编辑文件为a:n跳至b,:n跳至c,:e#回到b,想回到a的话用:ea

打开一个,vi 文件名

然后在vi的命令输入状态下输入

:sp 另外一个文件的路径及文件名

如此就可以在一个窗口打开3个文件了。

可以使用 ctrl + 两次按 w

3个文件中切换

:edit  编辑一个新的文件

:previous 打开文件列表中的前一个文件

:next  打开文件列表中的后一个文件

:args  指定一个文件列表

:saveas 给文件改名

:file   给正在编辑的文件改名,但不保存

:split  将窗口分成上下两个窗口

:vsplit 将窗口分成左右两个窗口

:split 文件 为制定的文件打开新窗口

:new  打开新窗口,以及一个无名的缓冲区

:close  关闭窗口

ctr-w w 切换窗口

ctr-w [hjkl] 切换到窗口

ctr-w [HJKL] 移动窗口

:only  只保存当前窗口,其他窗口关闭

ctw-w + 增加当前窗口高度

ctw-w - 减小当前窗口高度

:qall  所有的窗口都退出

:wall  所有的窗口内容都写入文件

取消上一命令(Undo) 

重复命令(Redo) 

重复命令只能在命令模式下工作,在该模式下按“.”键既可。执行一个重复命令时,其结果是依赖于光标当前位置的。 

取消上一命令(Undo) 

重复命令(Redo) 

重复命令只能在命令模式下工作,在该模式下按“.”键既可。执行一个重复命令时,其结果是依赖于光标当前位置的。

fx 往右移动到 字元上 
Fx 往左移动到 字元上 
tx 往右移动到 字元前 
Tx 往左移动到 字元前 
配合 f&t 使用,重复一次 
配合 f&t 使用,反方向重复一次 
/string 往右移动到有 string 的地方 
?string 往左移动到有 string 的地方 
配合 /&? 使用,重复一次 
配合 /&? 使用,反方向重复一次

删除(delete) 

复制(yank) 

放置(put) 

修改(change)

x       删除光标下的字符("dl"的缩写)

X       删除光标前的字符("dh"的缩写)

D       从当前位置删除到行尾("d$"的缩写)

dw      从当前位置删除到下一个单词开头

db      从当前位置删除到前一个单词的开头

diw     删除光标上的单词(不包括空白字符)

daw     删除光标上的单词(包括空白字符)

dG      删除到文末

dgg     删除到文首

如果你用 "c" 代替 "d",这会变成修改命令;而改用 "y",则变成拷贝命令

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

c#w」:例如,「c3w」表示更改3个字

复制 

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

#yw」:复制#个字到缓冲区 

yy」:复制光标所在行到缓冲区。 

#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。 

p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

daB 删除{}及其内的内容 (在非v可视模式下

diB 删除{}中的内容 

ab 选择()中的内容 

ib 选择()中的内容不含() ) 

aB 选择{}中的内容 

iB 选择{}中的内容不含{} )

·变量定位 
gd 转到光标下局部变量的定义处 
Gd 转到光标下全局变量的定义处

:r filename 将文件 filename 插入在当前行之下

复制与剪切 

xp 交换前后两个字符的位置 

ddp 上下两行的位置交换 

:g/fred/t$ 拷贝行,从fred到文件末尾(EOF)

删除命令

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替换 
/  向后搜索

?  向前搜索

``  跳转到前一个位置

`a  跳转到标记为a的位置

ma  将光标的当前位置标记为a

`[  跳转到最后一次修改的起始位置

`]  跳转到最后一次修改的结束位置

`"  跳转到上次编辑该文件时光标最后停留的位置

:s  替换

:substitute 替换

:%s/a/a/c 对所有行替换

:m,ns/a/a/c 对从mn行替换

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

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

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

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

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

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

dw              删除光标右侧的字

ndw             删除光标右侧的 个字

3dw             删除光标右侧的 个字

db              删除光标左侧的字

ndb             删除光标左侧的 个字

5db             删除光标左侧的 个字

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

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

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

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

内存缓冲区中。用户可

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

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

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

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

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

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

/str1           正向搜索字符串 str1

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

?str2           反向搜索字符串 str2

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

索的字符串置于两个“

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

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

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

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

 文件

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

tr2 的行写

正文替换

利用 :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,表示只对搜索

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

进行替换操作。

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

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

:%s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串 

字串搜寻与取代

s(substitute)指令可搜寻某行列范围。

g(global)指令则可搜寻整个编辑缓冲区的资料。

s指令以第一个满足该条件的字串为其取代的对象,若该行有数个满足该条

件的字串,也仅能取代第一个,若想取代所有的字串则需加上g参数。

7)查找替换 

/<C-R><C-W> 把狭义单词 <cword> 写到 搜索命令 行 

/<C-R><C-A> 把广义单词 <cWORD> 写到 搜索命令 行 

:g/str/s/str1/str2/g 

第一个g表示对每一个包括s1的行都进行替换, 

第二个g表示对每一行的所有进行替换 

包括str的行所有的str1都用str2替换 

:%s/f $/for$/g 将每一行尾部的“”(f键和空格键)替换为for 

:%s/^/mv /g 在每一行的头部添加“mv ”(mv键和空格键) 

:s/fred/<c-r>a/g 替换fredregister a中的内容,呵呵 

:g/<input|<form/p 显示含<input<form的行 

替换一个visual区域 

选择一个区域,然后输入 :s/Emacs/Vim/ 等等,vim会自动进入:模式 

:'<,'>s/Emacs/Vim/g 前面的'<,'>vim自动添加的 

在多个文档中搜索 

:bufdo /searchstr 

:argdo /searchstr

全局替换

语法为 :[addr]s/源字符串/目的字符串/[option]

全局替换命令为::%s/源字符串/目的字符串/g

[addr] 表示检索范围,省略时表示当前行。

如:“120” :表示从第1行到20行;

%” :表示整个文件,同“1,$”;

. ,$” :从当前行到文件尾;

s : 表示替换操作

[option] : 表示操作类型

如:表示全局替换;

表示进行确认

表示替代结果逐行显示(Ctrl + L恢复屏幕);

省略option时仅对每行第一个匹配串进行替换;

如果在源字符串和目的字符串中出现特殊字符,需要用”\”转义

选项设置

all:列出所有选项设置情况 
term:设置终端类型 
ignorance:在搜索中忽略大小写 
list:显示制表位(Ctrl+I)和行尾标志($
number:显示行号 
report:显示由面向行的命令修改过的数目 
terse:显示简短的警告信息 
warn:在转到别的文件时若没保存当前文件则显示NO write信息 
nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符 
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始 
mesg:允许vi显示其他用户用write写到自己终端上的信息 
状态命令< Ctrl+G > 

命令显示在vi状态行上的vi状态信息,包括正在编辑的文件名、是否修改过、当前行号、文件的行数以及光标之前的行占整个文件的百分比。 

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

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

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

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

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

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

环境的设定
==========
set nu 设定资料的行号。
set nonu 取消行号设定。
set ai 自动内缩。
set noai 取消自动内缩。

17. vi 环境选项 Solaris ksh

noautoindent            nomodelines                     noshowmode

autoprint               nonumber                        noslowopen

noautowrite             nonovice                        tabstop=8

nobeautify              nooptimize                      taglength=0

directory=/var/tmp      paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags

noedcompatible          prompt                          tagstack

noerrorbells            noreadonly                      term=vt100

noexrc                  redraw                          noterse

flash                   remap                           timeout

hardtabs=8              report=5                        ttytype=vt100

noignorecase            scroll=11                       warn

nolisp                  sections=NHSHH HUuhsh+c         window=23

nolist                  shell=/bin/ksh                  wrapscan

magic                   shiftwidth=8                    wrapmargin=0

mesg                    noshowmatch                     nowriteany

For C-Shell:

setenv EXINIT "set nu"

For Bourne or Korn Shell:

EXINIT="set nu"; export EXINIT 

For Korn Shell Only (alternate method): 

typeset -x EXINIT="set nu"

在 .profile 里设置 vi 的环境选项 以上均测试过

18.标记文本

mchar   用字母char标记当前光标的位置

`char   移至char所标记处

'char   移至char标记所在行的开头处

"     移至当前行上一次所在位置(在光标移动之后)――一个双引号

''    移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号

19.

同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。

但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,

屏幕底部仍然显示目前vi的是刚才的文件。

(HP-UX,Solaris,AIX上通过)

也可以使用:

:e#

进行切换

组合命令

"dw" 命令删除一个单词。你可能认出来了,"w" 是词移动命令。实际上,"d" 

令后面可以跟任何 "动作"motion)命令,它会删除从当前位置到光标移动到的目标

位置的的全部内容。

例如 "4w" 命令能够向后移动四个单词。所以 "d4w" 命令删除4个单词。

如果你用 "e" 命令作为动作,这时 Vim 认为你是想删掉整个单词(包括最后一个字符)

"$" 命令移动到行尾。所以,"d$" 命令从当前的位置一直删除到本行行尾。这是一个"包含的命令,所以,这行的最后一个字符也会被删除

另一个操作符命令是 "c",表示修改,change。它的作用方式与 "d" 操作符相似,只是完成后会切换到插入模式。

例如,"cw" 修改一个词,更精确的说,它删除一个词,并切换到插入模式。

这里 "c2wbe<Esc>" 包括如下操作:

c       修改操作符

2w      移动两个单词的距离(与操作符合起来,它删除两个单词并进入插入模式)

be      插入 be 这个单词

<Esc>   切换回普通模式

"d$" 删除到行尾;"c$" 则修改到行尾。这就象先用 "d$" 删除一行再用 "a" 启动插入模式并加入新的文字。

快 捷 键

有些 "操作符-动作命令由于经常被使用,所以被设置为单字符命令:

x  表示  dl  (删除当前光标下的字符)

X  表示  dh  (删除光标左边的字符)

D  表示  d$  (删除到行尾)

C  表示  c$  (修改到行尾)

s  表示  cl  (修改一个字符)

S  表示  cc  (修改一整行)

重复一个修改

"." 是 Vim 中一个非常简单而有用的命令。它重复最后一次的修改操作。例如,假设你在

编辑一个 HTML 文件,你想删除所有的 <B> 标记。你把光标移到第一个 "<" 上,然后用

"df>" 命令删除 <B>。然后你就可以移到 </B> 的 上面用 "." 命令删除它。"." 命令

执行最后一次的修改命令(在本例中,就是 "df>")。要删除下一个 <B> 标记,移动到下

一个 的位置,再执行 "." 命令即可。

To <B>generate</B> a table of <B>contents 

f<   找第一个<            --->

df>  删除到>          -->

f<   找下一个<                 --------->

重复df>                      --->

f<   找下一个<                             ------------->

重复df>                                      -->

"." 命令重复任何除 "u" (undo)CTRL-R (redo) 和冒号命令外的修改。

关 于 粘 贴 的 更 多 知 识

"P" 命令象 "p" 一样也是插入字符,但插入点在光标前面。当你用 "dd" 删除一行,

"P" 会把它插入到光标所在行的前一行。而当你用 "dw" 删除一个单词,"P" 会把它

插入到光标前面。

你可以执行这个命令多次,每次会插入相同的文本。

"p" 和 "P" 命令接受个数前缀,被插入的文本就会被插入指定的次数。所以 "dd" 

加一个 "3p" 会把删除行的三个拷贝插入到文本中。

交 换 两 个 字 符

经常发生这样的情况,当你输入字符的时候,你的手指比你的脑子转得快(或者相反?)

这样的结果是你经常把 "the" 敲成 "teh"Vim 让你可以很容易得修正这种错误。只要把

光标移到 "teh" 的 "e" 上,然后执行 "xp" 即可。这个工作过程是:"x" 删除一个字符,

保存到寄存器。"p" 把这个被保存的字符插入到光标的后面,也就是 "h" 的后面了。

teh     th     the 

x       p

由于 "y" 是一个操作符,所以 "yw" 命令就是拷贝一个单词了。当然了,个数前缀也是

有效的。要拷贝两个单词,就可以用 "y2w"。例如:

let sqr = LongVariable * 

                 -------------->

                       y2w

let sqr = LongVariable *                                p

let sqr = LongVariable * LongVariable 

注意:"yw" 命令包括单词后面的空白字符。如果你不想要这个字符,改用 "ye" 命令。

"yy" 命令拷贝一整行,就像 "dd" 删除一整行一样。出乎意料地是,"D" 删除到行尾而

"Y" 却是拷贝一整行。要注意这个区别!"y$" 拷贝到行尾。

使用剪贴板

"Cut" 菜单项会在把文字拷进剪贴板前删除它。"Copy""Cut" 和 "Paste" 命令在弹出

菜单中也有(当然了,前提是有弹出式菜单)。如果你的 Vim 有工具条,在工具条上

也能找到这些命令。

如果你用的不是 GUI,或者你根本不喜欢用菜单,你只能用其它办法了。你还是可以用普通

的 "y"yank)和 "p"put)命令,但在前面必须加上 "*(一个双引号加一个星号)。

例如,要拷贝一行到剪贴板中:

"*yy

要粘贴回来:

"*p

这仅在支持剪贴板的 Vim 版本中才能工作。

文本对象

如果你在一个单词的中间而又想删掉这个单词,在你用 "dw" 前,你必须先移到这个单词的

开始处。这里还有一个更简单的方法:"daw"

this is some example text. 

daw

this is some text. 

"daw" 的 "d" 是删除操作符。"aw" 是一个文本对象。提示:"aw" 表示 "A Word"

(一个单词),这样,"daw" 就是 "Delete A Word"(删除一个单词)。确切地说,

该单词后的空格字符也被删除掉了。

用 "cis" 可以改变一个句子。看下面的句子:

Hello there.  This is an example.  Just some text. 

移动到第二行的开始处。现在使用 "cis"

Hello there. Just some text. 

现在你输入新的句子 "Another line."

Hello there.  Another line.  Just some text. 

"cis" 包括 "c"change,修改)操作符和 "is" 文本对象。这表示 "Inner

Sentence"(译者注:实在很难用中文表示这个意思了,各位还是记英文名吧)。还有

一个文本对象是 "as",区别是 "as" 包括句子后面的空白字符而 "is" 不包括。如果

你要删除一个句子,而且你还想同时删除句子后面空白字符,就用 "das";如果你想保

留空白字符而替换一个句子,则使用"cis"

*04.9*  替换模式

"R" 命令启动替换模式。在这个模式下,你输入的每个字符都会覆盖当前光标上的字符。

这会一直持续下去,直到你输入<Esc>

在下面的例子中,你在 "text" 的第一个 "t" 上启动替换模式:

This is text. 

Rinteresting.<Esc>

This is interesting. 

你可能会注意到,这是用十二个字符替换一行中的五个字符。如果超出行的范围,"R" 

令自动进行行扩展,而不是替换到下一行。

你可以通过 <Insert> 在插入模式和替换模式间切换。

但当你使用 <BS>(退格键)进行修正时,你会发现原来被替换的字符又回来了。这就好像

一个 "撤消命令一样。

. % 

%用来匹配块, 

如果你的光标在类似([{}]) 

或者#ifdef #else #endif上 

%将把光标跳转到相应的匹配符号上去, 

%还可以用来指定命令范围, 

如果你想把一个 

 .. 

 ... 

}的块全部删除。 

可以先把光标移到再敲d% 

类似的, 

如果你想把一个块全部往里缩进一个tab 

可以把光标移到 >% 

  

2. = 

=是用来缩进的假设你已经在.vimrc里 

设置了你的缩进格式

你就可以用=来缩进你的代码了 

=%就是缩进一个块。 

  

3.正则表达式 

正则表达式大家都清楚, 

我主要讲个一般人不太用, 

但很有用的表达

  

例如你想把所有的"..."形式的串替换成'...'的形式 

但引号里的内容不变 

你就可以用 

%s/"\(.*\)"/'\1'/来做 

上面这个正则表达式"\(.*\)"里 \用来表示()是元字符 

第一个在括号里的被匹配的串就可以被\1来代表以后依次是\2 \3。 

顺便说一句,我到现在还不 

知道怎么限制vim里正则表达匹配的贪婪算法

·编译选项 

:cn 命令会把你带到下一个出错地点,而不考虑它在什么文件里。 

:cc 命令会向你显示当前错误的编译器输出信息; 

:cl 会生成一个列有项目所有错误的列表,以供浏览这些错误

最后行方式命令

n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下 
n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下 
n1,n2 d :将n1行到n2行之间的内容删除 
:保存当前文件 
e filename:打开文件filename进行编辑 
x:保存当前文件并退出 
q:退出vi 
q!:不保存文件并退出vi 
!command:执行shell命令command 
n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1n2,则表示将整个文件内容作为command的输入 
r!command:将命令command的输出结果放到当前行 

ZZ  退出vi

:help  帮助系统

ctr-]  跳转到标签制定的目标

ctr-T  回到前一个目标

在命令模式中,连按两次大写字母Z,若当前编辑的文件曾被修改过,则Vi保存该文件后退出,返回到shell

若当前编辑的文件没被修改过,则Vi直接退出返回到shell。 

若用户真的希望用文件的当前内容替换newfile中原有内容,可使用命令 :w! newfile

在末行模式下,输入命令:wq 

Vi将先保存文件,然后退出Vi返回到shell。 

在末行模式下,输入命令:x 

该命令的功能同命令模式下的ZZ命令功能相同。

w filename 

储存正在编辑的文件为filename 

wq filename 

储存正在编辑的文件为filename,并退出vi

恢复文件

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

以 .swp 结尾。vi 

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

用恢复命令:

:recover           恢复文件

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

恢复编辑时被中断的文件

======================

在编辑过程中,若系统当掉或连线中断,而缓冲区的资料并还未

被写回磁盘时,当再度回到系统,执行下列指令即可回复中断前

的文件内容。

%vi -r filename

替换文件中的字符串 

vi界面下使用命令

:%s#/usr/bin#/bin#g

可以把文件中所有路径/usr/bin换成/bin。也可以使用命令:

:%s/usr/bin/bin/g

其中“”是转义字符,表明其后的“/”字符是具有实际意义的字符,不是分隔符。

9)窗口操作 

:vne [filename] 

:sp [filename] 

:S [filename] 

:new [filename] 

:^w + ^r 交换两个窗口的位置 

^w = 窗口等宽 

:res -n 窗口高度减小

:res +n 窗口高度增大

:vert res -n 

:vert res +n

10)DOS格式文本转成Unix格式文本 

:1,$s/^M//g 

11)书签 

在阅读和编写大的程序文件时,利用标记(书签)功能定位是十分有帮助的。 

将光标移到想做标记的位置。假如做一个名为“debug1”的标记,那么用户可在命令模式下输入做标记的命令“mdebug1”,然后敲入回车键,一个名为“debug1”的标记就做好了。 

接下来用户可以随意将光标移到其它的位置,当在命令模式下输入“`debug1”后,就能快速回到“debug1”的标记所在行的行首。

寄存器操作

"?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字 
"?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字 
"?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字 
"?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字 
ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。

vi 高级技巧

交换两个字符位置

xp

上下两行调换

ddp

把文件内容反转

:g/^/m0/

保存后就加密

:X

上下两行合并 

J

删除所有行 

dG

从当前位置删除到行尾

d$

从当前位置复制到行尾

y$ 如果要粘贴到其他地方 就可以了

在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,粘贴下来在光标处。

我常用到的单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S

:%s/old_word/new_word/g

这个指令是于在整个文件中替换特定字符串

将光标移到第n行,按下 mk

将光标移到第m行,按下 "ay'k

即将第nm的行存到a寄存器,以此类推,bc........寄存器等

删除命令操作

d l 删除当前字符(与x命令功能相同)

d 0 删除到某一行的开始位置

d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)

d w 删除到某个单词的结尾位置

d 3 w 删除到第三个单词的结尾位置

d b 删除到某个单词的开始位置

d W 删除到某个以空格作为分隔符的单词的结尾位置

d B 删除到某个以空格作为分隔符的单词的开始位置

删除命令操作

d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置

d) 删除到某个语句的结尾位置

d 4) 删除到第四个语句的结尾位置

d( 删除到某个语句的开始位置

d } 删除到某个段落的结尾位置

d { 删除到某个段落的开始位置

d 7 { 删除到当前段落起始位置之前的第7个段落位置

d d 删除当前行

d /t e x t 删除从文本中出现" t e x t"中所指定字样的位置,一直向前直到下一个该字样所出现的

位置(但不包括该字样)之间的内容

d fc 删除从文本中出现字符"c"的位置,一直向前直到下一个该字符所出现的位置(包括

该字符)之间的内容

d tc 删除当前行直到下一个字符" c"所出现位置之间的内容

删除到某一行的结尾

d $ 删除到某一行的结尾

5 d d 删除从当前行所开始的5行内容

d L 删除直到屏幕上最后一行的内容

d H 删除直到屏幕上第一行的内容

d G 删除直到工作缓存区结尾的内容

d 1 G 删除直到工作缓存区开始的内容

修改命令操作
c l 更改当前字符
c w 修改到某个单词的结尾位置
c 3 w 修改到第三个单词的结尾位置
c b 修改到某个单词的开始位置
c W 修改到某个以空格作为分隔符的单词的结尾位置
c B 修改到某个以空格作为分隔符的单词的开始位置
c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
c 0 修改到某行的结尾位置
c) 修改到某个语句的结尾位置
c 4) 修改到第四个语句的结尾位置
c( 修改到某个语句的开始位置
c } 修改到某个段落的结尾位置
c { 修改到某个段落的开始位置
c 7 { 修改到当前段落起始位置之前的第7个段落位置
c tc 修改当前行直到下一个字符c所出现位置之间的内容
修改到某一行的结尾
c c 修改当前行
5 c c 修改从当前行所开始的5行内容

替换命令操作

将当前字符替换为一个或多个字符

将当前行替换为一个或多个字符

5 s 将从当前字符开始的5个字符替换为一个或多个字符

;

分号,配合 和 使用,重复一次 

,

逗号,配合 和 使用,反方向重复一次

追加到缓冲区

对于已经有内容的缓冲区,可以继续追加内容在其后面,例如:

"Ad4w       删除光标后4个字,并附加到缓冲区a

"Ay)        取样从光标到文件尾的内容,并附加到缓冲区a

"K3yy       取样从光标所在行起的3行内容,并附加到缓冲区k

删除从当前行开始到最后一行的所有内容

:.,$d

:命令行模式下,首先可以确定命令的范围

.表示当前行;数字表示行号,如1表示第一行,2表示第二行;$表示最后一行

范围用,分隔

然后用命令

d表示删除,y表示复制......大家都知道的

最后说一句,%表示全文

:%d

是删除全文

v选中多行

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值