BBS水木清华站∶精华区

发信人: Elale (虎子), 信区: Unix 
标  题: vi-faq中文版(2) 
发信站: BBS 水木清华站 (Fri Sep 18 21:32:57 1998) 
 
4.0 - vi档案的在线帮助在哪儿? 
  有一个vi的FAQ,其中列出了vi档案的所有在线文件. 同时它还列出了这些文档 
的镜象站点. 最主要的一个地址是alf.uib.no,但是这些文档在很多很多地地方 
都保存着. vi-archive faq把它们都给列出来了.你在下载这些文件之前一定要 
核对一下这个FAQ.因为很有可能有一个站点比去挪威的站点更近更快些. 
  一个镜象站点是cs.uwp.edu/pub/vi, 另一个是monu6.cc.monash.edu.au/pub/Vi, 
  这些站点上有很多有关vi的文件,还有一些vi的变种版本;当然,UCB版本的vi是 
肯定有的, 还有许多的宏. 
 
5.0 - 好玩的vi诀窍,好玩的宏 
  这一节主要讲述一些无聊的诀窍和一些无聊的宏.事实上,任何vi的诀窍和宏我们 
都欢迎,只要它们不是过分冗长. 如果有人向我建议而我也认为确实值得加的话, 
我会考虑加进去的. 
  
5.1 - 好玩的vi诀窍 
  xp    删除光标下的字符,再把粘贴到后面去.换句话说,它交换了当前两个字符 
        的位置. 
  ddp   和xp类似,不过是交换两行的位置. 
  uu    撤消和重复上次所做的修改.(这可以使你不改变什么东西就可以到你上次所 
        做的修改处) 
 
5.2 - 好玩的宏 
  和垂直上方的字符交换位置 
  map * kxjphxkP 
 
  折行 
  map g $80|F r 
  (译注,我对这条宏表示疑问!) 
  
  改变大多数单词的大小写 
  map v ywmno:s/./\~/g 
  (译注,这条好象也不大对!) 
 
  在当前的单词周围加上`和' 
  map *` i`' 
  在当前的单词周围加上'和' 
  map *' i'' 
  在当前的单词周围加上"和" 
  map *" i"" 
  (这几条也太无聊了吧--译注) 
  在当前的单词周围加上``和`` 
  map! `` `' 
  (咦,好象又有问题?--译注) 
 
  从光标处把当前行分开,在下一行开头加上一个>号(例如,引用USENET).如果加上了单词的折行 
功能那么最后一个单词可能被折在第一行. 
  map g may0O`ay$:s/./ /g 
  (不对吧--译注) 
 
  插入一个字符 
  map g i$^[r 
 
6.0 - 依字母顺序的vi快速参考 
  ...           是指有些东西需要在命令之前或之后指明.这通常是说光标的移动键 
                (h,j,k,l,w,b等等)或者是指行号. 
  #             (这里#代表一个数字) 执行n次后面的命令... 
  :             进入ex模式 
  )             下一句 
  (             上一句 
  }             下一段 
  {             上一段 
  ]]            下一节 
  [[            上一节 
  0             行的开头 
  $             行的末尾 
  ^             行的第一个非空白字符 
  +             下一行的开头 
  -             上一行的开头 
  (空格)        下一个字符 
  (回车)        下一行 
  /             向前搜索 
  ?             向后搜索 
  %             查找当前小(中,大)括号的匹配字符 
  ,             逆向重复上一个f,F,t或T操作 
  ;             重复上一个f,F,t或T操作 
  .             重复上一个操作 
  `             转到标记处 
  '             转到标记所在行的开头 
  ``            查找前回到上一个做标记的地方 
  ''            查找前回到上一个做标记所在行的开头 
  ~             切换字符的大小写 
  "             保存到寄存器中 
  !!            重复上一次SHELL命令 
  !             把后面的文本送给命令, 取代输出(例如, !}fmt把当前的段落 
                送给命令fmt处理,然后用fmt返回的东西替换输出.) 
  >>            右移当前段落一个移动宽度(shiftwidth) 
  <<            左移当前段落一个移动宽度(shiftwidth) 
  >%            从当前到匹配小(中,大)括号之间的文本右移 
  <%            从当前到匹配小(中,大)括号之间的文本左移 
  (似乎漏了一个符号|, 移动到某一列----译注) 
  a             在当前位置之后添加 
  A             在当前行的末尾添加 
  ^a            没有使用 
  b             上一个单词的开头 
  B             上一个单词的开头,忽略标点符号 
  ^b            上移一屏 
  c             覆盖... 
  C             覆盖到行末尾 
  ^c            终止插入模式,在命令模式没有用 
  d             删除... 
  D             删除到行末尾 
  ^d            下移半屏,如果在插入模式下则移到上一个移动宽度(ShiftTab)处 
  e             单词的末尾 
  E             单词的末尾,忽略标点符号 
  ^e            屏幕下卷一行 
  f             查找... 
  F             向后查找... 
  ^f            下移一屏 
  g             未用 
  G             ...跳至[缺省是到文件末尾] 
  ^g            显示状态栏 
  h             左移 
  H             屏幕上的第一行 
  ^h            在插入模式下是退格,命令模式下是左移 
  i             在当前的位置前面插入 
  I             在本行的第一个非空白字符前面插入 
  ^i            插入模式下是制表键,命令模式下未用 
  j             下移 
  J             把下一行合并到本行 
  ^j            命令模式下是下移,插入模式下是建一个新行 
  k             上移 
  K             未用 
  ^k            未用 
  l             右移 
  L             屏幕中的最后一行 
  ^l            重绘屏幕 
  m             把当前位置标记到寄存器中 
  M             屏幕的中间行 
  ^m            回车 
  n             重复上次查找 
  N             逆向重复上次查找 
  ^n            命令模式下是下移 
  o             在当前行的下面建一个新行 
  O             在当前行的上面建一个新行 
  ^o            未用 
  p             在当前行的下面粘贴 
                (译注--应为在当前位置的后面粘贴) 
  P             在当前行的上面粘贴 
                (译注--应为在当前位置的前面粘贴) 
  ^p            命令模式下是上移 
  q             未用 
  Q             退出并且启动ex 
  ^q            未用 
  r             覆盖当前的字符 
  R             在插入模式下一直覆盖字符 
  ^r            在命令模式下面重绘屏幕 
  s             替换 
  S             替换整行 
  t             到... 
  T             向后到... 
  ^t            移到下一个移动宽度(shifttab)处 
  u             撤消上一次操作 
  U             撤消对本行的所有修改 
  ^u            上移半屏 
  v             未用 
  V             未用 
  ^v            未用 
  w             下一个单词的开头 
  W             下一个单词的开头,忽略标点符号 
  ^w            命令模式下未用,在插入模式下是到上一个单词的开头处 
  x             删除当前字符 
  X             删除前一个字符 
  ^x            未用 
  y             复制... 
  Y             复制整行 
  ^y            屏幕上卷一行 
  z             重新配置当前行周围的屏幕 
  ZZ            保存之后退出 
  ^z            未用 
                (译注--在命令模式下,^z执行了UNIX暂停操作) 
   
6.1 - 命令模式的输入选项(:命令) 
  (注: 这不是一个规范的列表,, 我只是列出了一些最重要的命令) 
  :r <文件>     把<文件>读入到当前文档 
  :r !<命令>    把<命令>的输出插入到当前文本中 
  :nr <文件>    把<文件>插入到第n行 
  :!<命令>      运行<命令>,然后返回 
  :sh           转到SHELL  
  :so <文件>    读取<文件>,再执行文件里面的命令 
                (译注--文件中的命令应该都是一些ex命令) 
  :x            保存之后退出 
  :wq           保存之后退出 
  :l1,l2w <文件>把第l1和第l2行之间的文本写到<文件>中去,如果没有指定<文件>, 
                vi就假定是当前文件,如果没有指定l1,l2,就假定是整个文件(就成了:w) 
  :w >> <文件>  添加到<文件>末尾. 也可以使用行号 
  :w!           覆盖当前文件 
  :q            退出 
  :q!           不存盘就退出 
  :e <文件>     不离开vi编辑<文件> 
  :e!           重新编辑当前文件,忽略所有的修改 
  :n            编辑下一个文件 
  :e +n <文件>  从第n行开始编辑<文件>,如果超过了末尾,就从末尾开始编辑 
  :e#           编辑替换文件(如果使用了命令:e<文件>,替换文件就指的是原始文件) 
  :args         显示所有要编辑的文件 
  :rew          重新回到第一个编辑的文档 
  :map m n      创建一个宏(使 m 做 n)  
  :map! m n     创建一个插入模式的宏(使 m 做 n)  
  :unmap m      删除宏m 
  :unmap! m     删除插入模式的宏m 
  :ab <1> <2>   缩写,敲<1>的时候用<2>取代 
  :unab <1>     取消缩写<1>  
  :set <选项>   设置<选项>... 
 
6.2 - 设置选项(set) 
  可以使用括号中的缩写形式.  语法: 
  :set <选项> <参数>  (如果需要参数的话) 
  也可以在一行中指定多个选项 
  :set <选项>? 显示出当前这个选项的参数值 
  :set all 则显示所有的选项值 
  对那些无须参数的选项来说,使用:set no<选项>就可以把它给关了 
 
 
  选项:                 缺省值:         含义: 
  autoindent (ai)       noai            使新行自动缩进,和上(下)行的位置对齐 
  autoprint (ap)        ap              每条命令之后都显示出修改之处 
  autowrite (aw)        noaw            在:n,:!命令之前都自动保存文件 
  beautify (bf)         nobf            在输入的时候忽略所有的控制字符 
                                        (除了制表键(tab),换行(newline),进纸(formfeed)) 
  directory= (dir=)     /tmp            存放缓冲区的目录名 
  edcompatible          noedcompatible  在替换的时候使用类ed的用法 
  errorbells (eb)       errorbells      出错的时候响铃 
  exrc (ex)             noexrc          允许在主目录(home)外面之外放.exrc文件 
  hardtabs= (ht=)       8               设置硬制表的边界 
  ignore case (ic)      noic            正规式里忽略大小写 
  lisp                  nolisp          打开lisp模式 
  list                  nolist          显示所有的制表键和行的结尾 
  magic                 magic           可以使用更多的正规表达式 
  mesg                  mesg            允许向终端发送消息 
  number (nu)           nonumber        显示行号 
  open                  open            允许开放和可视化 
  optimize (opt)        optimize        优化吞吐量,打印时不发回车 
  paragraphs= (para=)   IPLPPPQPPLIbp   设置{ & }的分界符 
  prompt                prompt          命令模式下的输入给出:的提示符 
  readonly (ro)         noro            除非用!号否则不准保存文件 
  redraw                noredraw        当编辑的时候重绘屏幕 
  remap                 remap           允许宏指向其他的宏 
  report=               5               如果影响的行数>这个数的话就报告 
  scroll                1/2 window      下卷屏幕时滚动屏幕的数目, 
                                        同样这也是z命令输出的行数(z 输出2倍滚屏的大小) 
  sections=             SHNHH HU        定义节的末尾(当使用命令[[ 和 ]] 时) 
  shell= (sh=)          /bin/sh         缺省的SHELL,如果设置了环境变量SHELL的话,就使用变量 
  shiftwidth= (sw=)     8               当使用移动(shift)命令时移动的字符数 
  showmatch (sm)        nosm            显示{, }, (, ), [, 或者 ] 的匹配情况 
  showmode              noshowmode      显示你处在什么模式下面 
  slowopen (slow)                       插入之后不要立刻更新显示 
  tabstop= (ts=)        8               设置制表停止位(tabstop)的长度 
  taglength= (tl=)      0                重要标记的字符个数(0表示所有的字符) 
  tags=                 tag, /usr/lib/tags 定义包含标记的文件路径 
  term=                                 设置终端类型 
  terse                 noterse         显示简短的错误信息 
  timeout (to)          timeout         一秒钟后键盘映射超时 
  ttytype=                              设置终端类型 
  warn                  warn            显示"No write since last change"信息 
  window= (w=)                          可视模式下窗口的行数 
  wrapmargin= (wm=)     0               右边距,大于0的话最右边的单词将折行,留出n个空白位置 
  wrapscan (ws)         ws              查找到文件尾后再重头开始 
  writeany (wa)         nowa            可以保存到任意一个文件去 
 
  (译注--这些选项在各种vi版本中都基本上大同小异,以SunOS带的vi为例,它没有这里列出来的open选项, 
         scroll的参数值也不同,还多出来一些选项,如flash,modelines,novice,tagstack等等) 
 
7.0 - 建立 .exrc文件 
  所有命令输入模式下的命令(即 :命令)都可以在.exrc文件中使用,在.exrc中的命令在启动vi的时候自动 
加载.尤其是源命令(so),缩写(ab)和宏定义都可以用.在.exrc中不允许有空行.以"开头的一行vi将把它当成 
注释. 
 
7.1 - .exrc文件的样本 
  以下的.exrc文件是一个实际的例子, 我自己的. 因此,它就没有有些人想象的那样设置很多的选项.即便 
如此,它还是给出一些基本的概念,而且它也相当易懂. 
 
  首先,记住你无须在命令前面加:号,因为它是缺省就添加了的. 
 
"译注--以下是.exrc文件中的内容,为真实起见,而且事实上也相当浅显,我没有翻译其中的注释 
" set wordwrap 9 characters from the right 
set wm=9 
" show matching parenthesis.  When },), or ] is hit, show the opening 
" {,(, or [ that matches it. 
set sm 
" set the shell to be /usr/local/bin/tcsh 
set sh=/usr/local/bin/tcsh 
" a few abbreviations 
" this makes -l automatically become -Larry, and zidlle to be my 
" name and email address. 
ab zidlle E. Larry Lidz - ellidz@midway.uchicago.edu 
ab -l -Larry 
" uppercase V will run ispell -x (-x tells it not to save backups) on current 
" file 
map V :w 
" K will center the line...  (this doesn't work on SunOS -- ??) 
map K :s/^[     ]*// 
" v will reformat the current paragraph 
map v {0!}fmt 
" q runs a program to lock my terminal 
map q :!lock2 
" Splits a line in two at current cursor location, puts a > at the 
"beginning of the line - useful for Usenet/email 
map g may0O`ay$:s/./ /g 
   
8.0 - vi的bug 
  我很想说vi中没有bug,但很不幸,它不是这样的. 这些bug都是初始版本vi中的, 
它其他的一些变种就不一定有. 
  例如 _宏有时就运行的有问题. 
   
9.0 - 术语表 
  如果有人提议说某个术语他不明白,我们将更新这个术语表.如果你有什么建议, 
请一定要告诉我. 
 
  命令模式 command mode  
     
  命令模式是说我们在此模式下面可以向vi发命令(包括光标移动,编辑命令等等) 
   
  ed  
    UNIX里面一个非可视化的编辑器 
 
  <Esc>  
    escape键. 键盘上标记为escape(ESC)的一个键.有时候^[可以起到相同的作用. 
    如果没有escape键,你可以试试Meta键 
  ex  
    UNIX下的一个编辑器.所有vi中的:命令都是送给它处理的 
 
  插入模式 insert mode  
    插入模式是指我们可以在此模式下面键入文本. 
 
  宏 macro  
    宏是一些键的组合起来的快捷方式.例如,某个宏允许我们只敲一个键就可以执行 
    好几个不同的命令. 
 
  开放模式 open mode  
    开始模式是说vi启动的时候不能确定你的终端类型,或者它肯定你的是一个硬的或 
    电子管的终端 
 
  正规表达式 regular expressions (RegEx)  
    正规表达式,通常缩写为"RegEx",是一些关键字的集合,它允许用户在查找的时候有更大的 
    控制力度. RegEx是在UNIX下面用的,但是在很多程序中也用到了它. 
 
  sed  
    流-行式的编辑器.它没有界面,所有命令都是通过命令行的形式给出的. 
 
  vi  
    就是这个FAQ讨论的编辑器 
 
10.0 - 关于vi的参考书目 
  The ULTIMATE GUIDE to the VI and EX Text Editors 
  Hewlett Packard Company (authors) 
  The Benjamin/Cummings Publishing Company, Inc. 
  ISBN 0-8053-4460-8 
 
  A PRACTICAL GUIDE TO THE UNIX SYSTEM 
  Mark G. Sobell 
  Benjamin Cummings Publisher 
 
  LEARNING THE VI EDITOR 
  Linda Lamb 
  O'Reilly & Associates 
  ISBN 0-937175-67-6 
 
  如果你知道哪些书籍对学习vi很有好处,别忘了给我个建议, 我会把这些书目也加到 
这一节来的. 
 
----------------------------------------------- 
 
  E. Larry Lidz, 1994, 1995.  版权所有 
   
----------------------------------------------- 
Elale@163.net 
   
 
-- 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.68.3] 

BBS水木清华站∶精华区