neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

vim-02-beginner.tutor (6450B)


      1 # 欢迎来到 Neovim 教程
      2 
      3 # 第 2 章
      4 
      5   此处有龙(拉丁语 Hic Sunt Dracones,表示有危险):如果这是您第一次接触 vim,并
      6   且您希望从入门章节开始,请在 Vim 编辑器的命令行中输入:
      7 ~~~ cmd
      8         :Tutor vim-01-beginner
      9 ~~~
     10   或者直接点击链接打开教程的[第一章](@tutor:vim-01-beginner)。
     11 
     12   完成本章大约需要 8-10 分钟,具体取决于您在实践探索上花费的时间。
     13 
     14 
     15 # 第 2.1.1 课:命名寄存器
     16 
     17 ** 同时复制两个单词,然后分别粘贴它们 **
     18 
     19   1. 将光标移动到下面标有 ✓ 的那一行。
     20 
     21   2. 导航到 'Edward' 单词的任意位置,然后输入 `"ayiw`{normal}
     22 
     23 **助记**:*将 (i)nner (w)ord(内部单词)(y)ank(复制)到名为 (a) 的寄存器(")中*
     24 
     25   3. 向前导航到 'cookie' 单词(可以使用 `fk`{normal} 或 `3fc`{normal}
     26      或 `$2b`{normal} 或 `/co`{normal} `<Enter>`{normal}),然后输入 `"byiw`{normal}
     27 
     28   4. 导航到 'Vince' 单词的任意位置,然后输入 `ciw<CTRL-r>a<ESC>`{normal}
     29 
     30 **助记**:*用名为 (a) 的寄存器(<contents of (r)egister>)的内容 (c)hange (i)
     31 nner (w)ord(修改内部单词)*
     32 
     33   5. 导航到 'cake' 单词的任意位置,然后输入 `ciw<CTRL-r>b<ESC>`{normal}
     34 
     35 a) Edward will henceforth be in charge of the cookie rations
     36 b) In this capacity, Vince will have sole cake discretionary powers
     37 
     38 NOTE: 删除操作同样可以存入寄存器,例如 `"sdiw`{normal} 会将被光标下的单词删除并存入寄存器 s。
     39 
     40 参考:[寄存器](registers)
     41       [命名寄存器](quotea)
     42       [移动与文本对象](text-objects)
     43       [CTRL-R](i_CTRL-R)
     44 
     45 
     46 # 第 2.1.2 课:表达式寄存器
     47 
     48 ** 即时插入计算结果 **
     49 
     50   1. 将光标移动到下面标有 ✗ 的那一行。
     51 
     52   2. 导航到所给数字的任意位置。
     53 
     54   3. 输入 `ciw<CTRL-r>=`{normal}60\*60\*24 `<Enter>`{normal}
     55 
     56   4. 在下一行,进入插入模式,并使用
     57      `<CTRL-r>=`{normal}`system('date')`{vim} `<Enter>`{normal} 来添加今天的日期。
     58 
     59 NOTE: 所有对 `system` 的调用都依赖于操作系统,例如在 Windows 上应使用
     60       `system('date /t')`{vim}   或  `:r!date /t`{vim}
     61 
     62 I have forgotten the exact number of seconds in a day, is it 84600?
     63 Today's date is: 
     64 
     65 NOTE: 同样效果也可以通过 `:pu=`{normal}`system('date')`{vim} 实现,
     66       或者用更少的按键 `:r!date`{vim}
     67 
     68 参考:[表达式寄存器](quote=)
     69 
     70 
     71 # 第 2.1.3 课:数字寄存器
     72 
     73 ** 按下 `yy`{normal} 和 `dd`{normal} 来观察它们对寄存器的影响 **
     74 
     75   1. 将光标移动到下面标有 ✓ 的那一行。
     76 
     77   2. 复制(yank)第 0 行,然后用 `:reg`{vim} `<Enter>`{normal} 查看寄存器。
     78 
     79   3. 用 `"cdd`{normal} 删除第 0 行,然后再次查看寄存器。
     80      (你觉得第 0 行的内容会出现在哪里?)
     81 
     82   4. 继续删除后续的每一行,并在每次删除后用 `:reg`{vim} 查看寄存器。
     83 
     84 NOTE: 你应该会发现,当新的整行删除内容被添加进来时,之前删除的内容会在寄存器列
     85 表中依次下移。
     86 
     87   5. 现在,按顺序 (p)aste(粘贴)以下寄存器中的内容:c, 7, 4, 8, 2。例如,使用 `"7p`{normal}
     88 
     89 0. This
     90 9. wobble
     91 8. secret
     92 7. is
     93 6. on
     94 5. axis
     95 4. a
     96 3. war
     97 2. message
     98 1. tribute
     99 
    100 
    101 NOTE: 在数字寄存器中,整行删除(`dd`{normal})的内容比整行复制或涉及更小范围移动
    102 的删除操作“存活”得更久。
    103 
    104 参考:[数字寄存器](quote0)
    105 
    106 
    107 # 第 2.1.4 课:标记之美
    108 
    109 ** 避免“码农式”的行号计算 **
    110 
    111 NOTE: 在写代码时,一个常见的难题是移动大块的代码。
    112       下面的技巧可以帮助你避免进行行号计算,比如 `"a147d`{normal} 或 `:945,1091d a`{vim},
    113       甚至是更麻烦的先用 `i<CTRL-r>=`{normal}1091-945 `<Enter>`{normal} 计算行数。
    114 
    115   1. 将光标移动到下面标有 ✓ 的那一行。
    116 
    117   2. 跳转到函数的第一行,并用 `ma`{normal} 将其标记为 a。
    118 
    119 NOTE: 光标在该行的确切位置并不重要!
    120 
    121   3. 使用 `$%`{normal} 导航到行尾,然后再到代码块的末尾。
    122 
    123   4. 使用 `"ad'a`{normal} 将该代码块删除并存入寄存器 a。
    124 
    125 **助记**:*将从光标位置到包含标记(')(a) 的那一行的内容 (d)elete(删除)到名为 (a) 的寄存器(")中*
    126 
    127   5. 在 BBB 和 CCC 之间用 `"ap`{normal} 粘贴该代码块。
    128 
    129 NOTE: 多次练习这个操作以达到熟练:`ma$%"ad'a`{normal}
    130 
    131 ~~~ cmd
    132 AAA
    133 function itGotRealBigRealFast() {
    134   if ( somethingIsTrue ) {
    135     doIt()
    136   }
    137   // the taxonomy of our function has changed and it
    138   // no longer makes alphabetical sense in its current position
    139 
    140   // imagine hundreds of lines of code
    141 
    142   // naively you could navigate to the start and end and record or
    143   // remember each line number
    144 }
    145 BBB
    146 CCC
    147 ~~~
    148 
    149 NOTE: 标记和寄存器不共享命名空间,因此寄存器 a 和标记 a 是完全独立的。
    150       但寄存器和宏并非如此。
    151 
    152 参考:[标记](marks)
    153       [标记移动](mark-motions)(' 和 \` 的区别)
    154 
    155 
    156 # 第 2.1 课总结
    157 
    158   1. 将文本 存储(复制、删除)到 26 个寄存器(a-z)中,并从中提取(粘贴)出来。
    159   2. 从单词内的任意位置复制整个单词:`yiw`{normal}
    160   3. 从单词内的任意位置更改整个单词:`ciw`{normal}
    161   4. 在插入模式下直接从寄存器插入文本:`<CTRL-r>a`{normal}
    162 
    163   5. 插入简单算术运算的结果:
    164      在插入模式下使用 `<CTRL-r>=`{normal}60\*60 `<Enter>`{normal}
    165   6. 插入系统调用的结果:
    166      在插入模式下使用 `<CTRL-r>=`{normal}`system('ls -1')`{vim}
    167 
    168   7. 使用 `:reg`{vim} 查看寄存器。
    169   8. 了解整行删除 (`dd`{normal}) 的最终去向:在数字寄存器中,即从寄存器 1 到 9
    170      依次向下存放。要理解整行删除的内容在数字寄存器中比任何其他操作都保存得更久。
    171   9. 了解所有复制操作在数字寄存器中的最终去向,以及它们是多么“短暂易逝”。
    172 
    173  10. 在普通模式下设置标记:`m[a-zA-Z0-9]`{normal}
    174  11. 按行移动到标记位置:`'`{normal}
    175 
    176 
    177 # 结语
    178 
    179   Neovim 教程第二章到此结束。本教程仍在不断完善中。
    180 
    181   本章由 Paul D. Parker 编写。
    182 
    183   由 Restorer 为 vim-tutor-mode 修改。
    184 
    185   简体中文翻译版由 PilgrimLyieu <pilgrimlyieu@outlook.com> 译制并校对。
    186 
    187   变更记录:
    188   - 2025-07-07 PilgrimLyieu <pilgrimlyieu@outlook.com>
    189       译制并校对