vim 命令(全)

vim 命令() 收藏

 

本章提供足够的信息使你用够使用 Vim 来做基本的编辑。这里提供的方法不一定是高效
快捷的。但起码是有效的。花些时间去练习这些命令,这是后面的知识的基础。

|02.1|  第一次运行 Vim
|02.2| 
插入文本

|02.3| 
移动光标
|02.4| 
删除字符
|02.5| 
撤销与重做
|02.6| 
其它编辑命令
|02.7| 
退出
|02.8| 
寻求帮助

    下一章:|usr_03.txt| 移动
   
前一章:|usr_01.txt| 关于本手册
     
目录:|usr_toc.txt|

--------------------------------------------------------------------------------

*02.1*  第一次运行 Vim

启动 Vim 的命令如下:

        gvim file.txt

UNIX 操作系统中,你可以在任意命令提示符下输入这个命令。如果你用的是 Microsoft
Windows,
启动一个 MS-DOS 窗口,再输入这个命令。

   
无论哪一种方式,现在 Vim 开始编辑一个名为 file.txt 的文件了。由于这是一个新建
文件,你会得到一个空的窗口。屏幕看起来会象下面这样:

        +---------------------------------------+
        |#                                      |
        |~                                      |
        |~                                      |
        |~                                      |
        |~                                      |
        |"file.txt" [New file]                  |
        +---------------------------------------+
                ('#"
是当前光标的位置)

以波纹线(~)开头的行表示该行在文件中不存在。换句话说,如果 Vim 打开的文件不能充满
这个显示的屏幕,它就会显示以波纹线开头的行。在屏幕的底部,有一个消息行指示文件
名为 file.txt 并且说明这是一个新建的文件。这行信息是临时的,新的信息可以覆盖它。


VIM

gvim 命令建立一个新窗口用于编辑。如果你用的是这个命令:

        vim file.txt

则编辑在命令窗口内进行。换句话说,如果你在 xterm 中运行,编辑器使用 xterm 窗口。
如果你用的是 Microsoft Window MS-DOS 窗口,编辑器使用这个 MS-DOS 窗口。两个
版本显示出来的文本看起来是一样的。但如果你用的是 gvim,就会有其他特性,如菜单条。
后面会有更多的描述。

--------------------------------------------------------------------------------

*02.2*  插入文本

Vim 是一个多模式的编辑器。就是说,在不同模式下,编辑器的响应是不同的。在普通模式
下,你敲入的字符只是命令;而在插入模式,你敲入的字符就成为插入的文本了。
   
当你刚刚进入 Vim,它处在普通模式。通过敲入"i"命令(i Insert 的缩写)可以启动
插入模式,这样你就可以输入文字了,这些文字将被插入到文件中。不用担心输错了, 你还
能够随后修正它。要输入下文的程序员打油诗,你可以这样敲:

        iA very intelligent turtle
        Found programming UNIX a hurdle

输入"turtle"后,你通过输入回车开始一个新行。最后,你输入 <Esc> 键退出插入模式而
回到普通模式。现在在你的 Vim 窗口中就有两行文字了:

        +---------------------------------------+
        |A very intelligent turtle              |
        |Found programming UNIX a hurdle        |
        |~                                      |
        |~                                      |
        |                                       |
        +---------------------------------------+


式?

要看到你在什么模式,输入如下命令:

        :set showmode

你会发现当你敲入冒号后,Vim 把光标移到窗口的最后一行。那里是你输入冒号命令
(
以冒号开头的命令)的地方,敲入回车结束这个命令的输入(所有的冒号命令都用

这种方式结束)
   
现在,如果你输入 "i" 命令,Vim 会在窗口的底部显示 --INSERT--(中文模式
显示的是--插入-- —— 译者注),这表示你在插入模式。

        +---------------------------------------+
        |A very intelligent turtle              |
        |Found programming UNIX a hurdle        |
        |~                                      |
        |~                                      |
        |-- INSERT --                           |
        +---------------------------------------+

如果你输入<Esc>回到普通模式,最后一行又变成空白。


Vim 新手常常遇到的一个问题是不知道自己在什么模式下,可能是因为忘了,也可能
是因为不小心敲了一个切换模式的命令。无论你在什么模式,要回到普通模式,只
要敲 <Esc> 就可以了。有时你需要敲两次,如果 Vim 发出一声,就表示你已经
在普通模式了。

--------------------------------------------------------------------------------

*02.3*  移动光标

回到普通模式后,你可以使用如下命令移动光标:

        h                                                     *hjkl*
        j      

        k      

        l      

这些命令看起来是随便选的。无论如何,谁听说过用 l 表示右的?但实际上,作这些选择
是有理由的:移动光标是最常用的编辑器命令。而这些键位是在你本位的右手。也就是说:
这种键位的设定使你可以以最快的速度执行移动操作(特别是当你用十指输入的时候)

        Note:
       
你还可以用方向键移动光标,但这样会减慢你输入的速度,因为你必须把你的手从

       
字母键移动到方向键。想象一下,你在一个小时内可要这样做几百次,这可要花
       
相当多的时间的。
           
而且,有一些键盘是没有方向键的,或者放在一些很特别的地方。所以,
       
知道 hjkl 的用法在这些情况下就很有帮助了。

记住这些命令的一个方法是:h 在左边,l 在右边,j 指着下面。用图表示如下:

                       k
                   h     l
                     j

学习这些命令的最好方法是使用它。用 "i" 命令输入更多的文字。然后用 hjkl 键移动
光标并在某些地方输入一些单词。别忘了用 <Esc> 切换回普通模式。|vimtutor|也是一个
练习的好办法。

--------------------------------------------------------------------------------

*02.4*  删除字符

要删除一个字符,把光标移到它上面然后输入 "x"(这是对以前的打字机的一种回归,
那时你通过在字符上输入xxxx删除它) 例如,把光标移到行首,然后输入xxxxxxx(七个x
可以删除 "A very"。结果看起来这样:

        +---------------------------------------+
        |intelligent turtle                     |
        |Found programming UNIX a hurdle        |
        |~                                      |
        |~                                      |
        |                                       |
        +---------------------------------------+

现在你可以输入新的字符了,例如,通过输入:

        iA young <Esc>

这个命令启动一次插入操作(那个"i"),并插入 "A young",然后退出
插入模式(最后一个<Esc>)。结果是:

        +---------------------------------------+
        |A young intelligent turtle             |
        |Found programming UNIX a hurdle        |
        |~                                      |
        |~                                      |
        |                                       |
        +---------------------------------------+


要删除一整行,使用 "dd" 命令,后一行会移上来填掉留下的空行:

        +---------------------------------------+
        |Found programming UNIX a hurdle        |
        |~                                      |
        |~                                      |
        |~                                      |
        |                                       |
        +---------------------------------------+

Vim 中你可以把两行连起来,这意味着两行间的换行符被删除了。"J" 命令
用于完成这个功能。
   
以下面两行为例子:

        A young intelligent
        turtle

把光标移到第一行,然后按 "J"

        A young intelligent turtle

--------------------------------------------------------------------------------

*02.5*  撤销与重做

假设现在你删得太多了。当然,你可以重新输入需要的内容。不过,你还有一个更简单的
选择。"u" 命令撤销上一个编辑操作。看看下面这个操作:先用 "dd" 删除一行,再敲
"u"
,该行又回来了。
   
再给一个例子:把光标移到第一行的 A 上:

        A young intelligent turtle

现在输入 xxxxxxx 删除 "A young"。结果如下:

        intelligent turtle

输入"u" 撤销最后一个删除操作。那个删除操作删除字符 g,所以撤销命令恢复这个字符:

        g intelligent turtle

下一个 u 命令恢复倒数第二个被删除的字符:

        ng intelligent turtle

下一个 u 命令恢复 u,如此类推:

        ung intelligent turtle
        oung intelligent turtle
        young intelligent turtle
        young intelligent turtle
        A young intelligent turtle

        Note:
       
如果你输入 "u" 两次,你的文本恢复原样,那应该是你的 Vim 被配置在 Vi 兼容

       
模式了。看这里修正这个问题:|not-compatible|
       
本文假定你工作在 "Vim 的方式"。你可能更喜欢旧的 Vi 的模式,但是你必须
       
小心本文中的一些小区别。


如果你撤销得太多,你可以输入CTRL-Rredo)回退前一个命令。换句话说,它撤销
一个撤销。要看执行的例子,输入CTRL-R两次。字符 A 和它后面的空格就出现了:

        young intelligent turtle

有一个特殊版本的撤销命令:"U" (行撤销)。行撤销命令撤销所有在前一个编辑行
上的操作。 输入这些命令两次取消前一个 "U"

        A very intelligent turtle
          xxxx                 
删除 very

        A intelligent turtle
                      xxxxxx           
删除turtle

        A intelligent
                                
"U" 恢复行

        A very intelligent turtle
                               
"u" 撤销 "U"
        A intelligent

"U" 命令本身就是一个改变操作,"u" 命令撤销该操作,CTRL-R 命令重做该操作。
有点乱吧, 但不用担心,用 "u" CTRL-R 命令你可以切换到任何你编辑过的状态。

--------------------------------------------------------------------------------

*02.6*  其它编辑命令

Vim 有大量的命令可以修改文本。参见|Q_in|和下文。这里是一些经常用到的:

"i" 命令在光标所在字符前面插入字符。一般情况下,这就够用了,但如果你刚好想在
行尾加东西怎么办?要解决这个问题,你需要在文本后插入字符。这通过 "a" (append)
命令实现。

   
例如,要把如下行

        and that's not saying much for the turtle.
改为

        and that's not saying much for the turtle!!!

把光标移到行尾的句号上。然后输入 "x" 删除它。现在光标处于一行的尾部了,现在输入

        a!!!<Esc>

添加三个感叹号到 turtle "e" 后面:

        and that's not saying much for the turtle!!!


"o" 命令在光标下方建立一个新的空行,并把 Vim 切换到插入模式。然后你可以在这个
新行内输入文本了。
   
假定你的光标在下面两行中第一行的某个地方:

        A very intelligent turtle
        Found programming UNIX a hurdle

如果你现在用 "o" 命令并输入新的文字:


        oThat liked using Vim<Esc>

结果会是:

        A very intelligent turtle
        That liked using Vim
        Found programming UNIX a hurdle

"O" 命令(大写)在光标上方打开一个新行。


假定你想向上移动 9 行,你可以输入 "kkkkkkkkk" 或者你可以输入"9k"。实际上,
你可以在很多命令前面加一个数字。例如在这章的前面,你通过输入 "a!!!<Esc>"
增加三个感叹号。另一个方法是使用命令 "3a!<Esc>"。次数 3 要求把后面的命令

执行三次。同样的,要删除三个字符,可以使用 "3x"。次数总是放在要被处理多次
的命令的前面。

--------------------------------------------------------------------------------

*02.7*  退出

使用 "ZZ" 命令可以退出。这个命令保存文件并退出。
        Note:
       
与其他编辑器不一样,Vim 不会自动建立一个备份文件。如果你输入 "ZZ"
       
你的修改立即生效并且不能恢复。你可以配置 Vim 让它产生一个备份文件,
       
参见|07.4|


有时你会做了一系列的修改才突然发现还不如编辑之前。不用担心,Vim 放弃修改
并退出的命令,那就是:

        :q!

别忘了按回车使你的命令生效。

这个命令执行的细节是:命令有三部分,包括冒号(:),它使 Vim 进入命令模式,
q
命令,它告诉 Vim 退出,而感叹号是强制命令修饰符。
   
这里,强制命令修饰符是必要的,它强制性地要求 Vim 放弃修改并退出。如果你只是
输入":q"Vim 会显示一个错误信息并拒绝退出:

        E37: No write since last change (use ! to override)

通过指定强制执行,你实际上在告诉 Vim我知道我所做的看起来很傻,但我长大了,
知道自己在做什么。

如果你放弃修改后还想重新编辑,用 ":e!" 命令可以重新装载原来的文件。

--------------------------------------------------------------------------------

*02.8*  寻求帮助

所有你想知道的东西,都可以在 Vim 帮助文件中找到答案,随便问!
   
要获得一般的帮助用这个命令:

        :help

你还可以用第一个功能键 <F1>。如果你的键盘上有一个 <Help> 键,可能也有效。
   
如果你不指定主题,":help" 将命令显示一个总揽的帮助窗口。Vim 的作者在帮助系
统方面使用了一个很聪明的方案(也许可以说是很懒惰的方案):他们用一个普通的编辑窗
口来显示帮助。你可以在帮助窗口中使用任何普通的 Vim 命令移动光标。所以,hjk
l 还是表示左,下,上和右。

   
要退出帮助窗口,用退出一个普通窗口的命令:"ZZ"。这只会退出帮助窗口,而不会
退出 Vim

当你阅读帮助的时候,你会发现有一些文字被一对竖线括起来了(例如|help|)。这表示
一个超级链接。如果你把光标移到这两个竖线之间并按 CTRL-](标签跳转命令) 帮助
系统会把你引向这个超级链接指向的主题。(由于不是本章的重点,这里不详细讨论,
Vim
对超级链接的术语是 "标签"(tag),所以 CTRL-] 实际是跳转到光标所在单词为名
的标签所在的位置。)
   
跳转几次以后,你可能想回到原来的地方。CTRL-T(标签退栈)把你送回前一个

跳转点。CTRL-O (跳转到前一个位置)也能完成相同的功能。
   
在帮助屏幕的顶上,有一个符号: *help.txt*。这个名字被帮助系统用来定义一个标签
(
也就是超级链接的目标)
   
参见|29.1|可以了解更多关于标签的内容。

要获得特定主题的帮助,使用如下命令:

        :help {主题}

例如,要获得 "x" 命令的帮助,输入如下命令:

        :help x

要知道如何删除文本,使用如下命令:

        :help deleting

要获得所有命令的帮助索引,使用如下命令:

        help index

如果你需要获得一个包含控制字符的命令的帮助(例如 CTRL-A),你可以在它前面
加上前缀"CTRL-"

        help CTRL-A

Vim 有很多模式。在默认情况下,帮助系统显示普通模式的命令。例如,如下命令显示
普通模式的 CTRL-H 命令的帮助:

        :help CTRL-H

要表示其他模式,可以使用模式前缀。如果你需要插入模式的命令帮助,使用 "i_"
缀。例如对于 CTRL-H,你可以用如下命令:

        :help i_CTRL-H

当你启动 Vim,你可以使用一些命令行参数。这些参数以短横线开头(-)。例如知道要-t
这个参数是干什么用的,可以使用这个命令:

        :help -t

Vim 有大量的选项让你定制这个编辑器。如果你要获得选项的帮助,你需要把它括在一个
单引号中。例如,要知道 'number' 这个选项干什么的,使用如下命令:

        :help 'number'

如果你看到一个你不能理解的错误信息,例如:

        E37: No write since last change (use ! to override)

你可以使用使用E开头的错误号找关于它的帮助:

        :help E37


在你插入或者删除之前,你需要移动到合适的位置。Vim 有一大堆命令可以移动光标。
本章向你介绍最重要的那些。你可以在 |Q_lr| 下面找到这些命令的列表。

|03.1|  词移动
|03.2| 
移动到行首或行尾
|03.3| 
移动到指定的字符
|03.4| 
括号匹配
|03.5| 
移动到指定的行
|03.6| 
确定当前位置
|03.7| 
滚屏
|03.8| 
简单查找
|03.9| 
简单的查找模式
|03.10|
使用标记

    下一章:|usr_04.txt|  做小改动
   
前一章:|usr_02.txt|  Vim 初步
     
目录:|usr_toc.txt|

--------------------------------------------------------------------------------

*03.1*  词移动

要移动光标向前跳一个词,可以使用 "w" 命令。象大多数 Vim 命令一样,你可以在命令前
加数字前缀表示把这个命令重复多次。例如,"3w" 表示向前移动3个单词。用图表示如下:

        This is a line with example text
          --->-->->----------------->
           w  w  w    3w

要注意的是,如果光标已经在一个单词的词首,"w" 移动到下一个单词的词首。
    "b"
命令向后移动到前一个词的词首:

        This is a line with example text
        <----<--<-<---------<---
           b   b b    2b      b

还有一个 "e" 命令可以移到下一个单词的词末,而 "ge" 则移动到前一个单词的末尾:

        This is a line with example text
           <-   <--- ----->   ---->
           ge    ge     e       e

如果你在一行的最后一个单词,"w" 命令将把你带到下一行的第一个单词。这样你可以
用这个命令在一段中移动,这比使用 "l" 要快得多。"b" 则在反方向完成这个功能。

一个词以非单词字符结尾,例如 ".""-" 或者 ")"。要改变 Vim 使用的 "分词符"
请参见 'iskeyword' 选项。
   
还可以以 "空白字符" 分割的 "大单词" 移动。这不是我们通常意义的 "单词。这
就是为什么称之为 "大单词" 的原因。如下图所示:

               ge      b          w                             e
               <-     <-         --->                          --->
        This is-a line, with special/separated/words (and some more).
           <----- <-----         -------------------->         ----->
             gE      B                   W                       E
               ge      b          w                             e

组合运用这些大写和小写的命令,你可以很快地在一段中前后移动。

--------------------------------------------------------------------------------

*03.2*  移动到行首或行尾

"$" 命令把光标移动到当前行行尾。如果你的键盘上有 <End> 键,也可以完成相同的功能。

"^" 命令把光标移动到当前行的第一个非空字符,而 "0" 命令则移到一行的第一个字符,
<Home>
键也可以完成相同的功能。图示如下:

                  ^
             <------------
        .....This is a line with example text
        <-----------------   --------------->
                0                  $

(这里 "....." 表示空白字符)

    象大多数移动命令一样,"$" 命令接受个次数前缀。但是 "移动到一行的行尾n"
有什么意义,所以它会使光标移动到另一行。例如,"1$" 移动到当前行的行尾,而
"2$"
则移动到下一行的行尾,如此类推。
    "0"
命令不能加个数前缀,因为 "0" 本身就是个数字。而且,出人意料地是,"^"
令也不支持数字前缀。

--------------------------------------------------------------------------------

*03.3*  移动到一个指定的字符

单字符查找命令是最有用的移动命令之一。"fx" 命令向前查找本行中的字符 x。提示:
"f"
表示 "Find"
   
例如,假定你在下面例子行的行首,而你想移动到单词 "human" h那里。只要执行
命令 "fh" 即可:

        To err is human.  To really foul up you need a computer.
        ---------->--------------->
            fh           fy

这个例子还演示了用 "fy" 命令移动到 "really" 的词尾。
   
你可以在这个命令前面加数字前缀,所以,你可以用 "3fl" 命令移动到 "foul"
"l":

        To err is human.  To really foul up you need a computer.
                  --------------------->
                           3fl

"F" 命令用于向左查找:

        To err is human.  To really foul up you need a computer.
                  <---------------------
                            Fh

"tx" 命令与 "fx" 相似,但它只把光标移动到目标字符的前一个字符上。提示:"t"
表示 "To"。这个命令的反向版本是 "Tx"

        To err is human.  To really foul up you need a computer.
                   <------------  ------------->
                        Th              tn

这四个命令可以通过 ";" 命令重复,"," 命令则用于反向重复。无论用哪个命令,光标
永远都不会移出当前行,哪怕是这两行是连续的一个句子。

有时你启动了一个查找命令后才发现自己执行了一个错误的命令。例如,你启动了一个
"f"
命令后才发现你本来想用的是 "F"。要放弃这个查找,输入 <Esc>。所以
"f<Esc>"
取消一个向前查找命令而不做任何操作。 Note: <Esc> 可以中止大部分命令,
而不仅仅是查找。

--------------------------------------------------------------------------------

*03.4*  括号匹配

当你写程序的时候,你经常会遇到嵌套的()结构。这时,"%" 是一个非常方便的命令
了:它能匹配一对括号。如果光标在 "(" 上,它移动到对应的 ")" 上,反之,如果它在
")"
上,它移动到 "(" 上。

                            %
                         <----->
                if (a == (b * c) / d)
                   <---------------->
                            %

这个命令也可适用于 [] {}。(可用'matchpairs'选项定义)

当光标不在一个有用的字符上,"%" 会先向前找到一个。比如当光标停留在上例中的行
首时,"%" 会向前查找到第一个 "("。然后会移动到它的匹配处。

                if (a == (b * c) / d)
                ---+---------------->
                           %

--------------------------------------------------------------------------------

*03.5*  移动到指定的行

如果你是一个 C 或者 C++ 程序员,你对下面这样的错误信息应该非常熟悉:

        prog.c:33: j   undeclared (first use in this function)

这表示你可能要移动到 33 行去作一些修改了。那么怎样找到 33 行?一个办法是执行
"9999k"
命令移到文件头,再执行 "32j" 下移到32行。这不是一个好办法,但肯定有效。
更好的方法是使用 "G" 命令。加上一个次数前缀,这个命令可以把你送到指定的行。
例如,"33G" 把你送到 33 行。(要用更好的方法在编译器的错误列表中移动,参见
|usr_30.txt|
":make" 命令部分。)
   
如果没有数字前缀,"G" 命令把光标移动到文末。移动到文首的命令是 "gg"
"1G"
也能完成这个功能,但稍复杂一点。

            |   first line of a file   ^
            |   text text text text    |
            |   text text text text    |  gg
        7G  |   text text text text    |
            |   text text text text
            |   text text text text
            V   text text text text    |
                text text text text    |  G
                text text text text    |
                last line of a file    V

另一个定位行的方法是使用带数字前缀的 "%" 命令。例如,"50" 移动到文件的中间,
"90%" 移到差不多结尾的位置。

前面的描述假定你想移动到文件中的某一行,而不在乎它是否可见。那么如何移动到视野
之内的一行呢?下图演示了三个可以使用的命令:

                        +---------------------------+
                H -->   | text sample text          |
                        | sample text               |
                        | text sample text          |
                        | sample text               |
                M -->   | text sample text          |
                        | sample text               |
                        | text sample text          |
                        | sample text               |
                L -->   | text sample text          |
                        +---------------------------+

提示:"H" 表示 "Home""M" 表示 "Middle" "L" 表示 "Last"

--------------------------------------------------------------------------------

*03.6*  确定当前位置

要确定你在文件中的位置,有三种方法:

1.  使用 CTRL-G 命令,你会获得如下消息(假定 'ruler' 选项已经被关闭)

        "usr_03.txt" line 233 of 650 --35%-- col 45-52

    这里显示了你正在编辑的文件的名称,你所处的当前行的行号,全文的总行数,光标
   
以前的行占全文的百分比,和你所处的列的列号。
   
有时你会看到一个分开的两个列号。例如,"col 2-9"。这表示光标处于第二个字符
   
上,但由于使用了制表符,在屏幕上的位置是 9

2. 设置 'number' 选项。这会在每行的前面加上一个行号:

        :set number

    要重新关闭这个选项:

        :set nonumber

    由于'number'是一个布尔类型的选项,在它前面加上 "no" 表示关闭它。布尔选项只会
   
有两个值,on 或者 off
      Vim
有很多选项,除了布尔类型的,还有数字或者字符串类型的。在用到的时候会给
   
处一些例子的。

3.  设置 'ruler' 选项。这会在 Vim 窗口的右下角显示当前光标的位置:

        :set ruler

使用 'ruler' 的好处是它不占多少地方,从而可以留下更多的地方给你的文本。

--------------------------------------------------------------------------------

*03.7*  滚屏

CTRL-U 命令向下滚动半屏。想象一下通过一个视口看着你的文本,然后把这个视口向上移动
该视口的一半高度。这样,窗口移动到当前文字的上面,而文字则移到窗口的下面。不用担心
记不住那边是上。很多人都是这样。
    CTRL-D
命令把视窗向下移动半屏,所以把文字向上移动半屏。

                                       +----------------+
                                       | some text      |
                                       | some text      |
                                       | some text      |
        +---------------+              | some text      |
        | some text     |  CTRL-U  --> |                |
        |               |              | 123456         |
        | 123456        |              +----------------+
        | 7890          |
        |               |              +----------------+
        | example       |  CTRL-D -->  | 7890           |
        +---------------+              |                |
                                       | example        |
                                       | example        |
                                       | example        |
                                       | example        |
                                       +----------------+

每次滚一行的命令是 CTRL-E(上滚)和 CTRL-Y(下滚)。可以把 CTRL-E 想象为是多给你
一行(one line Extra)。

向前滚动一整屏的命令是 CTRL-F(实际上会留下两行不滚动)。反向的命令是 CTRL-B
幸运地,CTRL-F 是向前 (forward) 滚动,CTRL-B 是向后 (backward) 滚动,这比较好记。

移动中的一个常见问题是,当你用 "j" 向下移动的时候,你的光标会处于屏幕的底部,
你可能希望,光标所在行处于屏幕的中间。这可以通过 "zz" 命令实现。

        +------------------+             +------------------+
        | some text        |             | some text        |
        | some text        |             | some text        |
        | some text        |             | some text        |
        | some text        |   zz  -->   | line with cursor |
        | some text        |             | some text        |
        | some text        |             | some text        |
        | line with cursor |             | some text        |
        +------------------+             +------------------+

"zt" 把光标所在行移动到屏幕的顶部,而 "zb" 则移动到屏幕的底部。Vim 中还有另外
一些用于滚动的命令,可以参见|Q_sc|。要使光标上下总保留有几行处于视口中用作上下
文,可以使用'scrolloff'选项。

--------------------------------------------------------------------------------

*03.8*  简单查找

查找命令是 "/String"。例如,要查找单词 "include",使用如下命令:

        /include

你会注意到,当你输入 "/" 的时候,光标移到了 Vim 窗口的最后一行,这与 "冒号命令"
一样,在那里你可以输入要查找的字符串。你可以使用退格键 (退格箭头或<BS>) 进行

修改,如果需要的时候还可以使用 <Left> <Right> 键。
  
使用 <Enter> 开始执行这个命令。

        Note:
       
字符.*[]^%//?~$有特殊含义。如果你要查找它们,需要在前面加上一个 ""

       
请参见下文。

要查找下一个匹配可以使用 "n" 命令。用下面命令查找光标后的第一个 #include

        /#include

然后输入 "n" 数次。你会移动到后面每一个 #include。如果你知道你想要的是第几个,
可以在这个命令前面增加次数前缀。这样,"3n" 表示移动到第三个匹配点。要注意,
"/"
不支持次数前缀。

"?" 命令功能与 "/" 的功能类似,但是是反方向查找:

        ?word

"N" 命令在反方向重复前一次查找。因此,在 "/" 命令后执行 "N" 命令是向后查找,
"?" 命令后执行 "N" 命令是向前查找。


通常,你必须区分大小写地输入你要查找的内容。但如果你不在乎大小写。可以设置
'ignorecase'
选项:

        :set ignorecase

如果你现在要查找 "word",它将匹配 "word" "WORD"。如果想再次区分大小写:

        :set noignorecase


假设你执行了三个查找命令:

        /one
        /two
        /three

现在,让我们输入 "/" 启动一次查找,但先不按下回车键。现在按 <Up>(上箭头),Vim
"/three" 放到你的命令行上。回车就会从当前位置查找 "three"。如果你不回车,

继续按 <Up>Vim 转而显示 "/two",而下一次 <Up> 变成 "/one"
   
你还可以用 <Down> 命令在历史记录中反向查找。

如果你知道前面用过的一个模式以什么开头,而且你想再使用这个模式的话,可以在输入
<Up>
前输入这个开头。继续前面的例子,你可以输入 "/o<Up>"Vim 就会在命令行上
显示 "/one"

冒号开头的命令也有历史记录。这允许你取回前一个命令并再次执行。这两种历史记录
是相互独立的。


假设你在文本中看到一个单词 "TheLongFunctionName" 而你想找到下一个相同的单词。
你可以输入 "/TheLongFunctionName",但这要输入很多东西。而且如果输错了,Vim
是不可能找到你要找的单词的。

   
有一个简单的方法:把光标移到那个单词下面使用 "*" 命令。Vim 会取得光标上
的单词并把它作为被查找的字符串。
    "#"
命令在反向完成相同的功能。你可以在命令前加一个次数:"3*" 查找光标下
单词第三次出现的地方。


如果你输入 "/the",你也可能找到 "there"。要找到以 "the" 结尾的单词,可以用:

        /the>

"/>" 是一个特殊的记号,表示只匹配单词末尾。类似地,"/<" 只匹配单词的开头。
这样,要匹配一个完整的单词 "the",只需:

        /<the>

这不会匹配 "there" 或者 "soothe"。注意 "*" "#" 命令也使用了 "词首" "词尾"
标记来匹配整个单词(要部分匹配,使用 "g*" "g#"


当你编辑一个程序的时候,你看见一个变量叫 "nr"。你想查一下它在哪被用到了。你可以
把光标移到 "nr" 下用 "*" 命令,然后用 n 命令一个个遍历。
   
这里还有一种办法。输入这个命令:

        :set hlsearch

现在如果你查找 "nr"Vim会高亮显示所有匹配的地方。这是一个很好的确定变量在哪被使
用,而不需要输入更多的命令的方法。
   
要关掉这个功能:

        :set nohlsearch

然后你又需要在下一次查找的时候又切换回来。如果你只是想去掉高亮显示的东西,用如下
命令:

        :nohlsearch

这不会复位 hlsearch 选项。它只是关闭高亮显示。当你执行下一次查找的时候,高亮功能
会被再次激活。使用 "n" "N" 命令时也一样。

有一些选项能改变查找命令的工作方式。其中有几个是最基本的:

        :set incsearch

这个命令使 Vim 在你输入字符串的过程中就显示匹配点。用这个可以检查正确的地方是否已经
被找到了。然后输入 <Enter> 跳到那个地方。或者继续输入更多的字符改变要被查找的字符串。

        :set nowrapscan

这个选项在找到文件结尾后停止查找。或者当你往回查找的时候遇到文件开头停止查找。默认
情况下 'wrapscan' 的状态是 "on"。所以在找到文件尾的时候会自动折返。


如果你喜欢前面的选项,而且每次用 Vim 都要设置它,那么,你可以把这些命令写到
Vim
的启动文件中。
   
编辑 |not-compatible| 中提到的文件,或者用如下命令确定这个文件在什么地方:

        :scriptnames

编辑这个文件,例如,象下面这样:

        :edit ~/.vimrc

然后在文中加一行命令来设置这些选项,就好像你在 Vim 中输入一样,例如:

        Go:set hlsearch<Esc>

"G" 移动到文件的结尾,"o" 开始一个新行,然后你在那里输入 ":set" 命令。
最后你用 <Esc> 结束插入模式。然后用如下命令存盘:

        ZZ

现在如果你重新启动 Vim'hlsearch' 选项就已经被设置了。

--------------------------------------------------------------------------------

*03.9*  简单的查找模式

Vim 用正则表达式来定义要查找的对象。正则表达式是一种非常强大和紧凑的定义查找模式
的方法。但是非常不幸,这种强大的功能是有代价的,因为使用它需要掌握一些技巧。
   
本章我们只介绍一些基本的正则表达式。要了解更多的关于查找模式和命令,请参考
|usr_27.txt|
。你还可以在|pattern|中找到正则表达式的完整描述。

^字符匹配行首。在美式英文键盘上,它在数字键 6 的上面。模式 "include" 匹配一行中
任何位置的单词 include。而模式 "^include" 仅匹配在一行开始的 include
    $
字符匹配行尾。所以,"was$" 仅匹配在行尾的单词 was

我们在下面的例子中用 "x" 标记出被 "the" 模式匹配的位置:

        the solder holding one of the chips melted and the
        xxx                       xxx                  xxx

"/the$" 则匹配如下位置:

        the solder holding one of the chips melted and the
                                                       xxx

而使用 "/^the" 则匹配:

        the solder holding one of the chips melted and the
        xxx

你还可以试着用这个模式: "/^the$",它会匹配仅包括 "the" 的行。并且不包括空格。
例如包括 "the " 的行是不会被这个模式匹配的。

"." 字符匹配任何字符。例如,模式 "c.m" 匹配一个第一个字符是c,第二个字符是
任意字符,而第三个字符是m的字符串。例如:

        We use a computer that became the cummin winter.
                 xxx             xxx      xxx


如果你确实想匹配一个点字符,你可以在前面加一个反斜杠去消除它的特殊含义。
   
如果你用 "ter." 为模式去查找,你会匹配这些地方:

        We use a computer that became the cummin winter.
                      xxxx                          xxxx

但如果你查找 "ter/.",你只会匹配第二个位置。

--------------------------------------------------------------------------------

*03.10* 使用标记

当你用 "G" 命令跳到另一个地方,Vim 会记住你从什么地方跳过去的。这个位置成为一个
标记,要回到原来的地方,使用如下命令:

        ``

` 用单引号 ' 也可以。
  
如果再次执行这个命令你会跳回去原来的地方,这是因为 ` 记住了自己跳转前的位置。
通常,每次你执行一个会将光标移动到本行之外的命令,这种移动即被称为一个 "跳转"
这包括查找命令 "/" "n"(无论跳转到多远的地方)。但不包括 "fx" "tx" 这些
行内查找命令或者 "w" "e" 等词移动命令。
   
另外 "j" "k" 不会被当做是一次 "跳转",即使你在前面加上个数前缀也不例外。
``
命令可以在两个位置上跳来跳去。而 CTRL-O 命令则跳到一个 "较老" 的地方(提示:O
表示older)。CTRL-I 则跳到一个 "较新" 的地方(提示:I在键盘上紧靠着O)。考虑一下

如下命令序列:

        33G
        /^The
        CTRL-O

你首先跳到第 33 行,然后查找以 "The" 开头的一行,然后用 CTRL-O 你会跳回到 33 行。
再执行 CTRL-O 你会跳到最初的地方。现在你使用 CTRL-I,就又跳到 33 行。而再用一次
CTRL-I
你又会到达找到 "The" 的地方。


             |  example text   ^             |
        33G  |  example text   |  CTRL-O     | CTRL-I
             |  example text   |             |
             V  line 33 text   ^             V
             |  example text   |             |
       /^The |  example text   |  CTRL-O     | CTRL-I
             V  There you are  |             V
                example text

        Note:
        CTRL-I
的功能与<Tab>一样。

":jumps" 命令能输出一个你可以跳往的位置的列表。最后一个你使用的到的标记会用
">"
符号标记出来。


Vim 允许你在文本中放置自定义的标记。命令 "ma" a 标记当前的光标位置。你可以在
文本中使用 26 个标记(az)。这些标记是不可见的,只是一个由 Vim 记住的位置。
   
要跳到一个你定义的标记,可以使用命令 `{mark},这里 {mark} 是指定义标记
的那个字母。所以,移到标记a的命令是:

        `a

命令 'mark(单引号加上一个标记)会移到标记所在行的行首。这与 `mark 命令是不同的,
后者是移到标记所在行上被标记的列。

标记在需要处理一个文件的两个相关地方的时候非常有用。假设你在处理文末的时候需要
查看文首的一些内容,先移动到行首,设置一个标记 s (start)

        ms

然后移动到你需要处理的地方,再设置一个标记 e (end)

        me

现在你可以随意移动,当你需要看开头的地方,可以使用这个命令移到那里:

        's

然后使用 '' 跳回来。或者用 'e 跳到你正在处理的文尾的地方。
   
这里使用 s e 作标记名没有特别的含义,只是为了好记而已。

你可以用如下命令取得所有的标记的列表:

        :marks

你会注意到有一些特殊的标记,包括:

        '       跳转前的位置
        "       
最后编辑的位置
        [      
最后修改的位置的开头
        ]      
最后修改的位置的结尾
作小改动


本章介绍几种修正和移动文本的方法,这包括三种修改文本的基本方法:操作符-动作,
可视模式以及文本对象。

|04.1|  操作符与动作
|04.2| 
改变文本
|04.3| 
重复一个修改
|04.4| 
可视模式
|04.5| 
移动文本
|04.6| 
拷贝文本
|04.7| 
使用剪贴板
|04.8| 
文本对象
|04.9| 
替换模式
|04.10|
结论

下一章: |usr_05.txt|  选项设置
前一章: |usr_03.txt|  移动
 
目录: |usr_toc.txt|

--------------------------------------------------------------------------------

*04.1*  操作符与动作

在第二章你已经学过使用 "x" 命令来删除一个字符以及通过个数前缀,例如 "4x" 去删
除多个字符。
    "dw"
命令删除一个单词。你可能认出来了,"w" 是词移动命令。实际上,"d"
令后面可以跟任何 "动作"motion)命令,它会删除从当前位置到光标移动到的目标
位置的的全部内容。
   
例如 "4w" 命令能够向后移动四个单词。所以 "d4w" 命令删除4个单词。

        To err is human. To really foul up you need a computer.
                         ------------------>
                                 d4w

        To err is human. you need a computer.

Vim 只删除从当前位置到 "动作" 把光标移动到的位置的前一个位置。这是因为 Vim 认为
你可能不想删掉一个单词的第一个字符。如果你用 "e" 命令作为动作,这时 Vim 认为你
是想删掉整个单词(包括最后一个字符):

        To err is human. you need a computer.
                        -------->
                           d2e

        To err is human. a computer.

是否包括光标所在的字符取决与你使用的移动命令。在参考手册中,当不包括这个字符时,
称为 "非包含的" (exclusive),而包括这个字符的时候,称为 "包含的" (inclusive)

"$" 命令移动到行尾。所以,"d$" 命令从当前的位置一直删除到本行行尾。这是一个
"
包含的" 命令,所以,这行的最后一个字符也会被删除:

        To err is human. a computer.
                       ------------>
                            d$

        To err is human

以上定义了一个命令组合模式:操作符-动作。你首先输入一个操作符命令,例如,"d"
就是一个删除操作符。然后你输入一个动作命令,例如 "4l" 或者 "w"。这种方法使你

可以在任何你能越过的文本上执行各种操作。

--------------------------------------------------------------------------------

*04.2*  修改文本

另一个操作符命令是 "c",表示修改,change。它的作用方式与 "d" 操作符相似,只
是完成后会切换到插入模式。例如,"cw" 修改一个词,更精确的说,它删除一个词,
并切换到插入模式。

        To err is human
           ------->
             c2wbe<Esc>

        To be human

这里 "c2wbe<Esc>" 包括如下操作:

        c       修改操作符
        2w     
移动两个单词的距离(与操作符合起来,它删除两个单词并进入插入模式)
        be     
插入 be 这个单词
        <Esc>  
切换回普通模式

如果你留意,你会发现一个奇怪的地方:human 前面的空格没有被删除。有一句谚语说道:
任何问题都有一个简单,清楚而错误的回答。"cw" 命令就属于这种情况。c 操作符在很
多地方都和 d 一样,但有一个例外,"cw"。它实际上象 "ce" 一样,删除到单词尾。这
样单词后面的空格就不包括在内了。这要追溯到使用 Vi 的旧日子。由于很多人已经习惯
这种方式了,这个例外就留在 Vim 里了。


"dd" 可以删除一行一样,"cc" 修改一整行。但它会保留这一行的下缩进 (前面的
空格)

"d$" 删除到行尾;"c$" 则修改到行尾。这就象先用 "d$" 删除一行再用 "a" 启动
插入模式并加入新的文字。


有些 "操作符-动作" 命令由于经常被使用,所以被设置为单字符命令:

        x  表示  dl  (删除当前光标下的字符)
        X 
表示  dh  (删除光标左边的字符)
        D 
表示  d$  (删除到行尾)
        C 
表示  c$  (修改到行尾)
        s 
表示  cl  (修改一个字符)
        S 
表示  cc  (修改一整行)


命令 "3dw" "d3w" 都是删除3个单词。如果你非要寻根问底,那么:"3dw" 表示
删除一个单词3次,而 "d3w" 表示删除三个单词一次。这是一个没有分别的分别。
实际上你可以放两个次数前缀,例如,"3d2w" 删除两个单词三次,共计六个单词。


"r" 命令不是操作符。它只是等你输入一个字符然后用这个字符替换当前光标上的字
符。你可以用 "cl" 命令或者 "s" 命令完成相同的功能,但 "r" 命令不需要使用<Esc>
退出插入状态:

        there is somerhing grong here
        rT           rt    rw

        There is something wrong here

通过个数前缀,"r" 命令可以使多个字符被同一个字符替换,例如:

        There is something wrong here
                           5rx

        There is something xxxxx here

要用换行符替换一个字符可以用命令 "r<Enter>"。这会删除一个字符并插入一个换行
符。在这里使用个数前缀会删除多个字符但只插入一个换行符:"4r<Enter>" 用一个
换行符替换四个字符。

--------------------------------------------------------------------------------

*04.3*  重复一个修改

"." Vim 中一个非常简单而有用的命令。它重复最后一次的修改操作。例如,假设你在
编辑一个 HTML 文件,你想删除所有的 <B> 标记。你把光标移到第一个 "<" 上,然后用
"df>"
命令删除 <B>。然后你就可以移到 </B> < 上面用 "." 命令删除它。"." 命令
执行最后一次的修改命令(在本例中,就是 "df>")。要删除下一个 <B> 标记,移动到下
一个 < 的位置,再执行 "." 命令即可。

                              To <B>generate</B> a table of <B>contents
        f<  
找第一个
<        --->
        df> 
删除到
>             -->
        f<  
找下一个
<             --------->
        .   
重复
df>                        --->
        f<  
找下一个
<                         ------------->
        .   
重复df>                                        -->

"." 命令重复任何除 "u" (undo)CTRL-R (redo) 和冒号命令外的修改。

再举一个例子:你想把 "four" 修改成"five"。有好几个地方都要作这种修改。你可
以用如下命令快速完成这个操作:

        /four<Enter>    找到第一个 "four"
        cwfive<Esc>    
修改成
"five"
        n              
找下一个
"four"
        .              
重复修改操作

        n              
找下一个 "four"
        .              
重复修改

                        
如此类推......

--------------------------------------------------------------------------------

*04.4*  可视模式

要删除一些简单的东西,用 "操作符-动作" 命令可以完成得很好。但很多情况下,并
不容易确定用什么命令可以移到你想修改的地方。这时候,你就需要可视模式了。

你可以用 "v" 命令启动可视模式。你可以移动光标到需要的地方。当你这样做的时候,
中间的文本会被高亮显示。最后执行一下 "操作符" 命令即可。
   
例如,要从一个单词的一半删除到下一个单词的一半:

                This is an examination sample of visual mode
                               ---------->
                                 velllld

                This is an example of visual mode

但你这样做的时候,你不需要真的算要按l多少次,你可以在按 "d" 前清楚得看到哪些东西
将要被删除的文本。

如果任何时候你改了注意,只用按一下 <Esc> 就能退出可视模式。


如果你想对行做操作,可以使用 "V" 命令来启动可视模式。你会发现在你作任何移动之
前,整行都被高亮显示了。左右移动不会有任何效果。而通过上下移动,你可以一次选择多行。
   
例如,用 "Vjj" 可以选中三行:

                          +------------------------+
                          | text more text         |
                       >> | more text more text    | |
        selected lines >> | text text text         | | Vjj
                       >> | text more              | V
                          | more text more         |
                          +------------------------+

如果你要处理一个矩形块内的文本,可以使用 CTRL-V 启动可视模式。这在处理表格时
非常有用。

                name            Q1      Q2      Q3
                pierre          123     455     234
                john            0       90      39
                steve           392     63      334

要删除中间 "Q2" 这一栏,把光标移动到 "Q2" "Q" 上面。按 CTRL-V 启动块可视模式。
现在用 "3j" 向下移动三行,然后用 "w" 移到下一个单词。你可以看到最后一栏的第一
个字符也被包括进来了。要去掉它,用 "h" 命令即可。现在按 "d",中间一栏就被删除了。


如果你在可视模式下选中了一些文字,然后你又发现你需要改变被选择的文字的另一端,
"o" 命令即可(提示:"o" 表示 other end),光标会移动到被选中文字的另一端,
现在你可以移动光标去改变选中文字的开始点了。再按 "o" 光标还会回到另一端。

当使用块可视模式的时候,你会有四个角,"o" 只是把你移到对角上。而用 "O" 则能
移到同一行的另一个角上。

Note: "o" "O" 在可视模式下与在普通模式下的作用有很大的不同;在普通模式下,
它们的作用是在光标后或前加入新的一行。

--------------------------------------------------------------------------------

*04.5*  移动文本

当你用 "d""x" 或者其它命令删除文本的时候,这些文字会被存起来。你可以用 p
令重新粘贴出来(p Vim 中表示 put)。
   
看看下面的例子。首先,你会在你要删除的那一行上输入 "dd" 删除一整行,然后
移动到你要重新插入这行的地方输入 "p" (put),这样这一行就会被插入到光标下方。

        a line          a line        a line
        line 2    dd    line 3    p   line 3
        line 3                        line 2

由于你删除的是一整行,"p" 命令把该行插入到光标下方。如果你删除的是一行的一部
分(例如一个单词),"p" 命令会把它插入到光标的后面。

        Some more boring try text to out commands.
                         ---->
                          dw

        Some more boring text to out commands.
                         -------->
                            welp

        Some more boring text to try out commands.


"P" 命令象 "p" 一样也是插入字符,但插入点在光标前面。当你用 "dd" 删除一行,
"P"
会把它插入到光标所在行的前一行。而当你用 "dw" 删除一个单词,"P" 会把它
插入到光标前面。

你可以执行这个命令多次,每次会插入相同的文本。

"p" "P" 命令接受个数前缀,被插入的文本就会被插入指定的次数。所以 "dd"
加一个 "3p" 会把删除行的三个拷贝插入到文本中。


经常发生这样的情况,当你输入字符的时候,你的手指比你的脑子转得快(或者相反?)
这样的结果是你经常把 "the" 敲成 "teh"Vim 让你可以很容易得修正这种错误。只要把
光标移到 "teh" "e" 上,然后执行 "xp" 即可。这个工作过程是:"x" 删除一个字符,
保存到寄存器。"p" 把这个被保存的字符插入到光标的后面,也就是 "h" 的后面了。

        teh     th     the
         x       p

--------------------------------------------------------------------------------

*04.6*  拷贝文本

要把文本从一个地方拷贝到另一个地方,你可以先删除它,然后用 "u" 命令恢复,再用
"p"
拷到另一个地方。这里还有一种简单的办法:抽出 (yank)"y" 命令可以把文字拷
贝到寄存器中。然后用 "p" 命令粘贴到别处。
    Yanking
Vim 中拷贝命令的名字。由于 "c" 已经被用于表示change了,所以拷贝
copy)就不能再用 "c" 了。但 "y" 还是可用的。把这个命令称为 "yanking" 是为了
更容易记住 "y" 这个键。(译者注:这里只是把原文译出以作参考,"抽出" 文本毕竟是
不妥的。后文中将统一使用 "拷贝"。中文可不存在 change copy 的问题。)

由于 "y" 是一个操作符,所以 "yw" 命令就是拷贝一个单词了。当然了,个数前缀也是
有效的。要拷贝两个单词,就可以用 "y2w"。例如:

        let sqr = LongVariable *
                 -------------->
                       y2w

        let sqr = LongVariable *
                               p

        let sqr = LongVariable * LongVariable

注意:"yw" 命令包括单词后面的空白字符。如果你不想要这个字符,改用 "ye" 命令。

"yy" 命令拷贝一整行,就像 "dd" 删除一整行一样。出乎意料地是,"D" 删除到行尾而
"Y"
却是拷贝一整行。要注意这个区别!"y$" 拷贝到行尾。

        a text line   yy        a text line            a text line
        line 2                  line 2          p      line 2
        last line               last line              a text line
                                                       last line

--------------------------------------------------------------------------------

*04.7*  使用剪贴板

如果你使用 Vim GUI 版本 (gvim),你可以在 "Edit" 菜单中找到 "Copy" 项。你可以
先用可视模式选中一些文本,然后使用 Edit/Copy 菜单。现在被选中的文本被拷进了剪贴
板。你可以把它粘贴到其它程序,或者在 Vim 内部使用。

如果你已经从其它程序中拷贝了一些文字到剪贴板,你可以在 Vim 中用 Edit/Paste 菜单
粘贴进来,这在普通模式和插入模式中都是有效的。如果在可视模式,被选中的文字会被
替换掉。

"Cut" 菜单项会在把文字拷进剪贴板前删除它。"Copy""Cut" "Paste" 命令在弹出
菜单中也有(当然了,前提是有弹出式菜单)。如果你的 Vim 有工具条,在工具条上
也能找到这些命令。

如果你用的不是 GUI,或者你根本不喜欢用菜单,你只能用其它办法了。你还是可以用普通
"y"yank)和 "p"put)命令,但在前面必须加上 "*(一个双引号加一个星号)。
例如,要拷贝一行到剪贴板中:

        "*yy

要粘贴回来:

        "*p

这仅在支持剪贴板的 Vim 版本中才能工作。关于剪贴板的更多内容请参见 |09.3|
|clipboard|

--------------------------------------------------------------------------------

*04.8*  文本对象

如果你在一个单词的中间而又想删掉这个单词,在你用 "dw" 前,你必须先移到这个单词的
开始处。这里还有一个更简单的方法:"daw"

        this is some example text.
                       daw

        this is some text.

"daw" "d" 是删除操作符。"aw" 是一个文本对象。提示:"aw" 表示 "A Word"
(一个单词),这样,"daw" 就是 "Delete A Word"(删除一个单词)。确切地说,

该单词后的空格字符也被删除掉了。

使用文本对象是 Vim 中执行修改的第三种方法。我们已经有 "操作符-动作" 和可视模式
两种方法了。现在我们又有了 "操作符-文本对象"
   
这种方法与 "操作符-动作" 很相似,但它不是操作于从当前位置到移动目标间的内容,
而是对光标所在位置的 "文本对象" 进行操作。文本对象是作为一个整体来处理的。现在光
标在对象中的位置无关紧要。

"cis" 可以改变一个句子。看下面的句子:

        Hello there.  This
        is an example.  Just
        some text.

移动到第二行的开始处。现在使用 "cis"

        Hello there.    Just
        some text.

现在你输入新的句子 "Another line."

        Hello there.  Another line.  Just
        some text.

"cis" 包括 "c"change,修改)操作符和 "is" 文本对象。这表示 "Inner
Sentence"
(译者注:实在很难用中文表示这个意思了,各位还是记英文名吧)。还有

一个文本对象是 "as",区别是 "as" 包括句子后面的空白字符而 "is" 不包括。如果
你要删除一个句子,而且你还想同时删除句子后面空白字符,就用 "das";如果你想保
留空白字符而替换一个句子,则使用"cis"

你还可以在可视模式下使用文本对象。这样会选中一个文本对象,而且继续留可视模式,
你可以继续多次执行文本对象命令。例如,先用 "v" 启动可视模式,再用 "as"
就可以选中一个句子。现在重复执行 "as",就会继续选中更多的句子。最后你可以使用

一个操作符去处理这些被选中的句子。

你可以在这里找到一个详细的文本对象的列表:|text-objects|

--------------------------------------------------------------------------------

*04.9*  替换模式

"R" 命令启动替换模式。在这个模式下,你输入的每个字符都会覆盖当前光标上的字符。
这会一直持续下去,直到你输入<Esc>
   
在下面的例子中,你在 "text" 的第一个 "t" 上启动替换模式:

        This is text.
                Rinteresting.<Esc>

        This is interesting.

你可能会注意到,这是用十二个字符替换一行中的五个字符。如果超出行的范围,"R"
令自动进行行扩展,而不是替换到下一行。

你可以通过 <Insert> 在插入模式和替换模式间切换。

但当你使用 <BS>(退格键)进行修正时,你会发现原来被替换的字符又回来了。这就好像
一个 "撤消" 命令一样。

--------------------------------------------------------------------------------

*04.10* 结论

操作符,移动命令和文本对象可以有各种组合。现在你已经知道它是怎么工作了,你可以
N 个操作符加上 M 个移动命令,组合出 N*M 个命令!

你可以在这里找到一个操作符的列表:|operator|

还有很多方法可以删除文本。这是一些经常用到的:

x       删除光标下的字符("dl"的缩写)
X      
删除光标前的字符("dh"的缩写)
D      
从当前位置删除到行尾("d$"的缩写)
dw     
从当前位置删除到下一个单词开头
db     
从当前位置删除到前一个单词的开头
diw    
删除光标上的单词(不包括空白字符)
daw    
删除光标上的单词(包括空白字符)
dG     
删除到文末
dgg    
删除到文首

如果你用 "c" 代替 "d",这会变成修改命令;而改用 "y",则变成拷贝命令,等等等等。

还有一些常用的命令,放在哪一章都不合适,列在这里:

        ~       修改光标下字符的大小写,并移动到下一个字符。这不是一个操作符
               
(除非设置了 'tildeop'),所以你不能连接一个动作命令。这个命
               
令在可视模式下也有效,它会改变被选中的所有文本的大小写。

        I       移到当前行的第一个非空字符并启动插入模式

        A       移动到行尾并启动插入模式

Vim 可以按你的需要进行设置。本章告诉你怎样使 Vim 用你指定的选项启动,怎样增加插件
以增强 Vim 的功能;以及怎样进行宏定义。

|05.1|  vimrc 文件
|05.2|  vimrc
示例解释
|05.3| 
简单键盘映射
|05.4| 
增加插件
|05.5| 
增加帮助
|05.6| 
选项窗口
|05.7| 
常用选项

      下一章:|usr_06.txt|  使用语法加亮
     
前一章:|usr_04.txt|  做小改动
       
目录:|usr_toc.txt|

--------------------------------------------------------------------------------

*05.1*  vimrc 文件

可能你已经厌倦了输入那些经常用到的命令了。要让 Vim 用你习惯的设置启动,你可以
把这些设置写到一个叫 vimrc 的文件中。Vim 会在启动的时候读入这个文件。

如果你不知道你的 vimrc 在什么地方,可以使用如下命令:

        :scriptnames

命令列出的文件列表开头的几个中应该有一个叫 ".vimrc" 或者 "_vimrc" 的文件在你的
home
目录中。
   
如果你还没有 vimrc,请参考 |vimrc| 一节看看你应该在什么地方创建 vimrc 文件。
另外 ":version" 命令能告诉你 vim 在什么地方找 "用户的 vimrc 文件"

对于 Unix 系统,肯定是如下文件:

        ~/.vimrc

对于 MS-DOS MS-Windows,常常使用下面其中一个文件:

        $HOME/_vimrc
        $VIM/_vimrc

vimrc 文件可以包含任何冒号命令。最简单的是设置选项命令。例如,如果你想 Vim 启动
的时候始终开启 'incsearch' 选项,可以在你的 vimrc 文件中加上:

        set incsearch

要使这个命令生效,你需要重启动 Vim。后面我们还会学到如何不退出 Vim 就能让它生效。

这一章只解释最基本的东西。要学习更多关于写 Vim 脚本的知识,请参见|usr_41.txt|

--------------------------------------------------------------------------------

*05.2*  vimrc 示例解释

在第一章中,我们曾经介绍过怎样用 vimrc 示例文件(包括在 Vim 发布中)使 Vim 以非
vi
兼容模式启动(参见|not-compatible|)。这个文件可以在这里找到:

        $VIMRUNTIME/vimrc_example.vim

我们在这一节中介绍这个文件中用到的一些命令。这会对你自行参数设置有一定的帮助。
但我们不会介绍所有的内容。你需要用 ":help" 获得更多的帮助。


        set nocompatible

如第一章所述,这个命令人为地告诉 Vim 工作在 vi 增强模式,因此与 Vi 不完全兼容。
要关闭 'compatible' 选项设,'nocompatible' 可以用于完成这个功能。


        set backspace=indent,eol,start

这指明在插入模式下 <BS> 如何删除光标前面的字符。逗号分隔的三个值分别指:行首的
空白字符,分行符和插入模式开始处之前的字符。


        set autoindent

这使 Vim 在启动一个新行的时候使用与前一行一样的缩进。就是说,新行前面会有同样
多的空白字符。启动新行是指用 <Enter> 换行,在普通模式下执行 "o" 命令等情况。


        if has("vms")
          set nobackup
        else
          set backup
        endif

这告诉 Vim 当覆盖一个文件的时候保留一个备份。但 VMS 系统除外,因为 VMS 系统会
自动产生备份文件。备份文件的名称是在原来的文件名上加上 "~" 字符。参见 |07.4|


        set history=50

这个命令保存 50 个命令和 50 个查找模式的历史。如果你想 Vim 记住多些或者少些
命令,可以把这个数改成其它值。


        set ruler

总在 Vim 窗口的右下角显示当前光标位置。


        set showcmd

Vim 窗口右下角,标尺的右边显示未完成的命令。例如,当你输入 "2f"Vim 在等
你输入要查找的字符并且显示 "2f"。当你再输入w"2fw" 命令被执行,"2f" 自动消
失。

        +-------------------------------------------------+
        |text in the Vim window                           |
        |~                                                |
        |~                                                |
        |-- VISUAL --                   2f     43,8   17% |
        +-------------------------------------------------+
         ^^^^^^^^^^^                  ^^^^^^^^ ^^^^^^^^^^
          'showmode'                 'showcmd'  'ruler'


        set incsearch

在查找模式输入完前显示匹配点。


        map Q gq

这定义一个键映射。下一节会介绍更多的相关内容。这将定义 "Q" 命令用来完成与 "gq"
操作符相同的功能,这是在 Vim 5.0 版前 "Q" 命令的作用。如果没有设置这个映射,

"Q"
会启动 Ex 模式,这也许不是你想要的情况。


        vnoremap p <Esc>:let current_reg = @"<CR>gvs<C-R>=current_reg<CR><Esc>

这是一个复杂映射。这里不介绍它是怎么工作的。它的作用是使 "p" 命令在可视模式下
用拷贝的字符覆盖被选中的字符。你可以看到映射可以被用来执行相当复杂的操作。但其
本质依然是一个命令序列而已,与你直接输入没有什么两样。


        if &t_Co > 2 || has("gui_running")
          syntax on
          set hlsearch
        endif

这激活语法加亮功能,但仅在颜色功能有效的时候才有效。而 'hlsearch' 选项告诉
Vim
加亮上次查找模式匹配的地方。"if" 命令在设置选项的时候非常有用,它使设置
命令在某些条件下才执行。更多的内容请参见|usr_41.txt|

                                                        *vimrc-filetype*
        filetype plugin indent on

这启动三个非常灵巧的机制:
1.
文件类型探测
   
当你开始编辑一个文件的时候,Vim 会试图确定这个文件的类型。当你编辑 "main.c"
   
时,Vim 会根据扩展名 ".c" 认为这是一个 C 源文件。当你编辑一个文件前面是

    "#!/bin/sh"
的文件时,Vim 会把它认作 "sh" 文件。文件类型探测用于语法加亮
   
和以下另两项。请参见|filetypes|

2. 使用文件类型相关的插件
   
不同的文件需要不同的选项支持。例如,当你编辑一个 "c" 文件,用 'cindent'
   
选项来自动缩进就非常有用。这些文件类型相关的选项在 Vim 中是通过文件类型

   
插件来实现的。你也可以加入自己的插件,请参见 |write-filetype-plugin|

3. 使用缩进文件
   
当编辑程序的时候,行缩进通常可以被自动决定。Vim 用不同的策略处理不同的
   
文件类型。请参见 |:filetype-indent-on| 'indentexpr'


        autocmd FileType text setlocal textwidth=78

这使 Vim 在一行长于 78 个字符的时候自动换行,但仅对纯文本文件中有效。这里包括
两个部分。其中 "autocmd FileType text" 定义个自动命令,表示当文件类型被设置为
"text"
的时候,后面的命令自动执行。"setlocal textwidth=78" 设置 'textwidth'
选项为78,但仅对本文件有效。


        autocmd BufReadPost *
             if line("'/"") > 0 && line("'/"") <= line("$") |
               exe "normal g`/"" |
             endif

这是又一个自动命令。这回它设置为在读入任何文件之后自动执行。后面那堆复杂的东
西检查 '" 标记是否已被定义,如果是,则跳转到该标记。行首的反斜杠用于把所有语句
连接成一行。这可以避免一行写得太长,请参见 |line-continuation|。这只在 Vim
脚本文件中有效,在命令行中无效。

--------------------------------------------------------------------------------

*05.3*  简单键盘映射

映射可以使你把一系列 Vim 命令绑定为一个单键。假设你要用一个大括号将一个特定的
单词括起来。例如,把 "amount" 变成 "{amount}"。用 ":map" 命令,就可以让 F5
完成这个工作。命令如下:

        :map <F5> i{<Esc>ea}<Esc>

        Note:
       
在输入这个命令时,<F5> 要用四个字符表示。相似地,输入 <Esc> 不是直接按

        <Esc>
键,而是输入五个字符。在读这份手册要注意这些区别!

让我们来分解一下这个命令:
    <F5>        F5
功能键。这是命令的触发器。当这个键被按下时,相应的命令即被
               
执行。

    i{<Esc>     插入 { 字符。<Esc> 键用于退出插入模式。

    e           移动到词尾。

    a}<Esc>     插入 } 到单词尾。

执行 ":map" 命令后,要在单词两端加上 {},只需要移到单词上的第一个字符并按 F5

在这个例子中,触发器是一个单键;它还可以是任何字符串。但若你使用一个已经存在
Vim 命令,该命令将不在有效。所以你最好避免出现这种情况。
   
一个可用于映射的键是反斜杠。因为你很可能想定义多个映射,那就加上另一个字符。
你可以映射 "/p" 为在单词两端加园括号,而映射 "/c" 为加花括号,例如:

        :map /p i(<Esc>ea)<Esc>
        :map /c i{<Esc>ea}<Esc>

你需要在敲入/后,立即敲入p,以便 Vim 知道它们组成一个命令。

":map" 命令(无参数)列出当前已定义的映射,至少会包括普通模式下的那些。更多的内
容参见 |40.1|

--------------------------------------------------------------------------------

*05.4*  增加插件                                        *add-plugin*    *plugin*

Vim 可以通过插件增强功能。插件其实是一个当 Vim 启动的时候能被自动执行的脚本。
简单地把插件放到你 Vim plugin 目录中就可以使它生效。
(这个功能在 |+eval| 被编译进 Vim 中时才有效)

Vim 中有两种插件:
      
全局插件:用于所有类型的文件
  
文件类型插件:仅用于特定类型的文件

我们将先讨论全局插件,然后涉及文件类型插件 |add-filetype-plugin|


                                             *standard-plugin*

当你启动 Vim,它会自动加载一些插件。你不需要为此做任何事。这些插件增加一些
很多人想用的,但由 Vim 脚本实现而非编译进 Vim 中的功能。你可以在帮助索引中
找到这些插件:|standard-plugin-list|。还可以参照 |load-plugin|

                                                        *add-global-plugin*
你可以加入一个全局插件使得某些功能在你每次使用 Vim 时都被开启。添加一个全局

插件只要两步:
1.
获得一个插件的拷贝
2.
把它塞进合适的目录


在什么地方可以找到插件?
-
有一些与 Vim 一起发布,你可以在 $VIMRUNTIME/macros 目录或其子目录中找到。
-
从网上下载,查一下这个地方:[url]http://vim.sf.net[/url]
-
Vim 的邮件列表中找:|maillist|

-
自己写一个,参见|write-plugin|


使

首先阅读插件包括的说明文字,看看有没有什么特殊的限制。然后拷贝到你的插件
目录:


       
系统            插件目录
        Unix            ~/.vim/plugin/
        PC and OS/2     $HOME/vimfiles/plugin
$VIM/vimfiles/plugin
        Amiga           s:vimfiles/plugin
        Macintosh       $VIM:vimfiles:plugin
        RISC-OS         Choices:vimfiles.plugin

Unix 系统为例(假设你还没有 plugin 目录):

        mkdir ~/.vim
        mkdir ~/.vim/plugin
        cp /usr/local/share/vim/vim60/macros/justify.vim ~/.vim/plugin

就是这样了!现在你可以用这个插件定义的命令调整文字了。


文件类型插件                     *add-filetype-plugin* *ftplugins*

Vim 的发布中包括一套针对不同文件类型的插件。你可以用如下命令启用它们:

        :filetype plugin on

这样就行了! 参阅 |vimrc-filetype|

如果你缺少某种文件类型的插件,或者你找到一个更好的,你可以自行添加一个。这也
只需两步:
1.
获取一个插件的拷贝
2.
塞到合适的目录。


你可以在找全局插件的相同地方找到文件类型插件。注意一下插件有没有注明文件
类型,据此你可以知道这个插件是全局的还是文件类型相关的。在 $VIMRUNTIME/macros
中的是全局插件;文件类型插件在 $VIMRUNTIME/ftplugin 中。


使                                  *ftplugin-name*

你可以通过把插件文件放到合适的目录中来增加一个插件。目录的名字与前面提过的全局
插件的位置一样,但最后一级目录是 "ftplugin"。假设你找到一个用于 "stuff"
件类型的插件,而且你的系统是Unix。那么,你可以把这个文件用如下命令移入ftplugin
目录:

        mv thefile ~/.vim/ftplugin/stuff.vim

如果这个文件已经存在,你可以检查一下两个插件有没有冲突。如果没有,你可以用另
一个名字:

        mv thefile ~/.vim/ftplugin/stuff_too.vim

这里,下划线用来分开文件类型和其它部分(这些部分可以由任意字符组成)。但如果你
"otherstuff.vim" 就不行了。那是用于 "otherstuff" 类型的文件的。

MS-DOS 中不能使用长文件名。如果你增加第二个插件,而这个插件超过 6 个字符,
你就没法用了。你可以通过使用另一层目录来解决这个问题:

        mkdir $VIM/vimfiles/ftplugin/fortran
        copy thefile $VIM/vimfiles/ftplugin/fortran/too.vim

总的来说,一个文件类型相关的插件的名称是:

        ftplugin/<filetype>.vim
        ftplugin/<filetype>_<name>.vim
        ftplugin/<filetype>/<name>.vim

这里 "<name>" 可以是任何你喜欢的名字。例如,在 Unix 下,"stuff" 文件类型的插件
可以是:

        ~/.vim/ftplugin/stuff.vim
        ~/.vim/ftplugin/stuff_def.vim
        ~/.vim/ftplugin/stuff/header.vim

这里, <filetype> 部分是相应文件类型的名称。只有对应文件类型的文件才会用这个
插件内的设置。插件的 <name> 部分则不重要,你可以对同一个文件类型使用多个插件。
Note
插件必须以 ".vim" 结尾。


深入参考读物:
|filetype-plugins|     
文件类型插件的文档和有关如何避免映射引起的问题。
|load-plugins|         
全局插件的启动时间
|ftplugin-overrule|    
控制全局文件类型插件的选项
|write-plugin|         
如何写插件
|plugin-details|       
关于如何使用插件的信息或者当你的插件不工作的时候如何
                       
处理。

--------------------------------------------------------------------------------

*05.5*  增加帮助                            *add-local-help*

如果幸运的话,你安装的插件还会包括帮助文件。我们这里解释如何安装这个帮助文件,
以便你能方便地获得新插件的帮助。

我们以 "matchit.vim" 插件为例(包括在 Vim 中)。这个插件使 "%" 命令可以在两个
对应的 HTML 标记间,Vim 脚本的 if/else/endif 间等匹配点间跳转。这非常有用,但
它不向前兼容(这也是为什么默认的情况下它不会被激活)。
   
这个插件有一个文档:"matchit.txt"。我们先来把该插件拷贝到合适的位置。
这次,我们在 Vim 内完成这个工作,以便利用$VIMRUNTIME。(如果某些目录已经存在
你可以省略一些 "mkdir" 命令)

        :!mkdir ~/.vim
        :!mkdir ~/.vim/plugin
        :!cp $VIMRUNTIME/macros/matchit.vim ~/.vim/plugin

现在在某个 'runtimepath' 目录中建立一个 doc 目录。

        :!mkdir ~/.vim/doc

再把帮助文件拷贝进去:

        :!cp $VIMRUNTIME/macros/matchit.txt ~/.vim/doc

现在开始玩技巧了,怎样使 Vim 允许你跳转到新的主题上?用 |:helptags| 命令产生
一个本地的tags文件即可:

        :helptags ~/.vim/doc

现在,你可以用这个命令

        :help g%

来获得 "g%" 的帮助了。在使用如下命令的时候,可以看见一个新的条目:

        :help local-additions

本地帮助的标题行被自动的加入到该节了。在那里你可以看到 Vim 添加了那些本地的
帮助文件。你还可以从这里跳转到新的帮助中。

要写一个本地帮助文件,请参考 |write-local-help|

--------------------------------------------------------------------------------

*05.6*  选项窗口

如果要找一个选项,你可以查找这个位置的帮助:|options|。另一个方法是用如下命
令:

        :options

这会打开一个新窗口,其中给出一个选项的列表,并对每个选项提供一行解释。这些选项
被根据种类分组。把光标移到一个主题上然后按回车就可以跳转到那里。再按一下回车或
CTRL-O 就可以跳回来。

你可以通过这个窗口改变一个选项的值。例如,移到 "displaying text" 主题。然后把
光标下移到这一行:

        set wrap        nowrap

当你在上面键入回车,这行会改变为:

        set nowrap      wrap

现在,这个选项被关闭了。

这行的上面是对这个选项的简要描述。将光标向上移动一行,然后按 <Enter>,你可以
跳转到 'wrap' 的完整帮助,再用 CTRL-O 可以跳回来。

对于那些值为数字或者字符串的选项,你可以编辑它的值,然后按 <Enter> 来启用该
值。例如,把光标移动到下面这行:

        set so=0

$ 移到行尾,再用 "r5" 命令修改为五,然后按 <Enter> 使修改生效。现在如果你
移动一下光标,你会发现在你的光标移到窗口边界前,你的文字就开始滚动了。这就是
选项 'scrolloff' 完成的功能:它指定在距离边界多远的地方开始滚动文字。

--------------------------------------------------------------------------------

*05.7*  常用选项

Vim 中有很多选项。大部分你很少用得上。我们在这个介绍一些常用的。别忘了你可以
通过 ":help" 命令获得更多的帮助。方法是在选项命令前后加上单引号,例如:

        :help 'wrap'

如果你搞乱了一个选项,你可以通过在选项后加上一个 & 号把它恢复到默认值。例如:

        :set iskeyword&

Vim 通常会对长行自动换行,以便你可以看见所有的文字。但有时最好还是能让文字在一
行中显示完。这样,你需要左右移动才能看到一整行。以下命令可以切换换行方式:

        :set nowrap

当你移到到那些不能显示的文字上,Vim 会自动向右滚动让你看到后面的文字,要一次滚
动十个字符,这样就行了:

        :set sidescroll=10

这个命令不改变文件中的文字,只改变显示方式。


很多命令只能在一行中移动。你可以通过 'whichwrap' 选项改变它。如下命令把这个选项
设为默认值:

        :set whichwrap=b,s

这样,当光标处于行首时用 <BS> 键可以回到前一行的结尾;当处于行尾时用 <Space>
键可以移动到下一行的行首。

要允许 <Left> <Right> 键也能这样,可以用这个命令:

        set whichwrap=b,s,<,>

这只在普通模式中有效,要在插入模式中也有效,可以:

        :set whichwrap=b,s,<,>,[,]

还有一些可以用的标志,参见 'whichwrap'


TAB

文件中有 TAB 键的时候,你是看不见的。要把它显示出来:

        :set list

现在 TAB 键显示为 ^I,而 $显示在每行的结尾,以便你能找到可能会被你忽略的空白
字符在哪里。
   
这样做的一个缺点是在有很多 TAB 的时候看起来很丑。如果你使用一个有颜色的
终端,或者使用 GUI 模式,Vim 可以用高亮显示空格和TAB 使用 'listchars' 选项:

        :set listchars=tab:>-,trail:-

现在,TAB会被显示成 ">---" 而行尾多余的空白字符显示成 "-"。看起来好多了,是
吧?


'iskeyword' 选项指定那些字母可以出现在一个单词中:

        :set iskeyword
<        iskeyword=@,48-57,_,192-255

"@" 表示所有字母。"48-57" 表示 ASCII 字符 48-57 ,即数字 0 9"192-255"
是可打印的拉丁字符。

   
有时你希望横线也是关键字,以便 "w" 命令会把 "upper-case" 看作是一个单词。
你可以这样做:

        :set iskeyword+=-
        :set iskeyword
        iskeyword=@,48-57,_,192-255,-

看一下新的值,你会发现 Vim 自动在 "-" 前面加了一个逗号。
   
要从中去掉一个字符用 "-="。例如要排除下划线:

        :set iskeyword-=_
        :set iskeyword
        iskeyword=@,48-57,192-255,-

这回,逗号自动被删除了。


Vim 启动的时候,在屏幕底部有一行被用于显示消息。当消息很长的时候,多余的部分
会被截断。这样你只能看到一部分。或者文字自动滚动,你要按 <Enter> 来继续。你可以
'cmdheight' 选项赋一个值,用来设定显示消息所用的行数。例如:

        :set cmdheight=3

这样意味着你用于编辑文字的空间少了,所以这实际上是一种折衷。

使用语法加亮


黑白的文字让人厌倦了,增加一些色彩能为你的文件带来生气。这不但看起来漂亮,
还能够提高你的工作效率。本章介绍如何使用不同颜色显示不同文本并把它打印出来。

|06.1|  功能激活
|06.2| 
颜色显示不出来或者显示出错误的颜色怎么办?
|06.3| 
使用不同的颜色
|06.4| 
是否使用色彩
|06.5| 
带颜色打印
|06.6| 
深入阅读

     下一章:|usr_07.txt|  编辑多个文件
    
前一章:|usr_05.txt|  选项设置
      
目录:|usr_toc.txt|

--------------------------------------------------------------------------------

*06.1*  功能激活

一切从一个简单的命令开始:

        :syntax enable

大多数情况下,这会让你的文件带上颜色。Vim 会自动检测文件的类型,并调用合适的
语法加亮。一下子注释变成蓝色,关键字变成褐色,而字符串变成红色了。这使你可以
很容易浏览整个文档。很快你就会发现,黑白的文本真的会降低你的效率!

如果你希望总能看到语法加亮,把 "syntax enable" 命令加入到 |vimrc| 文件中。

如果你想语法加亮只在支持色彩的终端中生效,你可以在 |vimrc| 文件中这样写:

        if &t_Co > 1
          syntax enable
        endif

如果你只想在 GUI 版本中有效,可以把 ":syntax enable" 放到你的 |gvimrc| 文件中。

--------------------------------------------------------------------------------

*06.2*  颜色显示不出来或者显示出错误的颜色怎么办?

有很多因素会让你看不到颜色:

- 你的终端不支持彩色。
       
这种情况下,Vim 会用粗体,斜体和下划线区分不同文字,但这不好看。你可能
       
会希望找一个支持彩色的终端。对于 Unix,我推荐 XFree86 项目的 xterm
        |xfree-xterm|

- 你的终端其实支持颜色,可是 Vim 不知道
       
确保你的 $TERM 设置正确。例如,当你使用一个支持彩色的 xterm 终端:

                setenv TERM xterm-color

        或者(基于你用的控制台终端)

                TERM=xterm-color; export TREM

        终端名必须与你使用的终端一致。如果这还是不行,参考一下 |xterm-color|
       
那里介绍了一些使 Vim 显示彩色的方法(不仅是 xterm )。

- 文件类型无法识别
        Vim
不可能识别所有文件,而且有时很难说一个文件是什么类型的。试一下这个
       
命令:

                :set filetype
.
       
如果结果是 "filetype=",那么问题就是出在文件类型上了。你可以手工指定

       
文件类型:

                :set filetype=fortran

        要知道那些类型是有效的,查看一下 $VIMRUNTIME/syntax 目录。对于 GUI 版本,
       
你还可以使用 Syntax 菜单。设置文件类型也可以通过 |modeline|,这样,
        
在你每次编辑它的时候都执行语法加亮。例如,下面这一行可以用
       
Makefile(把它放在接近文首和文末的地方)

                # vim: syntax=make

        你可能知道怎么检测自己的文件类型,通常是文件的扩展名(就是点后面的
       
内容)参见 |new-filetype| 可以知道如何告诉 Vim 如何检查一种文件类型。

- 你的文件类型没有语法高亮定义
       
你可以找一个相似的文件类型并人工设置为那种类型。如果你觉得不好,你可以
       
自己写一个,参见 |mysyntaxfile|


或者颜色是错的:

- 彩色的文字难以辨认
        Vim
自动猜测你使用的背景色。如果是黑的(或者其它深色的色彩),它会
       
用浅色作为前景色。如果是白的(或者其它浅色),它会使用深色作为前景
       
色。如果 Vim 猜错了,文字就很难认了。要解决这个问题,设置一下
        'background'
选项。对于深色:

                :set background=dark

        而对于浅色:

                :set background=light

       这两个命令必须在 ":syntax enable" 命令前调用,否则不起作用。如果要在
      
这之后设置背景,可以再调用一下 ":syntax reset"

- 在自下往上滚屏的过程中颜色显示不对。
        Vim
在分析文本的时候不对整个文件进行处理,它只分析你要显示的部分。这
       
样能省不少时间,但也会因此带来错误。一个简单的修正方法是敲 CTRL-L
       
或者往回滚动一下再回来。要彻底解决这个问题,请参见 |:syn-sync|。有些
       
语法定义文件有办法自己找到前面的内容,这可以参见相应的语法定义文件。
       
例如,|tex.vim| 中可以查到 Tex 语法定义。

--------------------------------------------------------------------------------

*06.3*  使用不同颜色                           *:syn-default-override*

如果你不喜欢默认的颜色方案,你可以选另一个配色方案。在 GUI 版本中可以使用
Edit/Color
菜单。你也可以使用这个命令:

        :colorscheme evening

"evening" 是配色方案的名称。还有几种备选方案可以试一下。在 $VIMRUNTIME/colors
中可以找到这些方案。

等你确定了一种喜欢配色方案,可以把 ":colorscheme" 命令加到你的 |vimrc| 文件中。

你可以自己编写配色方案,下方如下法面:

1. 选择一种接近你的理想的配色方案。把这个文件拷贝到你自己的 Vim 目录中。在 Unix
下,可以这样:

        !mkdir ~/.vim/colors
       !cp $VIMRUNTIME/colors/morning.vim ~/.vim/colors/mine.vim

   Vim 中完成的好处是可以利用 $VIMRUNTIME 变量。

2. 编辑这个配色方案,常用的有下面的这些条目:

        term            黑白终端的属性
        cterm          
彩色终端的属性
        ctermfg        
彩色终端的前景色
        ctermbg        
彩色终端的背景色
        gui             GUI
版本属性
        guifg           GUI
版本的前景色
        guibg           GUI
版本的背景色

   例如,要用绿色显示注释:

        :highlight Comment ctermfg=green guifg=green

   属性是 "bold"(粗体)和 "underline" (下划线)可以用于 "cterm" "gui"
  
如果你两个都想用,可以用"bond,underline"。要获得详细信息, 请参考
   |:highlight|
命令。

3. 告诉 Vim 总使用你这个配色方案。把如下语句加入你的 |vimrc| 中:

        colorscheme mine

如果你要测试一下常用的配色组合,用如下命令:

        :edit $VIMRUNTIME/syntax/colortest.vim
        :source %

这样你会看到不同的颜色组合。你可以很容易的看到哪一种可读性好而且漂亮。

--------------------------------------------------------------------------------

*06.4*  是否使用色彩

使用色彩显示文本会影响效率。如果你觉得显示得很慢,可以临时关掉这个功能:

        :syntax clear

当你开始编辑另一个文件(或者同一个文件),色彩会重新生效。

                                                        *:syn-off*
如果你要完全关闭这个功能:

        :syntax off

这个命令会停止对所有缓冲的所有语法加亮。

                                                        *:syn-manual*
如果你想只对特定的文件采使用语法加亮,可以使用这个命令:

        :syntax manual

这个命令激活语法加亮功能,但不会在你开始编辑一个缓冲时自动生效(译者注:Vim
中,每个被打开的文件对应一个缓冲,后面的章节中你会接触到这方面的内容)。要在当

前缓冲中使用加亮,需要设置'syntax'选项:

        :set syntax=ON

--------------------------------------------------------------------------------

*06.5*  带颜色打印                                       *syntax-printing*

MS-Windows 版本中,你可以用如下命令打印当前文件:

        :hardcopy

这个命令会启动一个常见的打印对话框,你可以通过它选择打印机并作一些必要的设置。
如果你使用的是彩色打印机,那么打印出来的色彩将与你在 Vim 中看到的一样。但如果
你使用的是深色的背景,它的颜色会被适当调整,以便在白色地打印纸上看起来比较舒
服。

下面几个选项可以改变 Vim 的打印行为:
        'printdevice'
        'printheader'
        'printfont'
        'printoptions'

要仅打印一定范围内的行,可以用可视模式选择需要打印的行在执行打印命令,例如:

        v100j:hardcopy

"v" 启动可视模式,"100j" 向下选中100行,然后执行 ":hardcopy" 打印这些行。当
然,你可以用其它命令选中这100行。

如果你有一台 PostScript 打印机,上面的方法也适合 Unix 系统。否则,你必须做一些额
外的处理:你需要先把文件转换成 HTML 类型,然后用 Netscape 之类的浏览器打印。

如下命令把当前文件转换成 HTML 格式:

        :source $VIMRUNTIME/syntax/2html.vim

你发现它会嘎吱嘎吱执行一阵子,(如果文件很大,这可能要花点时间)。之后,
Vim
会打开一个新的窗口并显示 HTML 代码。现在把这个文件存下来(存在哪都不要紧,
反正最后你要删掉它的):

        :write main.c.html

用你喜欢的浏览器打开这个文件,并通过它打印这个文件。如果一切顺利,这个输出应
该与 Vim 中显示的一样。要了解更详细的信息,请参见 |2html.vim|。处理完后别忘
了删掉那个 HTML 文件。

除了打印,你还可以把这个 HTML 文件,放到 WEB 服务器上,让其他人可以通过彩色
文本阅读。



 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值