Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4263326
  • 博文数量: 601
  • 博客积分: 15410
  • 博客等级: 上将
  • 技术积分: 6884
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-16 08:11
个人简介

独学而无友,则孤陋而寡闻!

文章分类

全部博文(601)

文章存档

2020年(1)

2018年(4)

2017年(7)

2016年(42)

2015年(25)

2014年(15)

2013年(36)

2012年(46)

2011年(117)

2010年(148)

2009年(82)

2008年(37)

2007年(41)

分类: BSD

2008-02-23 21:54:13

vi 使用方法


vi ――强大的全屏幕编辑器


Vi 简介

文本编辑大概是系统运行中最为频繁的操作了,而在Linux下有一种标准而功能极为强大的编辑器,那就是Vi(Visual Edtior)。

对 于Linux的初学者来说,vi可能显得极为不友好――所有操作都要用特殊的击键或者组合键来控制,而且似乎这些命令跟要执行的操作并没有什么关系,非常 难记,比起Windows下的notepad实在是"恐怖"多了。其实这只是转移工作环境中的正常现象,如果经过大量的实践,你会发现其实vi对于键盘的 利用非常合理,如果用的熟练了,vi不仅可以成为你的文本编辑利器,而且对于系统配置甚至编程都有莫大的帮助。


Vi实用操作指南

作为一个Unix系统下标准的全屏幕文本编辑器,vi可以方便的实现插入、修改、拷贝粘贴三种基本的编辑操作。但是不像其他的字处理器,vi是以指令模式作为缺省的模式运行的。

更复杂的操作可以用一系列的按键来完成。

【进入vi 与退出】

Vi 有三种模式,输入模式(Inserting Mode)、指令模式(Command Mode)以及ex模式(Ex Mode)。在输入模式下可以输入文字,而指令模式下可以执行编辑文件、存档等等指令;Ex模
式用于执行另外一些功能,如查找、替换文本、多文件的操作等等。 要进入vi可以直接在Shell提示符下键入vi [文件名称],如果该文件在当前目录不存在,则vi创建之。
为了进入输入模式,有好几种方法:

新增 (append)
a: 从光标所在位置后面开始添加内容,光标后的内容随新增字符向后移动。
A: 从光标所在列最后面的地方开始添加内容。

插入 (insert)
i: 从光标所在位置前面开始插入内容,光标后的内容随新增内容向后移动。
I: 从光标所在列的第一个非空白字符前面开始插入内容。

开始 (open)
o: 在光标所在列下新增一列并进入输入模式。
O: 在光标所在列上方新增一列并进入输入模式。

可以随时用ESC键切换到指令模式,连续按一两次就够了,这时系统会发出哔哔声以确定进入指令模式。然后再指令模式下有多种退出方法:
ZZ 保存并退出

:x 保存并退出

:wq 保存并退出

:w 保存并返回指令模式

:30,60w [新文件] 将30到60行的内容写入[新文件]

:30,60w>> [文件] 将第30到60行的内容写入[文件]的末尾

:q 退出

:q! 退出并丢掉所有未保存信息

Q 退出vi,激活ex

:e file2 在不离开vi的条件下编辑file2

:n 编辑下一个文件

:e! 回到当前编辑文件上次保存的状态


Vi 基本编辑

【移动光标】

移动光标自然是编辑过程中的基本技能,这个步骤一定要熟练掌握。

常用的移动命令键有:

h 左移一个字符

j 下移一行

k 上移一行

l 右移一个字符

w,W 跳至后一个字(W忽略标点)

b,B 跳至前一个字(B忽略标点)

$ 至行尾

^ 至本行第一个非空字符

0 至行首

G 至缓冲区的起始处

nG n是整数,至第n行

CTRL-d 向下半页

CTRL-u 向上半页

CTRL-f 向下一页

CTRL-b 向上一页

H 移动到当前窗口的第一列

M 移动到当前窗口的中间列

L 移动到视窗的最后列 │

e 移动到下个字的最后一个字母

n- 减号移动到上一列的第一个非空白字符,前面加上数字可以指定移动到以 上 n 列

n+ 加号移动到下一列的第一个非空白字符,前面加上数字可以指定移动到以下 n 列

fx 往右移动到 x 字符上

Fx 往左移动到 x 字符上

tx 往右移动到 x 字符前

Tx 往左移动到 x 字符前

; 配合 f 和 t 使用,重复一次

, 配合 f 和 t 使用,反方向重复一次


【编辑】

x 删除光标所在字符,同时所在行的位于光标后的文字一起左移一格;如果删除的是某行的最后一个字符,则删除后光标左移一格

d 是删除命令,它作用于文本对象,即可被移动命令跨过的文本块。例如w可以用来跳至下一个字开始处,那么dw从光标位置所在字删至下一字开始处;6w将删至光标所在字后第六个字开始处等等

dd 删除光标所在的行

r 修改光标所在字符,r 后接着要修改的字符

R 进入取代状态,新增内容会覆盖原先内容,直到按 [ESC] 回到指令模式下止

s 删除光标所在字符,并进入输入模式

S 删除光标所在的列,并进入输入模式

u 撤消最近一次对文本的改动。标准版的vi只能执行一级撤消,而vim则可以多级

U 行撤消命令,用来撤消从光标最近一次移到该行时起对光标所在行做的全部改动

n( 左括号移动到句子的最前面,前面加上数字可以指定往前移动 n 个句子.句子以! . ? 三种符号来界定

n) 右括号移动到下个句子的最前面,前面加上数字可以指定往后移动 n 个句子

n{ 左括弧移动到段落的最前面,前面加上数字可以指定往前移动 n 个段落。段落以段落间的空白列界定

n} 右括弧移动到下个段落的最前面,前面加上数字可以指定往后移动 n 个段落


看到这里,恐怕有的读者已经开始吐舌头了:这么多"莫名其妙"的指令来编辑文本实在是太复杂了!还是那句话,"熟能生巧"。如果用的熟练了,利用这些命令来移动、编辑简直都不是大脑在控制,你的手指已经足够熟练为你做好任何你想做的事情


【指令组成】

现在可以提一下vi的指令组成。上面也看到了,很多指令都是控制键和数字等结合起来控制的。没错!其中很多大致是由指令与范围所构成。例如 dw 是由删除指 d 与范围 w 所组

成,代表删除一个字 d(elete) w(ord) 。

指令列表有:

d 删除(delete)

y 复制(yank)

p 放置(put)

c 修改(change)

范围可以是下列几个:

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

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

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

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

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

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

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

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

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

其实组合命令远远不止这些,更多的需要在实践中慢慢体会。


【查找样本】

在文本内移动的时候经常需要查找一定模式(Pattern)构成的文本,vi也提供了相应的命令键

/pattern 移至下一个包含pattern的行

?pattern 移至上一个包含pattern的行

/ 往下重复查找

? 往上重复查找

n 在同一方向重复查找

N 在相反方向重复查找

/pattern/+n 移至下一个pattern所在行后的第n行

?pattern?-n 移至上一个Pattern所在行前的第n行

/pattern/z- 重绘屏幕,使下一个包含pattern的行位于屏幕的最底行

% 移至与光标所在的括弧匹配成对的圆括弧或大括弧


【标记文本】

也可以将某段文本标记起来,方便以后跳转

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

`char 移至char所标记处

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

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

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


【缓冲区】

vi的缓冲区功能也是它的一大特色。它分为几个大类

1. 有名缓冲区

如果要把几个不同的文本同时保存在不同的缓冲区内以便放置,需要使用有名缓冲区。

有名缓冲区可以开辟出多达26个独立的存储区,用于存放删除或者取样操作的文本。它以双引号"后接小写字母命名,从"a到"z。在命令前添加缓冲区的名字可以将取样或者删除操作

的文本送入某缓冲区。下面是有关有名缓冲区的一些命令:

"azdw 删除后两个字,将他们放入缓冲区a

"jD 删除从光标至行尾的内容,并放入缓冲区j

"jp 在光标后放置缓冲区j的内容

"by) 从光标处至句尾的内容取样放到缓冲区b

"a2yy 取样两行到缓冲区a,删除缓冲区a中原有的内容

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

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

2. 删除缓冲区

另外,vi还有有编号的删除缓冲区。撤消命令只能恢复上一次的删除,当且仅当这个删除是最后一次操作。但是,vi可以把最近9次删除的内容都放入9个编号从1到9的缓冲区内。最

近一次删除保存在缓冲区1,次近的在缓冲区2,依此类推。例如,"2p可以放置第二个删除缓冲区中的内容。


【跟Unix Shell的结合】

作为Unix各种系统的标准配置,vi还提供了跟Shell的良好的接口。下面是一些常用命令:

:sh 运行shell直到用Ctrl-D命令退出为止

:! Cmd 执行Shell命令Cmd,然后回到vi。另外,这里的cmd可以使用某些特殊的扩展字符(vi中的定义),如#可扩展为备份文件名;%可扩展为当前文件名;!可扩展为前一个

shell命令

:!! 重复前一个shell命令

:object cmd 执行shell命令,用cmd的输入替换文本对象object。如果cmd接受标准输入,则必须用特定的文本对象

n !! cmd 执行shell命令cmd。用cmd的输入内容替换从当前行开始的n行文本。n的缺省值是1。如果cmd接收标准输入,则必须用特定的行


【EX功能汇总】


vi是类Unix操作系统中使用极为广泛的文本编辑器之一。无论是Unix、Solaris或Linux都默认提供这个工具。可以说只要熟悉了vi,在任何一种类Unix的操作系统平台上都可以自如
地进行文本编辑。关于vi的基本用法的资料有很多,本文的目的不是重复这些基本的用法,而是想给初步掌握vi基本用法的人提供一些实用技巧,使之能更快捷、高效地利用vi编辑文
件。


vi有命令模式和插入模式之分。vi启动后就处于命令模式。在命令模式下,可以随意移动光标、进行复制和粘贴文本等操作。利用“a”、“i”、“c”、“C”、“O”和“o”等命

令可以从命令模式切换到插入模式。在插入模式下,可以输入文本,按Esc键切换回命令模式。为了区别不同模式下的命令,本文在介绍时会注明是何种模式下的操作。


另外,本文的所有操作都是在Red Hat 9.0所带的vim中进行。本文介绍的各种技巧多数在各种vi版本中也都是可行的。

替换操作(经常用到的一些简单替换命令有:)


◆ s 将当前字符替换为一个或多个字符,例如5 s 表示将从当前字符开始的5个字符替换为一个或多个字符;


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


◆ r 单个字符替换。


文本格式转换


将DOS格式文本转成Unix格式文本,命令如下:


:1,$s/^M//g


其中^M是同时Ctrl+V+M按出来的,表示回车。


在行首尾添加字符串


用下列命令在文本每行的行首添加字符串“NewString”,请注意空格的存在。


:g/^/s//NewString/g

:%s/^/NewString/g




用下列命令在每行的行尾添加字符串“NewString”:


:g/$/s//NewString/g

:%s/$/NewString/g




从文本的第3行至最后一行的行首全部插入字符串“NewString”:

:3,$s/^/NewString/

在整个文件中替换

在整个文件中替换特定字符串,所用的命令如下:

:%s/old_string/new_string/g

如果仅将文件中的第3行到第7行中的“old_string”替换成“new_string”,那么使用下列命令:


:3,7s/old_string/new_string/

注意,其中“s”为表示替换动作,“%”表示所有行,“g”表示全文,“^”表示行首,“$”表示行尾。


------------------------------------------------------------------------------------------------
光标控制命令
  命令 光标移动
  h或^h 向左移一个字符
  j或^j或^n 向下移一行
  k或^p 向上移一行
  l或空格 向右移一个字符
  G 移到文档的最后一行
  nG 移到文档的第n行
  w 移到下一个字的开头
  W 移到下一个字的开头,忽略标点符号
  b 移到前一个字的开头
  B 移到前一个字的开头,忽略标点符号
  L 移到屏幕的最后一行
  M 移到屏幕的中间一行
  H 移到屏幕的第一行
  e 移到下一个字的结尾
  E 移到下一个字的结尾,忽略标点符号
  ( 移到句子的开头
  ) 移到句子的结尾
  { 移到段落的开头
  } 移到下一个段落的开头
  0或| 移到当前行的第一列
  n| 移到当前行的第n列
  ^ 移到当前行的第一个非空字符
  $ 移到当前行的最后一个字符
  +或return 移到下一行的第一个字符
  - 移到前一行的第一个非空字符
  在vi中添加文本
  命令 插入动作
  a 在光标后插入文本
  A 在当前行插入文本
  i 在光标前插入文本
  I 在当前行前插入文本
  o 在当前行的下边插入新行
  O 在当前行的上边插入新行
  :r file 读入文档file内容,并插在当前行后
  :nr file 读入文档file内容,并插在第n行后
  escape 回到命令模式
  ^v char 插入时忽略char的指定意义,这是为了插入特别字符
  在vi中删除文本
  命令 删除操作
  x 删除光标处的字符,能够在x前加上需要删除的字符数目
  nx 从当前光标处往后删除n个字符
  X 删除光标前的字符,能够在X前加上需要删除的字符数目
  nX 从当前光标处往前删除n个字符
  dw 删至下一个字的开头
  ndw 从当前光标处往后删除n个字
  dG 删除行,直到文档结束
  dd 删除整行
  ndd 从当前行开始往后删除
  db 删除光标前面的字
  ndb 从当前行开始往前删除n字
  :n,md 从第m行开始往前删除n行
  d或d$ 从光标处删除到行尾
  dcursor_command 删除至光标命令处,如dG将从当产胆行删除至文档的末尾
  ^h或backspace 插入时,删除前面的字符
  ^w 插入时,删除前面的字
  修改vi文本
  每个命令前面的数字表示该命令重复的次数
  命令 替换操作
  rchar 用char替换当前字符
  R text escape 用text替换当前字符直到换下Esc键
  stext escape 用text代替当前字符
  S或cctext escape 用text代替整行
  cwtext escape 将当前字改为text
  Ctext escape 将当前行余下的改为text
  cG escape 修改至文档的末尾
  ccursor_cmd text escape 从当前位置处到光标命令位置处都改为text
  在vi中查找和替换
  命令 查找和替换操作
  /text 在文档中向前查找text
  ?text 在文档中向后查找text
  n 在同一方向重复查找
  N 在相反方向重复查找
  ftext 在当前行向前查找text
  Ftext 在当前行向后查找text
  ttext 在当前行向前查找text,并将光标定位在text的第一个字符
  Ttext 在当前行向后查找text,并将光标定位在text的第一个字符
  :set ic 查找时忽略大小写
  :set noic 查找时对大小写敏感
  :s/oldtext/newtext 用newtext替换oldtext
  :m,ns/oldtext/newtext 在m行通过n,用newtext替换oldtext
  & 重复最后的:s命令
  :g/text1/s/text2/text3 查找包含text1的行,用text3替换text2
  :g/text/command 在任何包含text的行运行command所表示的命令
  :v/text/command 在任何不包含text的行运行command所表示的命令
  在vi中复制文本
  命令 复制操作
  yy 将当前行的内容放入临时缓冲区
  nyy 将n行的内容放入临时缓冲区
  p 将临时缓冲区中的文本放入光标后
  P 将临时缓冲区中的文本放入光标前
  "(a-z)nyy 复制n行放入名字为圆括号内的可命名缓冲区,省略n表示当前行
  "(a-z)ndd 删除n行放入名字为圆括号内的可命名缓冲区,省略n表示当前行
  "(a-z)p 将名字为圆括号的可命名缓冲区的内容放入当前行后
  "(a-z)P 将名字为圆括号的可命名缓冲区的内容放入当前行前
  在vi中撤消和重复
  命令 撤消操作
  u 撤消最后一次修改
  U 撤消当前行的任何修改
  . 重复最后一次修改
  , 以相反的方向重复前面的f、F、t或T查找命令
  ; 重复前面的f、F、t或T查找命令
  "np 取回最后第n次的删除(缓冲区中存有一定次数的删除内容,一般为9)
  n 重复前面的/或?查找命令
  N 以相反方向重复前面的/或?命令
  保存文本和退出vi
  命令 保存和/或退出操作
  :w 保存文档但不退出vi
  :w file 将修改保存在file中但不退出vi
  :wq或ZZ或:x 保存文档并退出vi
  :q! 不保存文档,退出vi
  :e! 放弃任何修改,从上次保存文档开始再编辑
  vi中的选项
  选项 作用
  :set all 打印任何选项
  :set nooption 关闭option选项
  :set nu 每行前打印行号
  :set showmode 显示是输入模式还是替换模式
  :set noic 查找时忽略大小写
  :set list 显示制表符(^I)和行尾符号
  :set ts=8 为文本输入配置tab stops
  :set window=n 配置文本窗口显示n行
  vi的状态
  选项 作用
  :.= 打印当前行的行号
  := 打印文档中的行数
  ^g 显示文档名、当前的行号、文档的总行数和文档位置的百分比
  :l 使用字母"l"来显示许多的特别字符,如制表符和换行符
  在文本中定位段落和放置标记
  选项 作用
  { 在第一列插入{来定义一个段落
  [[ 回到段落的开头处
  ]] 向前移到下一个段落的开头处
  m(a-z) 用一个字母来标记当前位置,如用mz表示标记z
  '(a-z) 将光标移动到指定的标记,如用'z表示移动到z
  在vi中连接行
  选项 作用
  J 将下一行连接到当前行的末尾
  nJ 连接后面n行
  光标放置和屏幕调整
  选项 作用
  H 将光标移动到屏幕的顶行
  nH 将光标移动到屏幕顶行下的第n行
  M 将光标移动到屏幕的中间
  L 将光标移动到屏幕的底行
  nL 将光标移动到屏幕底行上的第n行
  ^e(ctrl+e) 将屏幕上滚一行
  ^y 将屏幕下滚一行
  ^u 将屏幕上滚半页
  ^d 将屏幕下滚半页
  ^b 将屏幕上滚一页
  ^f 将屏幕下滚一页
  ^l 重绘屏幕
  z-return 将当前行置为屏幕的顶行
  nz-return 将当前行下的第n行置为屏幕的顶行
  z. 将当前行置为屏幕的中央
  nz. 将当前行上的第n行置为屏幕的中央
  z- 将当前行置为屏幕的底行
  nz- 将当前行上的第n行置为屏幕的底行
  vi中的shell转义命令
  选项 作用
  :!command 执行shell的command命令,如:!ls
  :!! 执行前一个shell命令
  :r!command 读取command命令的输入并插入,如:r!ls会先执行ls,然后读入内容
  :w!command 将当前已编辑文档作为command命令的标准输入并执行command命令,如:w!grep all
  :cd directory 将当前工作目录更改为directory所表示的目录
  :sh 将启动一个子shell,使用^d(ctrl+d)返回vi
  :so file 在shell程式file中读入和执行命令
  vi中的宏和缩写
  (避免使用控制键和符号,不要使用字符K、V、g、q、v、*、=和功能键)
  选项 作用
  :map key command_seq 定义一个键来运行command_seq,如:map e ea,无论什么时候都能够e移到一个字的末尾来追加文本
  :map 在状态行显示任何已定义的宏
  :umap key 删除该键的宏
  :ab string1 string2 定义一个缩写,使得当插入string1时,用string2替换string1。当要插入文本时,键入string1然后按Esc键,系统就插入了string2
  :ab 显示任何缩写
  :una string 取消string的缩写
  在vi中缩进文本
  选项 作用
  ^i(ctrl+i)或tab 插入文本时,插入移动的宽度,移动宽度是事先定义好的
  :set ai 打开自动缩进
  :set sw=n 将移动宽度配置为n个字符
  n> 使n行都向右移动一个宽度,例如3>>就将接下来的三行每行都向右移动一个移动宽度
  1.编辑模式: 插入/替换 (按INSERT键转换)
  2.[ESC] 指令模式
  3.输入模式 将在指令模式下输入 a
  新增(a,A)
  a:从光标所在位置后面开始新增资料,光标后的资料随新增资料向后移动。
  A:从光标所在列最后面的地方开始新增资料。
  插入(i,I)
  i:从光标所在位置前面开始插入资料,光标后的资料随新增资料向后移动。
  I:从光标所在列的第一个非空白字元前面开始插入资料。
  开始(o,O)
  o:在光标所在列下新增一列并进入输入模式。
  O:在光标所在列上方新增一列并进入输入模式。
  4.存盘/退出
  [ESC] :wq //存盘退出
  :w! //存盘继续
  :q //退出 (源文档未被编辑过可用)
  :q! //强制退出
  5.删除和改修
  [ESC] x //删除光标所在字符
  dd //删除光标所在列。
  r //修改光标所在字元,r后接着要修正的字符。
  R //进入取替换状态。
  s //删除光标所在字元,并进入输入模式。
  S //删除光标所在的列,并进入输入模式。
  6.恢复
  [ESC] u //能够恢复被删除的文字。
  U //能够恢复光标所在列的任何改变。
阅读(2054) | 评论(0) | 转发(0) |
0

上一篇:bash fork

下一篇:Mysql不支持GBK及解决方法

给主人留下些什么吧!~~