Chinaunix首页 | 论坛 | 博客
  • 博客访问: 95987
  • 博文数量: 23
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-12 12:22
文章分类

全部博文(23)

文章存档

2009年(3)

2008年(20)

我的朋友

分类: LINUX

2008-11-12 16:25:25

本文的目标不是一个VI编辑器的教材。它只是个人在使用VI编程的过程中,对自认为比较有用的一些编辑功能及其它功能的一些整理。

一、基本编辑功能
    1、复制、剪切和粘贴
    复制特定的某一段:把光标移到要复制的文本的头部,按下“v”,往后移动光标,光标所过之处的字符>都会高亮,移到欲复制文本的尾部后,按下“y”,高亮文本全部被复制到剪粘板。
    复制某一行:把光标移到要复制的那一行,按下“yy”,该行就被复制到剪粘板。
    剪切特定的某一段:把光标移到要剪切的文本的头部,按下“v”,往后移动光标,光标所过之处的字符>都会高亮,移到欲剪切文本的尾部后,按下“x”,高亮文本全部被复制到剪粘板。
    剪切某一行:把光标移到要剪切的那一行,按下“dd”,该行就被复制到剪粘板。
    粘贴剪粘板的内容到光标处:把光标移到要粘贴的位置,按下“p”。
    2、搜索、替换
    向前搜索字符串“example”:/example。
    向后搜索字符串“example”:?example。
    搜到第一个字符串后,按下“n”向后搜索下一个,按下“N”向前搜索下一个。
    全文替换:  把全文的old替换为new :%s/old/new/g
                把全文的old替换为new,但每次要求确认::%s/old/new/c
    3、Undo和redo
    Undo:按下“u”。
    Redo: 按下“Ctrl + R”。
    4、保存、另存为
    保存:“w”。
    另存为:“w filename”。
二、语法高亮,格式设置
    首先在vi中导入vimrc范例文件::read $VIMRUNTIME/vimrc_example.vim。然后把它保存到你的用户目录下,保存文件名为.vimrc。文件中有一句:syntax on。即为开启语法高亮功能。
    关于这个文件中,还有几个比较有用的设置:
    :set ruler       "任何时候都显示光标位置。
    :set showcmd     "显示不完整的命令。
    :set tabstop=4   "tab键缩进4格。
    :set number
    :set cindent
   //所有用户的配置文件为:/etc/vimrc

三、关键字补全
    Ctrl + N:找到匹配的关键字把当前未拼写完的关键字补充完整,如果有多个可匹配项,则每按一次Ctrl+N,切换到下一项。如果习惯用tab键补充关键字,则可以在.vimrc文件中添加如下代码:
    function! CleverTab()
        if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$'
            return "\"
        else
            return "\"
    endfunction
    inoremap =CleverTab()

四、编辑一个工程
    通常我们在开发一个程序中,不止一个源程序文件,我们要在整个工程中编辑源代码,就需要经常在文件间进行切换,这时,可以使用命令:
    :e filename
    切换到目标文件,而不需要退出vi。
    编辑完成,要make,直接输入make命令,如果有错误,该命令执行完毕后,会自动跳到第一个错误的地方,还有几个命令可以在错误行之间定位:
    :cc 显示错误信息。
    :cn 显示下一条错误信息。
    :cp 显示前一条错误信息。
    :cl 列出所有错误。
五、其它
    1、括号匹配。
    包括{} [] ()的匹配,在某一个括号上按下%,便会自动跳到与之匹配的那个括号处,再按一下%,就会跳回来。
    2、获得在线帮助。
    在编辑程序源代码时,如果对某个系统函数的用法不是很明确,把光标移到这个函数下,按下“K”,便>会跳出这个函数的man帮助信息。
    3、暂时回到shell。
    输入命令:sh
    4、在vi中执行shell命令。
    输入:!cmd,比如:!ls。


________________________________________________

vi命令详解

vi命令是unix下常用而重要命令,可在全屏幕方式下编辑一个或多个文件。若在vi执行时没有指定一个文件,那么vi命令会自动产生一个无名的空 的工作文件。若指定的文件不存在,那么就按指定的文件名创建一个新的文件。若对文件的修改不保存的话,v i命令并不改变原来文件的内容。

  注意:vi命令并不锁住所编辑的文件,因此多个用户可能在同时编辑一个文件,那么最后保存的文件版本将被保留。

下面是vi命令使用的一些选项及含义:

  -c sub-command 在对指定的文件编辑前,先执行指定的命令 sub-command .

  -r filename 恢复指定的文件filename .

  -R 将指定的文件以只读的方式放入编辑器中,这样不会保存对文件的任何修 改。

  -y number 将编辑窗口的大小设为number行。

  下面是vi编辑所处的三种模式:

  命令模式 进入vi时所处的模式。在此模式下用户可输入各种子命令对进行*作,如删除行、粘贴行、移向下一个字、移向不同行等。

  文本输入模式 在此模式下可以修改一行的内容并增添新行。在命令模式下键入a 、i 或c键可进入文本输入模式,按Escape键可返回命令模式。

  命令项模式 在此模式下,可以通过子命令输入更多的参数。如:w子命令要求输入一文件名,”/”子命令要求输入一个查找项。用户使用Escape键返回命令模式。

下面是自命令模式下执行的,在同一行上移动的自命令

  h 将光标左移一格。

  l 将光标右移一格。

  j 将光标下移一格。

  k 将光标上移一格。

  w 将光标移到下一个小字的前面。

  W 将光标移到下一个大字的前面。

  b 将光标移到前一个小字的前面。

  B 将光标移到前一个大字的前面。

  e 将光标移到下一个小字的后面。

  E 将光标移到前一个大字的后面。

  fc 把光标移到同一行的下一个c字符处。

  Fc 把光标移到同一行的前一个c字符处。

  tc 把光标移到同一行的下一个字符c的前一格。

  Tc 把光标移到同一行的前一个字符c的后一格。

  number| 把光标移到递number列上。

下面是命令模式下在行间移动的子命令

  +或Enter 把光标移至下一行第一个非空白字符。

  - 把光标移至上一行第一个非空白字符。

  0 把光标移到当前行的第一个字符处。

  $ 把光标移到当前行的最后一个字符处。

  H 把光标移到屏幕最顶端一行。

  L 把光标移到屏幕最底端一行。

  M 把光标移到屏幕中间。

下面是命令模式下改变屏幕显示的子命令

  z- 把当前行作为屏幕的最后一行,并重新显示屏幕。

  z. 把当前行作为屏幕的中间一行,并重新显示屏幕。

  Ctrl+l 重新显示屏幕当前内容。

  /pattern/z- 寻找pattern的下一个位置,并把所在行设为屏幕的最后一行。

下面是在命令模式下用来显示页面的子命令

  Ctrl + f向后滚一页。

  Ctrl + d向后滚半页。

  Ctrl + b向前滚一页。

  Ctrl + u向前滚半页。

  Ctrl + e屏幕向下滚一行。

  Ctrl + y屏幕项上滚一行。

下面是在命令模式下用来查找字符串所使用的子命令

  /pattern 向后寻找指定的pattern ,若遇到文件尾,则从头再开始。

  ?pattern 向前寻找指定的pattern ,若遇到文件头,则从尾再开始。

  n 在上次指定的方向上,再次执行上次定义的查找。

  N 在上次指定的方向的相反方向上,再次执行上次定义的查找。

  /pattern/+number 将光标停在包含pattern的行后面第number行上。

  /pattern/-number 将光标停在包含pattern的行前面第number行上。

  % 移到匹配的”()”或”{}”上。

下面是在文本输入模式下用来输入文本的子命令(用户可在任何时候按Escape返回到命令模式):

  a 在光标之后开始输入文本。

  A在行尾开始输入文本。

  i在光标之前开始输入文本。

  I在行首第一个非空白字符前输入文本。

  o在光标所在行后插入一空行。

  O在光标所在行前插入一空行。

下面是在命令模式下改变文本所使用的子命令(用户可在任何的时候按Escape键返回到命令模式):

  cc或S 修改一整行。

  C 改变一行光标位置以后的部分。

  cw 改变光标所在单词。

  dd删除当前行。

  D 删除光标所在行光标后面的内容。

  dw删除光标所在的单词。

  J 把下一行内容加到本行行尾。

  rc把光符所在字符替换成c .

  R 覆盖本行内容。

  u恢复上一次的修改。

  x删除光标所在的字符。

  ~ 改变光标所在出字符的大小写。

  . 重复上一个*作。

  <<把当前行移到左边。

  >>把当前行移到右边。

下面是用于文件中拷贝文本的字命令

  p 将缓冲区内容取到光标所在行的下面一行。

  P 将缓冲区内容取到光标所在行的上面一行。

  ”bd 将文本删除至有名缓冲区b .

  ”bp 张贴有名缓冲区b中内容。

  yy把当前行放入缓冲区。

  Y 把当前行放入缓冲区。

  Yw把光标所在的单词放入缓冲区。

下面是用于保存文件的子命令

  :w 回写修改后的文件。

  :w filename 当filename不存在时,把修改后的文件存为文件filename ,当文件filename存在时,报错。

  !w filename 如果文件filename存在时,把修改后的文件保存为文件filename .

下面列出了在vi编辑的多个文件之间切换所用的子命令

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

  :n filenames 指定将被编辑的新的文件列表。

下面列出了用于在当前文件和另外一个文件间切换的子命令:

  :e filename 使用filename激活vi (在vi中装入另一个文件filename)。

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

  :e+filename 使用filename激活vi ,并从文件尾部开始编辑。

  :e+number filename 使用filename激活vi ,并在第number行开始编辑。

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

下面是在本文件中加入其他文件代码所使用的子命令:

  :r filename读取filename文件,并将其内容加到当前文件后。

  :r ! command执行command文件,并将其输出加到当前文件后。

下面是vi中其他的子命令

  ctrl+g 取得正在编辑文件的有关信息。

  :sh启动sh ,从sh中返回可用exit或ctrl+d .

  :! Command 执行命令command .

  !!重新执行上次的:! Command子命令。

  :q退出vi ,若用户对编辑的文件有所修改,系统不会让用户使用q命令退出。

  :q!退出vi而不管是否对文件有改动。

  ZZ或:wq 保存对文件的修改并退出vi .

  用户可在一个特殊的文件.exrc中定义特殊的vi命令。在vi中使用这些命令时,必须在该
命令前加上一个冒号( :) 。

——————————————————-

vi 的模式

vi 是在很久以前就写的程序。在那个时候,键盘上没有现在熟悉的那么多功能键。所以,vi 设计成通过输入字符和 ESC 来控制输入和修改文本。

可能这对于一些人来说是个遗憾,但是你会发现你不需要改变手在键盘上的位置就可以完成所有的功能。结果是你的输入将快速起来。

为了完成交互的全屏幕编辑工作, vi 有三种模式。插入模式 (insert) 用于输入文本。在插入模式下,你输入的任何字符都将显示在屏幕并存于文件。命令 (command) 模式用于大多数编辑功能。在命令模式下,所有的输入都将产生一定的响应而不是直接到文本中,例如移动光标、删除一块文本、拷贝文本等。第三个模式是执行另 外的功能,例如查找、全局替换、处理多个文件等。这种模式是基于 ex 编辑器的。
启动 vi

当 vi 启动后,默认的模式是命令模式。按照下面的步骤试一试:输入程序名称启动 vi :

$ vi

你将看到类似下面的东西:

~~~~~~~~~~~~~~~~~~~~~~~~~Empty buffer

i–插入

现在我们输入 “i” 进入插入模式。字符 “i” 将不会回显。此后你输入的任何东西都将显示在缓存中。现在我们来输入一段文字。 例子中的话来自英文版的孙子兵法。注意光标的位置在例子中是个下划 线。

If wise, a commander is able to recognize changing circumstances and toact expediently. If sincere, his men will have no doubt of the certainty ofrewards and punishments. If humane, he loves mankind, sympathizes with others,and appreciates their industry and toil. If courageous, he gains victory byseizing opportunity without hesitation. If strict, his troops are disciplinedbecause they are in awe of him and are afraid of punishment. Shen Pao-hsu … said: ‘If a general is not courageous he will be unableto conquer doubts or to create great plans.’~~~~~~~~~~~~~~~~

Esc–Cancel

当你输入完了,按下 Esc 键返回到命令模式。 (如果你已经处于命令模式下,按 Esc 时会听到喇叭的声音。) Esc 可以撤消未完成的命令和终止插入模式。按 Esc 后,光标将停留在你最后输入的字符的下面。

很不幸,没有一个明显的标志表明你现在处于什么模式下。但是有简单的方 法来告诉你现在你所处的模式。如果你按下键,相应的字符出现在屏幕上,那么 你是在插入模式下,否则是命令模式下。如果你不能确定你现在所处的模式,那么 按 Esc 两次以听到喇叭声来确信你在命令模式下。
移动光标和简单的编辑

是看一看基本的移动光标命令的时候了。训练训练你的手指,让他们以后自动的执行你所想的命令吧。
最重要的移动命令

让我们来看看有多少影响光标移动的命令。
hh–光标左移

首先,按 5 下 h 让光标左移动 5 个 (如果你看到 h 跑到屏幕上了的话,一定是你忘记了按 Esc )。光标现在应该在 “plans” 中的 “p” 下面 (看下面的例子):

If wise, a commander is able to recognize changing circumstances and toact expediently. If sincere, his men will have no doubt of the certainty ofrewards and punishments. If humane, he loves mankind, sympathizes with others,and appreciates their industry and toil. If courageous, he gains victory byseizing opportunity without hesitation. If strict, his troops are disciplinedbecause they are in awe of him and are afraid of punishment. Shen Pao-hsu … said: ‘If a general is not courageous he will be unableto conquer doubts or to create great plans.’~~~~~~~~~~~~~~~

kk–光标上移

现在我们来按 5 次 k 让光标上移 5 行。也许你该认为应该有快捷方式了。好,现在就有个简单的方法:在你要采取的 行动前加上数字。按下 5k 你可以和按 5 下 k 有相同的结 果了。光标现在该在 “he” 的”e”下了。

If wise, a commander is able to recognize changing circumstances and toact expediently. If sincere, his men will have no doubt of the certainty ofrewards and punishments. If humane, he loves mankind, sympathizes with others,and appreciates their industry and toil. If courageous, he gains victory byseizing opportunity without hesitation. If strict, his troops are disciplinedbecause they are in awe of him and are afraid of punishment. Shen Pao-hsu … said: ‘If a general is not courageous he will be unableto conquer doubts or to create great plans.’~~~~~~~~~~~~~~~~

在使用这些功能的时候有些限制的。例如使用 h 或 l 移动光标超过了一行文字的头或尾,光标将停留在头或尾部,喇叭鸣叫提醒 你。

还有其他的类似 h 和 k 的吗?看一看表3.2。最好的熟悉他们 的的方法是多用他们。
表 3.2. 常见的方向键

命令 移动
h 左一个字符
j 下一行
k 上一行
l 右一个字符
w, W 前一个单词 (W 忽略标点)
b, B 后一个单词 (B 忽略标点)
$ 到行尾
^ 到行首第一个非空字符
0 行首
G 到缓冲首
nG 到第 n 行

大小写的命令是有一些区别的。小写字母一般以标点区分 “words.”,而大写则忽略他们。
最重要的编辑程序

让我们看看最简单也是最常用的编辑过程:

修改 没有人不犯错误。所以迟早你会碰到修改你输入的文本的时候。实际上花在字处理上的大多数时间是修改而不是输入新的东西。因此,你要知道如何方便地修改就很重要。

x–删除一个字符 删除文字的最简单的方式是用 x。这个命令的结果是光标所处 的字符的消失,后面的文字左移动。如果你删除的字符是一行最后的一个字符, 那么光标将向左移动一个,这样光标就不会停留在不存在的字符的下面了。假如 没有任何文字了,喇叭就叫。

d–删除对象 这个命令的右边还要有一定的文字对象。文字对象就是一块文字。他右边接的就是在控制光标移动的那些字符。例如 w 表示向前一个单词,那么 dw 将删除下一个单词。5w 表示前进 5 个单词,那么 d5w 将删除他们。

dd–删除一行 最常用的 d 系列命令之一。和前面一样, 5dd 将删除 5 行

D–整个删除 大写形式的 D 用来删除从光标到行尾。和 d$ 一样效果。

u–恢复 要后悔吗?他不仅仅撤消删除,还撤消你所有的编辑工作。

.–重复 重复编辑工作。


阅读(1217) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~