vi

来源:互联网 发布:c语音 字符数组 初始化 编辑:程序博客网 时间:2024/06/12 01:07
 

 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。

1、vi的基本概念
  基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
    1) 命令行模式command mode)
  控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
    2) 插入模式(Insert mode)
  只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
    3) 底行模式(last line mode)
  将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
 
    不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
2、vi的基本操作
a) 进入vi
    在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:
   $ vi myfile
  不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧!
 
b) 切换至插入模式(Insert mode)编辑文件
  在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。
 
c) Insert 的切换
  您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。
 
d) 退出vi及保存文件
  在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:
: w filename (输入 「w filename」将文章以指定的文件名filename保存)
: wq (输入「wq」,存盘并退出vi)
: q! (输入q!, 不存盘强制退出vi)

 vi可以在全屏幕方式下编辑一个或多个文件。如果在执行vi时没有指定文件名,则vi 命令会自动产生一个无名的空文件。如果指定的文件不存在,则vi将按指定的文件名创建一个新的文件。进入 vi 后屏幕左方会出现波浪符号,凡是列首有该符号就代表此列目前是空的。要离开 vi 可以在命令模式下键入 :q , :wq 命令则是存档后再离开(注意冒号)。注意vi并不锁住所编辑的文件,因此多个用户可能同时编辑一个文件,那么最后保存的文件版本将被保留。

 以下是vi 命令使用的一些选项及说明:

     -c command   :在对文件进行编辑前,先执行command命令;

     -r filename      :恢复文件filename;

     -R                  :以只读方式编辑文件;

     -y number      :每屏只编辑number 行文本。

        vi 的文本输入模式  
 使用以下几种命令可以进入文本输入模式(用户在任何时候都可以按ESC键返回命令模式):

新增 (append) :

a       :从光标所在位置之后开始输入文本

A      :从光标所在行尾开始输入文本

插入 (insert) :

i       :从光标所在位置之前开始输入文本

I        :从光标所在行的第一个非空白字符前面开始输入文本  

开始 (open) :

o      :在光标所在行后插入一新行。

O      :在光标所在行前插入一新行。  

        vi 基本编辑命令
在 vi 里,输入跟编辑是两码事。编辑是在命令模式下操作的,先利用命令移动光标来定位要进行编辑的地方,然后才下命令做编辑。

命令
 说明
 备注
 
cc 或S
 修改一整行的文本
 
 
C
 改变一行中光标所在位置之后的部分
 
 
dd
 删除光标所在的hang
 
 
D
 删除一行中光标所在位置之后的部分
 
 
dw
 删除光标所在的单词
 
 
J
 将下一行文本内容合并到本行行尾
 
 
r
 修改光标所在字符,r 后接要修正的字符
 
 
R
 修改本行内容
 
 
s
 修改光标所在字符
 
 
u
 恢复上一次所做的修改
 
 
x
 删除光标所在字符
 
 
X
 删除光标左侧字符
 
 
~
 改变光标所在字符的大小写
 
 
.
 重复上一次的操作
 
 
<<
 将当前行移到左边
 
 
>>
 将当前行移到右边
 
 
p
 将缓冲区的内容拷贝到光标所在行的下一行
 
 
P
 将缓冲区的内容拷贝到光标所在行的上一行
 
 
“ad
 将文本删除至缓冲区a
 
 
“ap
 粘贴缓冲区a中的内容
 
 
yy或Y
 将当前行存入缓冲区
 
 
yw
 将光标所在的单词存入缓冲区
 
 
0
 移动到光标所在列的最前面
 =[Home]
 
$
 移动到光标所在列的最后面
 =[End]
 
[CTRL+d]
 向下半页
 =[PageDown]
 
[CTRL+f]
 向下一页
 
[CTRL+u]
 向上半页                 
 
[CTRL+b]
 向上一页
 =[PageUp]
 
[CTRL+e]
 下滚一行
 
[CTRL+y]
 上滚一行
 
H
 移动到屏幕的第一行
 
M
 移动到屏幕的中间
 
L
 移动到屏幕的最后一行
 
b
 移动到上个小字的第一个字母
 
B
 移动到上个大字的第一个字母
 
w
 移动到下个小字的第一个字母  
 
W
 移动到下个大字的第一个字母  
 
e
 移动到下个小字的最后一个字母
 
E
 移动到下个大字的最后一个字母
 
^
 移动到光标所在列的第一个非空白字符
 
n-
 减号移动到上一行的第一个非空白字符,前面加上数字可以指定移动到以上 n 行
 
n+
 加号移动到下一行的第一个非空白字符,前面加上数字可以指定移动到以下 n 行
 
nG
 直接用数字 n 加上 G 移动到第 n 行
 
fx
 往右移动到 x 字符上
 
Fx
 往左移动到 x 字符上
 
tx
 往右移动到 x 字符前
 
Tx
 往左移动到 x 字符前
 
;
 配合 f&t 使用,重复一次
 
,
 配合 f&t 使用,反方向重复一次
 
/string
 往右移动到有 string 的地方
 
?string
 往左移动到有 string 的地方
 
n
 配合 /&? 使用,重复一次
 
N
 配合 /&? 使用,反方向重复一次
 
%
 移到匹配的”()”或”{}”上
 
n(
 左括号移动到句子的最前面,前面加上数字可以指定往前移动 n 个句子
 句子是以! . ? 三种符号来界定
 
n)
 右括号移动到下个句子的最前面,前面加上数字可以指定往后移动 n 个句子
 段落是以段落间的空白列界定
 
n{
 左括弧移动到段落的最前面,前面加上数字可以指定往前移动 n 个段落
 
n}
 右括弧移动到下个段落的最前面,前面加上数字可以指定往后移动 n 个段落
 

    :$ 光标移动到文件最后一行
    :0 光标移动到文件第一行
这些编辑命令非常有弹性,基本上可以说是由命令与范围所构成。例如 dw 是由删除指令d 与范围 w 所组成,代表删除一个字 d (elete) w (ord) 。命令列表如下:

d   删除(delete)

y   复制(yank)

p   放置(put)

c   修改(change)

范围可以是下列几个:

e   光标所在位置到该字的最后一个字母

w   光标所在位置到下个字的第一个字母

b   光标所在位置到上个字的第一个字母

$   光标所在位置到该行的最后一个字母

0   光标所在位置到该行的第一个字母

)   光标所在位置到下个句子的第一个字母

(   光标所在位置到该句子的第一个字母

}   光标所在位置到该段落的最后一个字母

{   光标所在位置到该段落的第一个字母  

        文件处理子命令
 :q 结束编辑(quit)

    如果不想存档而要放弃编辑过的档案则用 :q! 强制离开。

 :w 存档(write)

    其后可加所要存档的档名。 可以将档案命令合在一起,例如 :wq 即存档后离开。

 ZZ 功能与 :wq 相同。

 :n 开始编辑vi激活的文件列表中的下一个文件。

 :n filename 指定被编辑的新的文件。

 :e filename 在vi中编辑另一个文件filename。

 :e # 开始编辑另一个文件。

 :e ! 重新装入当前文件,如果当前文件有改动,则丢弃以前的改动。

 :r filename  将文件filename合并至当前文件的文件尾。

另外值得一提的是 vi 的部份存档功能。可以用 :n,m w filename 将第 n 行到第 m 行 的文字存放的所指定的 filename 里去。

 

^        移动到该行第一个非空格的字符处
w        向前移动一个单词,将符号或标点当作单词处理
W        向前移动一个单词,不把符号或标点当作单词处理
b        向后移动一个单词,把符号或标点当作单词处理
B        向后移动一个单词,不把符号或标点当作单词处理
(        光标移至句首
)        光标移至句尾
{        光标移至段落开头
}        光标移至段落结尾
H        光标移至屏幕顶行
M        光标移至屏幕中间行
L        光标移至屏幕最后行
0        到行首
$        到行尾
gg       到页首
G        到页末
行号+G   跳转到指定行
n+       光标下移n行
n-       光标上移n行
Ctrl+g   查询当前行信息和当前文件信息

fx       向右跳到本行字符x处(x可以是任何字符)
Fx       向左跳到本行字符x处(x可以是任何字符)

tx       和fx相同,区别是跳到字符x前
Tx       和Fx相同,区别是跳到字符x后

C-b      向上滚动一屏
C-f      向下滚动一屏
C-u      向上滚动半屏
C-d      向下滚动半屏
C-y      向上滚动一行
C-e      向下滚动一行

nz       将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
进入和退出Vi命令
vi filename               打开或新建文件,并将光标置于第一行首
vi +n filename            打开文件,并将光标置于第n行首
vi + filename             打开文件,并将光标置于最后一行首
vi +/pattern filename     打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename            在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename ... filename  打开多个文件,依次进行编辑

ZZ                        退出vi并保存
:q!                       退出vi,不保存
:wq                       退出vi并保存
重复操作
.        重复上一次操作
自动补齐
C-n      匹配下一个关键字
C-p      匹配上一个关键字
插入
o        在光标下方新开一行并将光标置于新行行首,进入插入模式。
O        同上,在光标上方。

a        在光标之后进入插入模式。
A        同上,在光标之前。


R        进入替换模式,直到按下Esc
set xxx  设置XXX选项。
行合并
J        把下面一行合并到本行后面
Vi中查找及替换命令
/pattern         从光标开始处向文件尾搜索pattern
?pattern         从光标开始处向文件首搜索pattern
n                在同一方向重复上一次搜索命令
N                在反方向上重复上一次搜索命令
%                查找配对的括号
:s/p1/p2/g       将当前行中所有p1均用p2替代,若要每个替换都向用户询问则应该用gc选项
:n1,n2s/p1/p2/g  将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g    将文件中所有p1均用p2替换

.*[]^%~$ 在Vi中具有特殊含义,若需要查找则应该加上转义字符"\"
查找的一些选项
设置高亮
:set hlsearch    设置高亮
:set nohlsearch  关闭高亮
:nohlsearch      关闭当前已经设置的高亮
增量查找
:set incsearch   设置增量查找
:set noincsearch 关闭增量查找
在Vi中删除
x        删除当前光标下的字符
dw       删除光标之后的单词剩余部分。
d$       删除光标之后的该行剩余部分。
dd       删除当前行。

c        功能和d相同,区别在于完成删除操作后进入INSERT MODE
cc       也是删除当前行,然后进入INSERT MODE

更改字符
rx       将当前光标下的字符更改为x(x为任意字符)
~        更改当前光标下的字符的大小写
键盘宏操作
qcharacter  开始录制宏,character为a到z的任意字符
q           终止录制宏
@character  调用先前录制的宏

恢复误操作
u        撤销最后执行的命令
U        修正之前对该行的操作
Ctrl+R   Redo
在Vi中操作Frame
c-w c-n  增加frame
c-w c-c  减少frame
c-w c-w  切换frame
c-w c-r  交换两个frame
VIM中的块操作
Vim支持多达26个剪贴板

  选块   先用v,C-v,V选择一块,然后用y复制,再用p粘贴。
  yy     复制当前整行
  nyy    复制当前行开始的n行内容
  ?nyy   将光标当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
  ?nyw   将光标当前行及其下n个词保存到寄存器?中,其中?为一个字母,n为一个数字
  ?nyl   将光标当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
  ?p     将寄存器?中的内容粘贴到光标位置之后。如果?是用yy复制的完整行,
         则粘贴在光标所在行下面。这里?可以是一个字母,也可以是一个数字
  ?P     将寄存器a中的内容粘贴到光标位置之前。如果?是用yy复制的完整行,
         则粘贴在光标所在行上面。这里?可以是一个字母,也可以是一个数字
  ay[motion]
            ay$    复制光标位置到行末并保存在寄存器a中
            ayft   复制光标位置到当前行第一个字母t并保存在寄存器a中
以上指令皆可去掉a工作,则y,p对未命名寄存器工作(所有d,c,x,y的对象都被保存在这里)。

剪切/复制/粘贴
所有删除的内容自动被保存,可以用p键粘贴

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

 

原创粉丝点击