===============================================================================
         欢   迎   来   到    E m a c s    E v i l    中   文   教   程        
                                                                               
                                     * * *                                     
                                                                               
                                    版本 2.2                                   
===============================================================================

     太长不看：按 C-j (CTRL+j) 以直接跳至第 1 讲。
     本教程大约花费 40 分钟。

                                     * * *

     Evil 是一个强大的 Vim 模拟，具有很多功能，
     多到很难在这样的一个教程中解释。
     此教程仅描述足够范围的功能，
     使你可以轻松使用 Evil 加强的 Emacs 作为一个全用途的编辑器，
     顺便掌握 Vim 类编辑器（及其他软件）共有的基本操作方法。

     完成本教程的大致时间是 32-40 分钟。
     请牢记，此教程是实践式的。
     这意味着你需要真的执行操作以正确地学习它们。
     若你只读不用，你会忘记那些操作！
     不用担心文件被修改，这里就是专门给你练习用的。

     现在，确保你的大写锁定没有打开，然后
     按 j 键足够多次来移动光标，直到
     第 1 讲第 1 节的内容完全充满屏幕。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 1 讲第 1 节：移动光标


  1. 首先，想像着键盘上的 hjkl 被扭曲成这样：

                        k
                   h       l
                      j     

  2. 据上面所示的方位（k上 j下 h左 l右），
     按 h,j,k,l 键在屏幕上到处移动光标，直到你感到适应。

  3. 按住 j，直到光标快速移动。

---> 现在你知道怎么移动到下一节了

     移动至第 1 讲第 2 节。

注：也可使用方向键（上下左右键），
    但只要你习惯了用 hjkl 移动，
    由于它就在标准指法的右手下面，它会快得多。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 1 讲第 2 节：按键表示

    在 Emacs 中有如下几种组合键：
    C- 表示 Ctrl，
    M- 表示 Meta（或称为 Alt），
    s- 表示 super（或称为徽标键），
    S- 表示 Shift（但一般用大写字母表示，因为输入大写字母
    时需要按住 Shift，例如 C-J 表示 Ctrl+Shift+j ）。
    
---> 在本教程中，C-j 和 C-k 被用于快速导航。
     试着用它们在各节之间切换。

    在 Emacs 中：
    RET 即 <Return> ，回车键，此键也常被标注为 <Enter> 。
    DEL 即删除键，但它并不是删除右侧字符的 delete，而是退格键 backspace。

    现在移动至下一节。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 1 讲第 3 节：普通状态

    Evil 的基本思想是，在各状态（state）间按需灵活切换，
    顺序组合式地完成各种编辑操作。
    其中，最重要的状态是普通状态（normal state），
    你之前学习 hjkl 移动光标的方法时，也处于此状态。

    1.1) 现在按 C-v 2k。
      2) 你可能不知道这是什么意思，
         没关系，现在按 <ESC> 来回到普通状态。

    2. 再重复一次第 1 步，但这次使用 C-[ 代替 <ESC> 。

说明：C-[ 在 Evil 与 Vim 中均等效于 <ESC> 。
      推荐一直使用 C-[ 代替 <ESC> ，但之后不会再提示。

    请牢记，几乎所有的 Evil 状态（包括普通状态本身）
    都可以用一个或多个 <ESC> 来将你带回普通状态，
    这在你不知道自己处于什么状态、陷入困惑时很有用处。

    上文“几乎所有”的例外情况即 emacs 状态，
    此状态的作用是暂时“关闭”Evil 并完全使用 emacs 的原生键位。
    在 emacs 状态下，使用 <ESC> 不会将你带回普通状态。
    你可以使用 C-z 来回切换 emacs 状态。

    此外，你可能还需要 C-g，它是 Emacs 的原生键位。
    在“脱困”这件事上，C-g 有时可以替代 ESC，
    有时则能做到 ESC 做不到的事
    （比如当你运行一个死循环命令导致 Emacs 卡住时）。

|
|   “状态”在 Vim 中原本称为“模式”（mode），
|   但 Emacs 中也有“模式”（主模式和辅模式）。
|   这两种“模式”的功能与用法完全不同，
|   所以 Evil 才改称为了“状态”以避免混淆。
|

    4. 现在移动至本讲小结。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 1 讲 小结

  1. 移动光标的方法是使用方向键或  hjkl 键。

                       k (上)
         h (左)              l (右)
                j (下)

  2. 组合键：
     C- 表示 Ctrl，
     M- 表示 Meta，
     s- 表示 super，
     S- 表示 Shift。

  3. RET 即 <Return> ，回车键。
     DEL 即删除键（对应键盘上的退格键 backspace）。

  4. 按 <ESC> 或 C-[ 会使你要么处于普通状态，
     要么取消一个不想要的、未完成的操作或命令。
     C-g 也有类似的脱困能力。

   现在移动至第 2 讲。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 2 讲第 1 节：Emacs 的退出


  1. 在执行下面任何一步之前，先完整阅读此步骤的内容！！
    1) 按 <ESC> 键，这样可以确保你处于普通状态。
    2) 输入此命令来退出 Emacs：             
                                    :qa! <Return>
    3) 在退出之后，回到 Emacs 并恢复你的教程会话。
       方法和你进入此教程的方法一致。
       比如，你可以先打开 Emacs，再键入 M-x evil-tutor-sc-start 。
       或者，若你之前是在终端里通过 eviltutor 命令进入的，则这次也一样。

  2. 若你自信已经记住了这些步骤，执行第 1 步。

说明：当你在普通状态下输入 : 之后，会进入命令状态（command state）。 
      之后输入的 q 代表退出（quit）编辑器，
      a 代表适用于所有（all）文件，
      ! 代表不保存而直接退出。

    若你想保存，可以先写入（write）改动再退出。其操作为：
                                  :wqa  <Return>

提示：你注意到括号里单词的首字母了吗？
      很多时候，它恰好对应着操作指令，如 quit（退出）对应 :q 。
      这会帮你更好地理解与记忆。
      （当然，并不总是如此，比如删除单个字符的 x。）


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 2 讲第 2 节：文本编辑 - 删除


** 处于普通状态下，按 x 来删除光标下的字符。 **

  1. 将光标移动到下面以“--->”开头的行。

  2. 为了修复错误，
     1) 将光标移动到要删除的字符上。
     2) 按 x 键来删除不需要的字符。

  3. 重复第 2 步，直到句子变得正确。

---> 那头奶奶奶牛跃跃过了了月亮亮亮。

  5. 如果这一行已经变得正确了，移动至下一讲。

提示：在你进行此教程时，不应死记硬背，而是通过实践来学习。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 2 讲第 3 节：文本编辑 - 插入


           ** 在普通状态下，按 i 键来插入（insert）文本。 **

  1. 将光标移动到下面第一个以“--->”开头的行。

  2. 为了使第一行与第二行相同，
     1) 将光标移动到想要插入文本的那个位置
        之后的第一个字符上。
     2) 按 i 键进入插入（insert）状态，再输入必要文字。
     3) 当所有错误都被修复，按 <ESC> 键以回到普通状态。

  3. 重复第 2 步以更正此句子。

---> There is text misng this .
---> There is some text missing from this line.
（译：此行有某些消失的文本。）

  5. 当你已经适应了插入文本的操作，移动至下面的小结。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 2 讲 小结

  1. 要退出 Emacs，键入 <ESC> :qa! <Return> 以丢弃所有改动。
                 或键入 <ESC> :wqa <Return> 以保存所有改动。

  2. 在普通状态下要删除光标下的字符，按 x 键。

  3. 在普通状态下，要在光标之前插入文本，
     按 i 键，输入所需文本，再按 <ESC> 键。


现在从第 3 讲继续。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 3 讲第 1 节：操作符 - 删除


               ** 按 dw 以删除（delete）到一个单词（word）的末尾。 **

  1. 按 <ESC> 以确保你处于普通状态。

  2. 将光标移动到下面以“--->”开头的行。

  3. 将光标移动到第一个需要被删除的单词的开头。

  4. 按 dw 让这个单词消失。

  注：字母 dw 在你打出它们时，将显示在屏幕的最后一行上。
      若你进行了某些错误的输入，按 u 然后重来。

---> 这里 有 一个 一些 单词 有趣的 不属于 纸张 这个 句子。

  5. 重复第 3～4 步，直到此句子已修正，
     然后移动到第 2 节。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 3 讲第 2 节：操作符的更多用法


               ** 按 d$ 以删除到行尾。 **

  1. 按 <ESC> 以确保你处于普通状态。

  2. 将光标移动到下面以“--->”开头的行。

  3. 将光标移至行内正确部分的结尾（在第一个句号之后）。

  4. 按 d$ 以删除到行尾。

  注：其实直接用 D（注意这里是大写，所以要按 Shift+d ）更加方便。

---> 有人将这行句子的末尾输入了两次。输入了两次。


  5. 移动至下一节来了解发生了什么。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 3 讲第 3 节：操作符与动作


  实际上，d 是一类特殊的操作之一，称为操作符（operator），
  它作用于用动作（motion）表示的对象上，格式如下：

         [数字] d 动作      或者       d [数字] 动作

注：“[数字]”的方括号表示可选。

  其中：
    数字 - 执行操作的重复次数（默认为 1）。
    d    - 操作符“删除”。
    动作 - 操作符的施加对象（解释如下）。

  动作之所以能代表对象，是因为它从光标出发进行了特定移动，从而“划分”出对象。
  动作也由按键表示。一份简单的动作列表如下：
    w - 从光标到单词（word）末尾。（dw 包括词后空格。）
    e - 从光标到单词末位（end）字符上。（de 不包括词后空格。）
    $ - 从光标到行尾。

注：为加深理解，请在普通状态下仅输入动作，而不输入操作，
    比如只按 w 。这会如动作列表中所说的那样移动光标。

注：进一步地，你可能会想到，
    我们一开始就学习的 hjkl 移动方式，莫非也是动作吗？
    答案是，是的！你现在就可以搭配操作符来试试效果，
    比如将光标移至下面的第一行并按 d2j：
    1) 这是第一行，待删除。
    2) 这是第二行，待删除。
    3) 这是第三行，待删除。
    4) 这是第四行，应保留。

    现在移动至下一节。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 3 讲第 4 节：一种特殊的操作符语法


                   ** 按 dd 以删除整行。 **

  考虑到整行删除的常用性，Vi 的设计者（进而是 Vim 与 Evil 的）决定
  一次按两个 d 来删除一行会更容易。

  1. 将光标移至下列短语的第 2 行。
  2. 按 dd 以删除此行。
  3. 现在移至第 4 行。
  4. 按 2dd （记住“数字-操作符-动作”）来删除这两行。

      1) 玫红火艳，
      2) 泥趣无边，
      3) 香堇紫然。
      4) 吾有车驾。
      5) 钟报时刻，
      6) 饴甜似蜜，
      7) 亦复如君。

注：还记得 dj 吗？实际上 2dd 与 dj 的效果一致。

  现在移动至下一节。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 3 讲第 5 节：撤销（undo）


                   ** 按 u 撤销上一个操作 **

  1. 将光标移动到下面以“--->”开头的行内的第一个错误上。
  2. 按 x 删除第一个不想要的字符。
  3. 现在按 u 来撤销上一个被执行的操作。
  4. 这次，使用 x 修复行内的所有错误。
  5. 现在，按 u 几次，来撤销刚才的所有操作。
  6. 现在按几次 C-r（按住 Ctrl 再按一下 R）来
     执行重做（redo）操作（“撤销前面的撤销”）。

注：目前 Evil 已经取消对 undo-tree 的强制依赖，
    这意味着，若你想要执行重做操作，则在 Emacs 的配置中，
    你需要在加载 evil 之前妥善设置 evil-undo-system 的变量值，
    例如： (setq evil-undo-system 'undo-redo)

---> 修修复这行的错误并并并用撤销来重置它它它们。

  7. 这是很有用的操作。现在移动至本讲总结。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 3 讲 小结


  1. 在普通状态下，一个操作符的格式是：

         [数字]  操作符  动作    或者     操作符  [数字]  动作
  其中：
    数字   - 执行操作的重复次数。
    操作符 - 一类特殊的操作，比如 d 代表删除。
    动作   - 操作符施加的对象。

  2. 目前已经学到的动作：
     h    左
     l    右
     j    下
     k    上
     w    至单词末尾
     e    至单词末位字符
     $    至行尾

  3. 在上述基础上，可进行各种删除操作。
     比如，从光标删除至单词末尾：dw
     从光标删除至行尾：d$

  4. 删除整行：dd
     这是一种特殊的操作符使用方法，其中没有指定动作。

  5. 要撤销之前的动作：u
     要“撤销之前的撤销”（即重做）：CTRL-R


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 4 讲第 1 节：放置（put）操作


     ** 按 p 以将上一次删除的放置（put）在光标之后。 **
     ** 按 P 以将上一次删除的放置（put）在光标之前。 **

  1. 将光标移至下面一组文字的第一行。

  2. 1) 按 dd 以删除此行。

说明：现在可以告诉你：
      使用操作符 d 删除的内容，实际上并不是完全消失了！
      而是会被保存至 Emacs 的移除环（kill ring，有点类似于剪贴板）的首位。

     2) 将光标移至想要放置此行的位置的上面一行，
        按 p 放置移除环首位的内容，即刚才删掉的那一行。
       （或者，你也可以将光标移至想要放置此行的位置的上面一行，再按 P）

  3. 重复第 2 步，直到所有行都被放置为正确的顺序。

     d) 君亦能习乎？
     b) 香堇蓝紫然。
     c) 智由学中得，
     a) 玫红火艳艳，

注：除操作符 d 以外，会将内容保存到移除环首位的，
    还有用于直接删除的 x、
    后面会学到的操作符 y、c 等等。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 4 讲第 2 节：替换（replace）操作


     ** 按 r 和某个字符来替换（replace）光标下的字符。 **

  1. 将光标移动到下面第一个以“--->”开头的行。
  2. 1) 将光标置于第一个错误上。
     2) 按 r 然后再按对应的字符以修正错误。
  3. 重复第 2 步直到第一行被修正。

--->  Whan this lime was tuoed in, someone presswd some wrojg keys!
--->  When this line was typed in, someone pressed some wrong keys!
（译：当这行被输入时，有人按了某些错误的按键！）

  4. 现在移动至第 3 节。

注：记住，你应当通过使用来学习，而不是仅靠记忆。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 4 讲第 3 节：操作符 - 更改（change）


     ** 按 ce 来更改（change）某个单词的部分或全部。 **

  1. 将光标移动到下面第一个以“--->”开头的行。

  2. 将光标置于 lubw 的 u 上。

  3. 1) 按 ce ，再修补单词（在此情形下，输入“ine”）。
     2) 按 <ESC> 并移至下一处错误（即应当被更改的部分的第一个字符）上。

  4. 重复第 3 步，直到第一句与第二句相同。

---> This lubw has a few wptfd that mrrf changing usf the change command.
---> This line has a few words that need changing using the change command.
（译：这行有一些单词需要使用更改操作来更改。）

注意 ce 不仅替换了单词，也使你进入了插入状态。

    ** 讨论 **

在上面的例子中，实际上 cw 与 ce 的效果是一致的，而 dw 与 de 却不同。
你可能会感到疑惑：同一操作符不同动作的效果为什么有时会一致呢？

这就需要你从 w 即 word 的语义上进行理解了：
cw 是 change word，而 dw 是 delete word。

举一个实际的例子，假设你需要对下面两句进行单词的删改：

---> 1) The car is running.
---> 2) She car is running.

若你将光标分别放置在各句的字符 c 上，
再对 1) 输入 cw man，对 2) 输入 dw ，
那么在 Vim（进而是 Evil）的当前设计中，你会得到：

---> 1) The man is running.
---> 2) She is running.

很自然，是不是？

但是，假如你这次进行相同的操作，却改用另一种设计，
其中 cw 是连同空格一起修改的，而 dw 不会修改空格，那么你会得到：

---> 1) The manis running.
---> 2) She  is running.

可见，第一句少了空格，第二句多了空格。

更有意思的是，cw 和 ce 也并不总是效果一致：
dw 和 cw 都可以删改连续空格，
de 和 ce 却会连同空格之后的单词一起删掉。

现在请你试试修复下面两行（记住你可以随时按 u 撤销）：

---> 只用 dw 来移除    这一行的              多余空格。
---> 只用 de 来移除这一行的多余空格    空格格，以及字符    符。

总之，即使我们不应当说“这绝对百分之百亿是最好的方案”，
上述例子也应当能让你直观地理解到这种设计的恰到好处。

|
|  cl 的效果相当于默认配置下的 s；
|  但是，在某些配置中，s 可能会被更实用的功能占用，
|  此时 cl 就变成了原来的 s 的一个实用替代。
|

现在移动至第 4 节。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 4 讲第 4 节：操作符的更多用法，但是以 c 为例


       ** 作为操作符，更改是要与动作一起使用的。 **

  1. c 作为操作符“更改”，也满足操作符语法：

          [数字]  c  动作     或      c  [数字]  动作

  2. 可用的动作也是相同的，比如 w（单词，word）、$（至行尾）等。

  3. 移动到下面第一个以“--->”开头的行。

  4. 将光标移至第一处错误上。

  5. 按 c$ 以使得行内的剩余部分与第二行相同，并按 <ESC> 。
  注：其实直接用 C（注意这里是大写，所以要按 Shift+c）更加方便。

---> The end of this line needs some help to make it like the second.
---> The end of this line needs to be corrected using the  c$  command.
（译：这行的末尾需要使用 c$ 操作来修正。）


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 4 讲 小结


  1. 为了重新放置被删除的文本（实际上是移除环 kill ring 的首位），
     按 p，这会将被删除的文本放置（put）在光标之后。
     （若被删的是某一行，它会出现在光标的下一行）。
     按 P，这会将被删除的文本放置（put）在光标之前。
     （若被删的是某一行，它会出现在光标的上一行）。

  2. 要替换（replace）光标下的一个字符，
     按 r，再按要替换原字符的新字符。

  3. 更改（change）操作允许你更改指定的动作，从光标至动作某尾。
     例如，按 cw 更改从光标之后的整个单词（change word），
     c$ 从光标至行尾进行更改。

  4. 新的操作符： c ，代表“更改”。

现在进入下一讲。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 5 讲第 1 节：缓冲区（buffer）


          ** 输入 :ls 打开缓冲区列表以供查看与切换。 **

    Emacs 把每个编辑中的文件都放在“缓冲区（buffer）”。
    每编辑一个文件，Emacs 就在其内部开辟一个缓冲区。

  1. 执行下面任何一步之前，先完整阅读此步骤内容！！
     1) 输入 :ls ，这会列出当前所有缓冲区的列表。
     2) 按 j 与 k 来上下移动光标，再用 <Return> 切换到光标所指的缓冲区。

  2. 重复几次第 1 步，
     尝试随便访问若干个缓冲区，最后再返回本教程所在的缓冲区。

注：特殊缓冲区会用星号 * 标记，它们并不对应任何编辑中的文件。
    例如，缓冲区列表本身，就是一种特殊缓冲区。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 5 讲第 2 节：缓冲区内的快速移动


             ** 按 gg 以移动（goto）至一个缓冲区的开头。
                按 G 以移动至一个缓冲区的结尾。 **

  1. 在执行下面任何一步之前，先完整阅读本步骤内容！！
     1) 为了之后能回来，记住你现在所在的行号（即第几行）。

说明：在 Emacs 底部的状态栏一般会给出行号
      （在移动光标时你可以观察到它的变化）；
      Emacs 也可被配置为在侧边显示每行的行号；
      但是，如果你依然不确定当前行号——
      好吧，你可以输入 :nu 。

     2) 按 G 以移至缓冲区的结尾。
     3) 按 gg 以移至缓冲区的开头。
     4) 输入 :<行号> ，其中行号是你在第 1. 1) 步记住的，再按 <Return>，
        这将使你回到你在第 1. 2) 步之前所处的行。

  2. 如果你已经有了做这个的信心，执行第 1 步。

注： :<行号>  可以将你带到指定的行；
实际上 <行号>gg 与 <行号>G 一样可以。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 5 讲第 3 节：搜索命令


     ** 按 / 再加某个短语来搜索这个短语。 **

  1. 在普通状态下按 / 。注意 / 和光标都会出现在屏幕底部（类似于命令状态）。

  2. 现在输入 errroor 再按 <Return> 。这是你要搜索的单词。

  3. 为了再次搜索相同单词，按 n 。
     为了反向搜索相同单词，按 N 。

  4. 如果你想向上搜索一个单词，使用 ? 而不是 / 。

---> 当搜索到达了缓冲区的末尾，它将从开头继续。

  "errroor" 不是拼写 error 的正确方法；errroor 是一个 error Error。

注：evil 默认为全小写的搜索忽略大小写；
    若你需要大小写敏感，可在末尾加 \C ，例如   /error\C

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 5 讲第 4 节：匹配括号（parentheses）搜索动作


                 ** 输入 % 以查找匹配的“)”、“]”或“}” **

  1. 将光标移动到下面以“--->”开头的行内的任一括号如“(”、“[”、“{”上。

  2. 现在输入 % 字符。

  3. 现在光标应当位于匹配的括号上。

  4. 输入 % 来将光标移动回第一个括号上（通过匹配）。

---> 这 ( 是一个测试行，具有 (、[、] 和 {、} 在其中。))

  5. 注意，这也是一种动作，所以你可以搭配操作符，
     比如在某个括号上依次输入 y%jp 。
  
注：这在调试一个程序中的未匹配括号时非常有用（包括 elisp）！

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 5 讲第 5 节：查找（find）或移到（to）字符动作


                 ** 利用 f F t T 来到达指定字符。 **

  本节将介绍四种行内搜索的动作：f<字符> F<字符> t<字符> T<字符> 。

  1. 将光标移动到下面以“--->”开头的行的开头。

---> An apple is a good friend to your daily health. Okay, maybe.
（译：苹果是你每日健康的好朋友。好吧，可能是。）

  2. 输入 fa ，你会发现光标移动到了它之后行内的第一个“a”即 apple 上。

  3. f<字符> 是一种动作，你应该还记得，动作可以搭配数字。
     比如现在输入 3fa ，
     你会发现光标移动到了它之后行内的第三个“a”即 health 上。

  4. 现在，你可以将 f 换成 F（数字和目标也可以换，比如 2Fa 、4Fe 等），
     再试几次。你会发现移动的方向反过来了。

  5. 同理，现在换成 t 试几次。
     你会发现它和 f 类似，但是移动的位置刚好离目标差一个字符。

  6. 同理，再换成 T 试几次，它的方向和 t 同理也是相反的。

注：这四种动作当然也是可以搭配操作符的，比如，
将光标移至下面第一行的第二个 I 上，输入 c2fc 或 c3tc ，然后修正句子：

---> IIIIt iiiisssss sooo cccold, isn't it?
---> It was so cold, isn't it?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 5 讲第 6 节：批量替换的一种方法


  ** 输入 :s/old/new/g 以将“old”替换（substitute）为“new”。 **

  1. 将光标移动到下面以“--->”开头的行。

  2. 输入 :s/thee/the <Return>
     注意，此命令仅更改行内第一个匹配的对象。

  3. 现在输入 :s/thee/the/g ，其中 g 表示在行内全局（global）范围内适用。
     此命令更改行内所有匹配的对象。

---> thee best time to see thee flowers is in thee spring.
（译：赏花的最佳时机是春天。）

  4. 为了更改两行之间的所有字符串，
     输入 :#,#s/old/new/g ，其中 #,# 是这两行的行号。

     输入 :%s/old/new/g  以更改整个缓冲区内的所有匹配对象。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 5 讲 小结

  1. 输入 :ls 打开缓冲区列表以供查看与切换。

  2. gg 移动至缓冲区的开头，
     G  移动至缓冲区的结尾，
     :  后加一个行号再按 <Return> 移动到对应行。
注：直接输入行号后按 gg 或 G 亦可。例如 32G 移动至第 32 行。

  3. 输入 / 后跟一个短语，来向下搜索此短语。
     输入 ? 后跟一个短语，来向上搜索此短语。
     在一次搜索之后，输入 n 同方向查找下一处，
     输入 N 反方向查找下一处。

  4. 新的动作：
     输入 % ，当光标在某个括号“(”“)”“[”“]”“{”“}”上时，
     定位它匹配的另一个。

  5. 新的动作：利用 f F t T 后加字符，可以到达此字符附近。
  
  6. 为了将行内第一个 old 替换为 new，输入      :s/old/new
     为了将行内的所有 old 替换为 new，输入      :s/old/new/g
     为了将两行 # 之间所有 old 替换为 new，输入 :#,#s/old/new/g
     为了将文件中内所有 old 替换为 new，输入    :%s/old/new/g
     为了每次询问是否确认，添加“c”，即          :%s/old/new/gc


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 6 讲第 1 节：怎样执行一个外部命令


   ** 输入 :! 后跟一个外部命令来执行此命令。 **

  1. 输入我们已经熟悉的 : ，将光标置于屏幕底部。
     这使你进入命令状态，可以输入一个命令（记住我们之前已多次使用过
     这个，比如移动到缓冲区中对应的行号。）

  2. 现在输入 ! （英文感叹号）字符。这允许你执行任何外部 shell 命令。

  3. 作为一个例子，在 ! 之后输入 ls ，再按 <Return>。
     这将向你展示你的目录的一个列表，正如你在 shell 提示符中的那样。
     如果 ls 没有用，可以使用 :!dir （在 Windows 上）。

---> 注：几乎所有外部命令都可以这样执行。

---> 注：所有 : 命令都必须用 <Return> 确认执行，之后不再提示。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 6 讲第 2 节：再谈写入（write）文件，及编辑（edit）文件


        ** 为了保存对文件的更改，输入 :w 文件名 **

  1. 输入 :!ls 或 :!dir 以得到你的目录的一个列表。
     你已经知道你必须在之后按 <Return>。

  2. 选择一个尚不存在的文件名，比如 TEST。

  3. 现在输入 :w TEST （其中 TEST 是你选择的文件名）。

  4. 这将以名字 TEST 写入（或者说“另存为”）整个文件。
     为了验证这点，再次输入 :!ls 或 :!dir 来查看你的目录。

  5. 现在输入 :e TE ，其中 TE 指 TEST 的前一部分。
     再按 C-d 或 <TAB> 来进行补全：
     你会发现输入区附近出现了一个全部以 TE 开头的补全列表，
     或者 TEST 直接被补全（如果可以补全的选项是唯一的）。

注：这种补全在命令状态下是通用的，请多多利用。之后不会再提示。
    此外，Emacs 也可被配置为
    在自动补全的列表中使用 C-n 与 C-p 来上下移动选择，
    再使用 RET 确认。

  6. 利用上一步的补全来完成命令的完整输入，使其变成 :e TEST ，
     然后按回车来编辑（edit）或者说打开这个名为 TEST 的新文件。
     它的内容正是本教程的工作文件在你保存之前的最后的样子。
     你可以对此新文件进行任意编辑，并且也可以输入 :w 以保存，
     而不影响本教程的工作文件。

  7. 现在输入 :bd! 来不加确认地删除（delete）
     用于打开此新文件的缓冲区（buffer），
     这会自动回到本教程的工作文件的缓冲区。
     （如果没有，你应当知道怎么切换。）

  8. 现在，在磁盘上删除此新文件，为此输入：

     在（类）Unix 上：      :!rm TEST
     在 Windows 上：        :!del TEST


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 6 讲第 3 节：一个选择性的写入命令


           ** 为了保存文件的一部分，输入 v 动作 :w 文件名 **

  1. 再次，输入 :!ls 或 :!dir 以获得你的目录的一个列表，
     并选择一个适当的文件名比如 TEST。

  2. 按 C-k 以将光标移动至此节的第一行，按 V（注意大写）；

  3. 按 C-j 以将光标移动至此节的最后一行，现在你选中了一个区域。

  4. 按 :
     此时在屏幕底部，你可以看到 :'<,'>
     再输入 w TEST ，其中 TEST 是你的文件名。
     这样，命令就变成了 :'<,'>w TEST 。按回车确认。
     于是你就保存了选中区域到指定文件 TEST 中。
     
  5. 再次，使用 :!ls 或 :!dir 以查看文件确实在那里。
     （但现在不要删除它。）

注：按 v 进入可视状态
    （ V 则是以行为单位的可视状态，C-v 是矩形可视状态），
    此时你可以移动光标来选中一个区域，之后使用操作符做一些操作，
    比如用 d 删除文本。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 6 讲第 4 节：取出（retrieving）与合并（merging）文件


         ** 为了插入一个文件的内容，输入 :r 文件名 **

  1. 输入 :!ls 或 :!dir 来确保你的 TEST 文件从之前至现在依然存在。

  2. 将光标置于这一节的顶部。

注：在执行第 3 步后，你将看到第 6 讲第 3 节。
    在这之后向下移动至本节！

  3. 现在取出（retrieve）你的 TEST 文件，为此使用命令 :r TEST 。

注：你取出的文件的开头被置于光标之前位于的地方。

  4. 为了检验一个文件被取出，移回光标并注意现在已经有了
     两份第 6 讲第 3 节的副本，包括原本的和文件版的。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 6 讲 小结


  1.  :!命令 执行一个外部命令。

      一些有用的例子：
          :!ls 或 :!dir                 - 显示一个目录列表
          :!rm 或 :!del FILENAME        - 删除以 FILENAME 为名的文件

  2. :w FILENAME 将当前缓冲区以文件名 FILENAME 写入到磁盘中。

  3. :e FILENAME 将把磁盘中的文件 FILENAME 打开到当前缓冲区中。
     若此文件尚不存在，则相当于创建新文件
     （但也要写入后才会出现在磁盘中）。

  4. 在命令状态下可以用 C-d 或 <TAB> 补全。

  5. 用 v 进入可视状态后，选中指定区域，再输入 :w FILENAME
     可将此区域保存到文件 FILENAME 中。
     也可对此区域使用操作符，如 d 删除区域。
    （ V 是以行为单位的可视状态，C-v 是矩形可视状态。）

  6. :r FILENAME 取回磁盘文件 FILENAME 并将其插入
     当前缓冲区的光标位置之后。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 7 讲第 1 节：打开（open）操作


 ** 按 o 以在光标下方打开一行，并使你处于插入状态。 **

  1. 将光标移动到下面以“--->”开头的行。

  2. 按 o 以在光标下方打开一行，并使你处于插入状态。

  3. 现在复制以“--->”开头的行，并按 <ESC> 以退出插入状态。

---> 在按 o 之后可以看到，光标被置于打开的行，并进入插入状态。

  4. 为了在光标上方打开一行，直接按大写 O 而不是小写 o 。
     在下面的行试验这个。
---> 在此行上方打开一行，为此将光标移至此行并按 O 。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 7 讲第 2 节：附加（append）操作


               ** 按 a 以在光标之后插入操作。 **

  1. 通过在普通状态下按 $ ，将光标移动到下面
     第一个以“--->”开头的行的末尾。

  2. 按 a 来在光标之后附加（append）文本。
     （大写 A 附加到行末。）

注：如果你不使用 A 而是像之前一样使用 i 来达成
    附加到行末的目标，不是不行，但会相当麻烦。

  3. 现在补完第一行。也要注意，附加和插入一样会进入
     插入状态，不同处仅在于插入点相对光标的位置。

---> This line will allow you to practice
---> This line will allow you to practice appending text to the end of a line.
（译：这一行允许你练习在某一行的末尾附加文本。）


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 7 讲第 3 节：另一个版本的替换（replace）


      ** 按大写的 R 来替换多于一个的字符。 **

  1. 将光标移动到下面第一个以“--->”开头的行。

  2. 将光标移动到下面与以“--->”开头的第二行不同的
     第一个单词（即“last”）的开头。

  3. 现在按 R 来替换第一行的剩余文本，
     通过在旧文本上输入，使得第一行与第二行相同。

---> To make the first line the same as the last on this page use the keys.
---> To make the first line the same as the second, type R and the new text.
（译：为了使第一行与第二行一致，输入 R 以及新的文本。）

  4. 注意当你按 <ESC> 以退出时，任何未改变的文本仍然保留。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 7 讲第 4 节：复制与粘贴文本


	  ** 使用 y 来复制文本，再用 p 来粘贴它 **

  1. 将光标移动到下面第一个以“--->”开头的行，并置于"a)"后面。

  2. 用 v 进入可视状态，再将光标移动至“第”上。

  3. 按 y 来拉取（yank；实际上就是复制）高亮文本。

  4. 将光标移至下一行的末尾：  j$

  5. 按 p 来放置（put；实际上就是粘贴）文本。然后输入“ 2 ”再按 <ESC>。

  6. 使用可视状态来选取“项。”，用 y 复制它，用 j$ 移动至下一行行末，
     再用 p 粘贴文本。

--->  a) 这是第 1 项。
      b)

  注：你也可以将 y 作为一个操作符：
  yw 复制一个单词，yy 复制一整行。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        第 7 讲 小结


  1. 按 o 以在光标下方打开一行，并将光标置于打开的这一行，进入插入状态。
     按 O 以在光标上方打开一行，并将光标置于打开的这一行，进入插入状态。

  2. 按 a 以在光标所在字符后面插入文本。
     按 A 以在行末附加文本。

  3. 按 R 进入替换（replace）状态，直到按 <ESC> 以退出。

  4. 新的操作符： y ，可以拉取（yank，即复制）文本到移除环的首位，
     而不会像 d 那样让文本消失。

  5. p 放置（put，即粘贴）文本。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        结语
        
  Evil Tutor 在这里就结束了。
  它旨在给出 Emacs+Evil 编辑器的一个简单的总览，
  刚好足够让你很轻松地使用这个编辑器。
  它远远不算完整，因为 Evil 还有很多其他功能。
  比如，用于录制宏的 q 和执行宏的 @ ；
  用于记录位置的 m 和跳转到位置的 ' ；
  矩形选区下的矩形编辑；
  与其他插件的搭配使用（如 evil-org）；
  ……

  此外，在本教程之外，你还应适当了解 Emacs 本身。
  为此，可以使用 Emacs 自带的教程：

           M-x help-with-tutorial-spec-language RET Chinese RET

  ！！但请注意：
  Emacs 自带的教程是为 Emacs 原生键位设计的，
  因此你需要使用本教程第 1 讲的知识切换到 emacs 状态来进行此教程。
  这样就足够了；但它不会检测到你处于 Evil 的 emacs 状态，
  仍然会提示你“<按键> has been rebound”并让你用 M-x 手动输入函数。
  实际上，只要你确实切换到了 emacs 状态，则这些提示一般是可以无视的。

  更多资料：
  Evil-guide（全英文）
  https://github.com/noctuid/evil-guide

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        历史

  最初的教程由 Michael C. Pierce 和 Robert K. Ware（Colorado
  矿物学院）写成，想法源于 Charles Smith（Colorado 州立大学），
  电子邮箱：bware@mines.colorado.edu。

  为 Vim 改编：Bram Moolenaar。

  为 Emacs+Evil 改编（基于 vimtutor 1.5）：Sylvain Benner。
  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        当前

  evil-tutor-sc 最初由 evil-tutor 翻译而来（见本教程的 1.1 版本），
  也有部分内容来源于同时期的最新 vimtutor 与 Emacs Tutorial 等。
  后来，作者也为提升质量、修复错误、强化功能等进行了大量的改编与扩充。

  作者：clsty <celestial.y@outlook.com>。
  项目地址：https://github.com/clsty/evil-tutor-sc
  （如有任何反馈意见，请移步此项目的 issue 。
  也欢迎用 Star 来表达你的认可与支持。 >v0 ）

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;;; Local Variables:
;;; coding: utf-8
;;; End:
