vi使用技巧

Vi 简介
    Vi是Unix世界里极为普遍的全萤幕文书编辑器,几乎可以说任何一台Unix机器都会提供这套软体。Linux当然也有,它的vi其实是elvis(版权问题),不过它们都差不多。熟悉DOS下的文书处理後,也许会感到vi并不好用;Unix上也已经发展出许多更新、更好用的文书编辑器,但是并不一定每一台Unix 机器上都会安装这些额外的软体。所以,学习vi的基本操作还是有好处,让你在各个不同的机器上得心应手。 

—————————————————————————-
Vi 基本观念
Unix提供一系列的ex编辑器,包括ex,edit和vi。相对於全萤幕编辑器,现在可能很难想像如何使用ex, edit这种行列编辑器(有人用过DOS 3.3 版以前所附的EDLIN吗?)。Vi的原意是 “Visual”,它是一个立即反应的编辑程式,也就是说可以立刻看到操作结果。
也由於vi是全萤幕编辑器,所以它必须控制整个终端机萤幕哪里该显示些什麽。而终端机的种类有许多种,特性又不尽相同,所以vi有必要知道现在所使用的是哪一种终端机。这是藉由TERM这个环境变数来设定,设定环境变数方面请查看所使用s hell的说明。(除非执行vi的时候回应unknow terminal type ,否则可以不用设定。)
只要简单的执行vi就可以进入vi的编辑环境。在实际操作之前先对它有个概略的了解会比较好。Vi有两种模式,输入模式以及指令模式。输入模式即是用来输入文字资料,而指令模式则是用来下达一些编排文件、存档、以及离开vi等等的操作指令。当执行vi後,会先进入指令模式,此时输入的任何字元都视为指令。
进入与离开要进入vi可以直接在系统提示字元下键入vi<档案名称>,vi可以自动帮你载入所要编辑的档案或是开启一个新档。进入vi後萤幕左方会出现波浪符号,凡是列首有该符号就代表此列目前是空的。要离开vi可以在指令模式下键入:q,:wq指令则是存档後再离开(注意冒号)。要切换到指令模式下则是用[ESC]键,如果不晓得现在是处於什麽模式, 可以多按几次[ESC],系统会发出哔哔声以确定进入指令模式。  —————————————————————————- Vi 输入模式 
要如何输入资料呢?有好几个指令可以进入输入模式:
新增 (append)  a 从游标所在位置後面开始新增资料,游标後的资料随新增资料向後移动。  A 从游标所在列最後面的地方开始新增资料。
插入 (insert)  i 从游标所在位置前面开始插入资料,游标後的资料随新增资料向後移动。  I 从游标所在列的第一个非空白字元前面开始插入资料。
开始 (open)  o 在游标所在列下新增一列并进入输入模式。  O 在游标所在列上方新增一列并进入输入模式。
也许文字叙述看起来有点繁杂,但是只要实际操作一下马上可以了解这些操作方式。实务很重要,尤其是电脑方面的东西随时可以尝试及验证结果。极力建议实际去使用它而不要只是猛K文件,才有事半功倍的效用。(注:此段为废话。)  —————————————————————————- Vi 基本编辑
配合一般键盘上的功能键,像是方向键、[Insert]、[Delete]等等,现在你应该已经可以利用vi 来处理文字资料了。当然vi还提供其他许许多多功能让文字的处理更形方便,有兴趣的看倌请继续。
在继续下去之前先来点BCC吧。电脑有许多厂牌,不同的硬体及作业系统。PC也不是仅仅只有IBM PC及其相容品而已。事实上,包括键盘,终端机等等往往都有不同的规格。这代表什麽?
在文书编辑软体上会遇这样的问题,某些电脑的键盘上没有特定的几个功能键!那麽不就有某些功能不能用了?这个问题在Unix系统上也一样,几乎各大电脑厂商都有自己的Unix系统,而vi的操作方法也会随之有点出入。我们固然可以用PC的键盘来说明vi的操作,但是还是得提一下这个问题。
删除与修改
何谓编辑?在这里我们认为是文字的新增修改以及删除,甚至包括文字区块的搬移、复制等等。这里先介绍vi的如何做删除与修改。(注意:在vi的原始观念里,输入跟编辑是两码子事。编辑是在指令模式下操作的,先利用指令移动游标来定位要进行编辑的地方,然後才下指令做编辑。)
x 删除游标所在字元。
dd 删除游标所在的列。
r 修改游标所在字元,r 後接著要修正的字元。
R 进入取代状态,新增资料会覆盖原先资料,直到按[ESC]回到指令模式下为止。
s 删除游标所在字元,并进入输入模式。
S 删除游标所在的列,并进入输入模式。
其实呢,在PC上根本没有这麽麻烦!输入跟编辑都可以在输入模式下完成。例如要删除字元,直接按[Delete]不就得了。而插入状态与取代状态可以直接用[Insert]切换,犯不著用什麽指令模式的编辑指令。不过就如前面所提到的,这些指令几乎是每台终端机都能用,而不是仅仅在PC上。
在指令模式下移动游标的基本指令是h,j,k,l 。想来各位现在也应该能猜到只要直接用PC的方向键就可以了,而且无论在指令模式或输入模式下都可以。多容易不是。
当然PC键盘也有不足之处。有个很好用的指令u可以恢复被删除的资料,而U指令则可以恢复游标所在列的所有改变。这与某些电脑上的[Undo]按键功能相同。  —————————————————————————- Vi 进阶应用
相信现在对於vi应该已经有相当的认识。处理文字也不会有什麽麻烦才对。如果有兴趣善用vi的其它功能进一步简化操作过程,不妨继续看下去。
移动游标
由於许多编辑工作是藉由游标来定位,所以vi提供许多移动游标的方式,这个我们列几张简表来说明(这些当然是指令模式下的指令):

指令 说明 功能键
0 移动到游标所在列的最前面 [Home]
$ 移动到游标所在列的最後面 [End]
[CTRL][d] 向下半页
[CTRL][f] 向下一页 [PageDown]
[CTRL][u] 向上半页
[CTRL][b] 向上一页 [PageUp]

 

指令 说明
H 移动到视窗的第一列
M 移动到视窗的中间列
L 移动到视窗的最後列
b 移动到下个字的第一个字母
w 移动到上个字的第一个字母
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 个段落

不要尝试背诵这些指令,否则後果自行负责。它们看起来又多又杂乱,事实上这叙述本身的障碍。再强调一次,实际去使用它只要几次就可以不经大脑直接下达奇怪怪的指令,远比死记活背搞得模模糊糊强多了。(注:若真的不经大脑而误与我无关。另,此段为废话。)
进阶编辑指令这些编辑指令非常有弹性,基本上可以说是由指令与范围所构成。例如dw是由删除指指令列表如下:
d 删除(delete) y 复制(yank)  p 放置(put)  c 修改(change)
范围可以是下列几个:  e 游标所在位置到该字的最後一个字母 w 游标所在位置到下个字的第一个字母 b 游标所在位置到上个字的第一个字母 $ 游标所在位置到该列的最後一个字母 0 游标所在位置到该列的第一个字母  ) 游标所在位置到下个句子的第一个字母 ( 游标所在位置到该句子的第一个字母 } 游标所在位置到该段落的最後一个字母  { 游标所在位置到该段落的第一个字母
说实在的,组合这些指令来编辑文件有一点点艺术气息。不管怎麽样,它们提供更多编辑文字的能力。值得注意的一点是删除与复制都会将指定范围的内容放到暂存区里,然後就可以用指令p贴到其它地方去,这是vi用来处理区段拷贝与搬移的办法。
某些vi版本,例如Linux所用的elvis可以大幅简化这一坨指令。如果稍微观察一下这些编辑指令就会发现问题其实是定范围的方式有点杂,实际上只有四个指令罢了。
指令v非常好用,只要按下v键,游标所在的位置就会反白,然後就可以移动设定范围,接著再直接下指令进行编辑即可。
对於整列操作,vi另外提供了更方便的编辑指令。前面曾经提到过删除整列文字的指令dd就是其中一个;cc可以修改整列文字;而yy则是复制整列文字;指令以删除游标到该列结束为止所有的文字。
档案指令
档案指令多以:开头,跟编辑指令有点区别。例如前面提到结束编辑的指令就是:q。现在就简单说明一下作为本篇故事的结尾:
q 结束编辑(quit)
如果不想存档而要放弃编辑过的档案则用 :q! 强制离开。
w 存档(write)
其後可加所要存档的档名。可以将档案指令合在一起,例如 :wq 即存档後离开。     最快捷的方式(:x)
zz 功能与 :wq 相同。
另外值得一提的是vi的部份存档功能。可以用:n,mw filename将第n行到第m行的文字存放的所指定的 filename里去哩。时代在变,世界在变,vi也在变,不过大致上就这样。
VI高级命令集锦 鉴于大家在使用VI 的时候有一定的陌生,在这里借花献佛,从兄弟版[SHELL]中整理出以下关于VI编程的高级技巧,希望对大家学习UNIX有所帮助,并希望大家能结合使用HPUX的心得体会对这些经验进行进一步的扩展。
1.交换两个字符位置 xp 2.上下两行调换 ddp 3.把文件内容反转 :g/^/m0/       (未通过)
4.上下两行合并  J 5.删除所有行  dG 6.从当前位置删除到行尾 d$ 7.从当前位置复制到行尾 y$ 如果要粘贴到其他地方 p 就可以了 由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态  8.:ab string strings  例如 “:ab usa United States of America” , 当你在文件里插入 usa 时 United States of America 就蹦出来了 9.:map keys new_seq  定义你当前 键盘命令  10.:set [all]  vi or ex  的编辑状态 如 显示每行 :set nu  11.在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的下面。
12.单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S
13. :%s/old_word/new_word/g 这个指令是于在整个文件中替换特定字符串     14.光标控制 k:上移 nk 上移n行 j:下移 nj 下移n行
将光标移到第n行,按下 mk 将光标移到第m行,按下 “ay’k 即将第n到m的行存到a寄存器,以此类推,b,c……..寄存器等,这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用,想粘贴到某处,直接将光标移到某地,按下 ‘ap 即可,以此类推,b,c……..寄存器等
在当前屏幕中 H 跳到第一行 M 跳到中间一行 L 跳到最后一行
15. 表8-2 删除命令 删除命令操作 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 删除到某一行的结尾 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 c 修改当前行 5 c c 修改从当前行所开始的5行内容
.重复上一次修改!     表8-4 替换命令 替换命令操作 s 将当前字符替换为一个或多个字符 S 将当前行替换为一个或多个字符 5 s 将从当前字符开始的5个字符替换为一个或多个字符
vi替换使用规则: :g/s1/s/s2/s3/g 第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换 s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串
16. fx 往右移动到 x 字符上 Fx 往左移动到 x 字符上 tx 往右移动到 x 字符前 Tx 往左移动到 x 字符后 (注意:以上四个命令中,其中x是键入的字符) ; 分号,配合 f 和 t 使用,重复一次  , 逗号,配合 f 和 t 使用,反方向重复一次
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# 进行切换
20. sco 下VI 要在文本前同样的字符加用 %s/^/要加的内容/g      要在文本后同样的字符加 %s/$/要加的内容/g
21.如何去掉文本中的 ^M 硬回车?不必用binary传回去再ascii传回来的方式,用shell或者unix语句实现。 cat filename |tr -d ‘\015’ >newfile 不同的unix系统还存在一些其他不同的命令,如:doscp  sed 也可以实现这个功能.
dos2unix filename filename2 反之 unix2dos filename filename2
在vi 中用:$s/^M//g ^是crtl-V crtl-M
22.如何在“unix命令行”下将一个文件的某字符串用另一个串换掉  sed ‘s/string1/string2/gp’ file1 > file2   23.将/etc/hosts下所有的地址都ping 2次
1  #/usr/bin/sh     2  #grad /etc/hosts and ping each address     3  cat /etc/hosts|grep -v ‘^#’ | while read LINE     4  do     5   ADDR=`awk ‘{print $1}’`     6  for MACHINE in $ADDR     7   do     8     ping  $MACHINE -n 2     9   done    10  done
1.6 : vi vi 的工作模式  编辑模式  插入模式  命令模式  shell 切换  选项设置  vim 和 gvim 的高级特色
1.6.1 vi 的工作模式
Vi 在初始启动后首先进入编辑模式,这时用户可以利用一些预先定义的按键来移动光标、删除文字、 复制或粘贴文字等。这些按键均是普通 的字符,例如 l 是向右移动光标,相当于向右箭头键,k 是 向下移动光标,相当于向下箭头键。在编辑模式下,用户还可以利用一些特殊按 键选定文字,然后 再进行删除、或复制等操作。
当用户在编辑模式下键入 i, a, o 等命令之后,可进入插入模式;键入 : 可进入命名模式。 在插入模式下,用户随后输入的,除 Esc 之外的任何 字符均将被看成是插入到编辑缓冲区中 的字符。按 Esc 之后,从插入模式切换到编辑模式。
在命令模式,Vi 将把光标挪到屏幕的最下方,并在第一个字符的位置显示一个 :(冒号)。这时, 用户就可以键入一些命令。这些命令可用 来保存文件、读取文件内容、执行 Shell 命令、设置 Vi 参数、以正则表达式的方式查找字符串或替换字符串等。
1.6.2 编辑模式
1. 移动光标
要对正文内容进行修改,首先必须把光标移动到指定位置。移动光标的最简单的方式是按键盘的上、下、左、右箭头键。除了这种最原始的方法之外,用户还可以利用 vi 提供的众多字符组合键,在正文中移动光标,迅速到达指定的行或列,实现定位。例如: k、j、h、l 功能分别等同于上、下、左、右箭头键 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,左移光标,到本行的开头 $ 右移光标,到本行的末尾 ^ 移獗辏奖拘械牡谝桓龇强兆址?P>

2. 替换和删除 将光标定位于文件内指定位置后,可以用其他字符来替换光标所指向的字符,或从当前光标位置删除一个或多个字符。例如: rc 用 c 替换光标所指向的当前字符 nrc 用 c 替换光标所指向的前 n 个址?BR>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.6.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.6.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 选项。
#DEMO#
#DEMO#
1.6.5 选项设置
为控制不同的编辑功能,vi 提供了很多内部选项。利用 :set 命令可以设置选项。基本语法为: :set option 设置选项 option 常见的功能选项包括: autoindent 设置该选项,则正文自动缩进 ignorecase 设置该选项,则忽略规则表达式中大小写字母的区别 number 设置该选项,则显示正文行号 ruler 设置该选项,则在屏幕底部显示光标所在行、列的位置 tabstop 设置按 Tab 键跳过的空格数。例如 :set tabstop=n,n 默认值为 8 mk 将选项保存在当前目录的 .exrc 文件中
#DEMO#
1.6.6 shell 切换
在编辑正文时,利用 vi 命令模式下提供的 shell 切换命令,无须退出 vi 即可执行 Linux 命令,十分 方便。语法格式为: :! command 执行完 shell 命令 command 后回到 vi 另外,在编辑模式下,键入 K ,可命令 vi 查找光标所在单词的手册页,相当于运行 man命令。
#DEMO#
1.6.7 vim 和 gvim 的高级特色
Vim 代表 Vi IMproved,如同其名称所暗示的那样,Vim 作为标准 UNIX 系统 vi 编辑器的提高版而存在。 Vim 除提供和 vi 编辑器一样强大的功能外,还提供有多级恢复、命令行历史以及命令及文件名补全等 功能。
gvim 是 vi 的 X Window 版本,该版本支持鼠标选中,一些高级光标移动功能,并且带有菜单和工具按钮。
VIM学习笔记 VI编辑器是类UNIX系统中最常用到的编辑器,VIM是VI编辑器的改良版本。本笔记是我在使用vim时记录下来的备忘录,内容不是很全面,详细介绍可参考http://vimdoc.sourceforge.net/网站。
——————————————————————————–
Table of Contents
1. 普通模式 1.1. 编辑 1.2. 光标移动 2. 编辑模式 3. 命令模式 4. vimrc配置

1. 普通模式 在shell中直接打vim filename就会进入普通模式。在这个状态,我们可以通过不同的按键对文件进行操作和切换到其它模式。按“:”可切换到命令模式,按i,o,a可进入编辑模。
1.1. 编辑 i 进入编辑模式。 o 在当前位置下插入一空行,进入编辑模式,光标位于空行的最开头。 a 光标后移一个字符,进入编辑模式。 v 这入可视模式,可用高亮的色块选择内容。 x or DEL键 删除当前字符,删除内容保存在缓冲区。 xp 左右字符互换。 dd 删除当前行,删除内容保存在缓冲区。 ddp 上下两行的内容互换。 d$ 删除当前光标至行尾的所有内容。 dG 删除从当前行至文件未尾的所有行。 u undo。 v 进地visual模式,移动光标可选择文本。 y 把当前行复制到缓冲区中。 p 把缓冲区中的文本插入到当前位置。 “ay 把当前行复制到a缓冲区。可用26个字母命名多个缓冲区。 “ap 把a缓冲区中的文本插入当前位置。 J 上下两行合并成一行。 . 英文句点的作用是重复执行上次执行的命令,如你按了”ap插入a缓冲区的内容,那你就可按”.”来重复这个操作。
1.2. 光标移动 h,j,k,l 在vim中,除了可使用光标键在移动光标外,还有一种更方便的光标移动方式。就是使用h,j,k,l这四个键来移动光标。h控制光标左移,j控制光标下移,k控制光标上移,l控制光标右移。通过使用这四个字母键就可使我们的手不用移动即可控制光标的移动。刚开始使用可能会有些不习惯,但熟练使用后你会发觉你的输入速度提高不少,强烈建议喜欢vim的朋友使用。 $ 光标移动到行尾。 G 光标移动到文档末尾。 H,L H控制光标移动到当前屏幕头,L控制光标移动到当前屏幕尾。 {,} {控制光标上移一个段落,}控制光标下移一个段落
2. 编辑模式 ESC 退出编辑状态。
3. 命令模式 在普通模式上按“:”就可进入命令模式,在左下屏幕我们输入一些操作指令。
:q! 不保存退出vim。 :w 保存文档,但不退出vim。 😡 保存退出vim。 :! command 运行shell命令。 :e filename 编辑/打开一个文件 :s/emacs/vim 在当前行中把第一个emacs替换成vim。 :s/emacs/vim/g 把当前行中所有的emacs替换成vim。 :%s/emacs/vim/g 在全局范围内把emacs替换成vim。 :reg 列出缓冲区内容。 :set all 列出所有参数的配置情况。 :tabe 新建一个标签页。 :tabn or :tabp切换到下一个\上一个标签页。 :close 关闭当前标签页。 :qa 关闭所有标签页退出。
4. vimrc配置 在命令模式下用set命令设置的东西是不能保存的,下次打开vim时又要重新设置。所以vim提供了一个配置文件叫vimrc,可以保存你的配置信息。该文件在Debian系统中位于/etc/vim/目录下。在该文件中,以双引号开头的是注释。
set autoindent 自动缩排,如当前行是从第3个字符的位置开始编辑的,按回车后光标会自动定位在下一行第三3个字符的位置。 set paste 置粘贴模式,这样粘贴过来的程序代码就不会错位了。
打开文件时自动回到上次编辑位置。
打开文件时自动回到上次编辑位置。

if has("autocmd")  
   autocmd BufRead *.txt set tw=78  
   autocmd BufReadPost *  
      \ if line("'\"") > 0 && line ("'\"") <= line("$") |  
      \   exe "normal g'\"" |  
      \ endif  
endif 

应用:

zone "anzydream.com" {  
        type master;  
        file "anzydream.com.dom";  
};  
zone "abc.cc" {  
        type master;  
        file "abc.cc.dom";  
};  
zone "ao129.com" {  
        type master;  
        file "ao129.com.dom";  
}; 
...

如上面文件,其中包含乱码,使用模式查找并删除所在行及其下三行(5-8)命令如下:

:g/zone "[^0-9a-zA-Z]/,+3d 

发表评论