Update before ##Completion. Addressed comments before

This commit is contained in:
S1ngS1ng 2017-03-24 13:50:55 -05:00
parent 44aa8aed1b
commit f8bb29df36

View File

@ -2,6 +2,7 @@
[![掘金翻译计划](https://rawgit.com/aleen42/badges/master/src/juejin_translation.svg)](https://github.com/xitu/gold-miner/)
<<<<<<< HEAD
> Vim from zero to hero - Vim 从入门到精通
- 原文地址https://github.com/mhinz/vim-galore
@ -333,6 +334,10 @@ Vim 是一个文本编辑器。每次文本都是作为**缓冲区**的一部分
## 快捷键前缀
"Leader" 键是一个触发器,默认为 `\\`。我们可以通过在 `map` 中调用 `<leader>` 来为 `<leader>` 键设置映射
=======
## 使用 Leader 键
"Leader" 键是一个触发器,默认为 <kbd>\\</kbd>。我们可以通过在 `map` 中调用 `<leader>` 来为 `<leader>` 键设置映射
>>>>>>> Update before ##Completion. Addressed comments before
```vim
nnoremap <leader>h :helpgrep<space>
@ -356,19 +361,20 @@ nnoremap <leader>h :helpgrep<space>
寄存器就是存储文本的地方。我们常用的"复制"操作就是把文本存储到寄存器,"粘贴"操作就是把文本从寄存器中读出来。顺便,在 Vim 中复制的快捷键是 <kbd>y</kbd>,粘贴的快捷键是 <kbd>p</kbd>
Vim 为我们提供了如下的寄存器:
| 类型 | 字符 | 读写者 | 是否为只读 | 包含的字符来源 |
|---------------------|------------------------|------------|-------------|---------------------|
| Unnamed | `"` | vim | [ ] | 最近一次的复制或删除操作 (`d`, `c`, `s`, `x`, `y`) |
| Numbered | `0` to `9` | vim | [ ] | 寄存器 `0`: 最近一次复制。寄存器 `1`: 最近一次删除。寄存器 `2`: 倒数第二次删除,以此类推。对于寄存器 `1``9`,他们其实是只读的最多包含 9 个元素的队列。这里的队列即为数据类型 [queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) |
| Small delete | `-` | vim | [ ] | 最近一次,内容在一行以内的删除 |
| Named | `a` to `z`, `A` to `Z` | user | [ ] | 如果你通过复制操作存储文本至寄存器 `a`,那么 `a` 中的文本就会被完全覆盖。如果你存储至 `A`,那么会将文本添加给寄存器 `a`,不会覆盖之前已有的文本 |
| Read-only | `:`, `.`, `%` | vim | [x] | `:`: 最近一次使用的命令,`.`: 最近一次添加的文本,`%`: 当前的文件名 |
| Alternate buffer | `#` | vim | [ ] | 大部分情况下,这个寄存器是当前窗口中,上一次访问的缓冲区。请参阅 `:h alternate-file` 来获取更多帮助 |
| Expression | `=` | user | [ ] | 复制 VimL 代码时,这个寄存器用于存储代码片段的执行结果。比如,在插入模式下复制 `<c-r>=5+5<cr>`,那么这个寄存器就会存入 10 |
| Selection | `+`, `*` | vim | [ ] | `*``+` 是 [剪贴板](#剪贴板) 寄存器 |
| Drop | `~` | vim | [x] | 存储最近一次添加进 Vim 中的文本 |
| Black hole | `_` | vim | [ ] | 对于当前操作,如果你不希望在其他寄存器中保留文本,那就在命令前加上 `_`。比如,`"_dd` 命令不会将文本放到寄存器 `"``1``+``*` 中 |
| Last search pattern | `/` | vim | [ ] | 最近一次通过 `/``?``:global` 等命令调用的正则表达式 |
| 类型 | 标识 | 读写者 | 是否为只读 | 包含的字符来源 |
| ---- | ---- | ------ | ---------- | -------------- |
| Unnamed | `"` | vim | 否 | 最近一次的复制或删除操作 (`d`, `c`, `s`, `x`, `y`) |
| Numbered | `0` to `9` | vim | 否 | 寄存器 `0`: 最近一次复制。寄存器 `1`: 最近一次删除。寄存器 `2`: 倒数第二次删除,以此类推。对于寄存器 `1``9`,他们其实是只读的最多包含 9 个元素的队列。这里的队列即为数据类型 [queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) |
| Small delete | `-` | vim | 否 | 最近一次,内容在一行以内的删除 |
| Named | `a` to `z`, `A` to `Z` | 用户 | 否 | 如果你通过复制操作存储文本至寄存器 `a`,那么 `a` 中的文本就会被完全覆盖。如果你存储至 `A`,那么会将文本添加给寄存器 `a`,不会覆盖之前已有的文本 |
| Read-only | `:`, `.`, `%` | vim | 是 | `:`: 最近一次使用的命令,`.`: 最近一次添加的文本,`%`: 当前的文件名 |
| Alternate buffer | `#` | vim | 否 | 大部分情况下,这个寄存器是当前窗口中,上一次访问的缓冲区。请参阅 `:h alternate-file` 来获取更多帮助 |
| Expression | `=` | 用户 | 否 | 复制 VimL 代码时,这个寄存器用于存储代码片段的执行结果。比如,在插入模式下复制 `<c-r>=5+5<cr>`,那么这个寄存器就会存入 10 |
| Selection | `+`, `*` | vim | 否 | `*``+` 是 [剪贴板](#剪贴板) 寄存器 |
| Drop | `~` | vim | 是 | 存储最近一次添加进 Vim 中的文本 |
| Black hole | `_` | vim | 否 | 对于当前操作,如果你不希望在其他寄存器中保留文本,那就在命令前加上 `_`。比如,`"_dd` 命令不会将文本放到寄存器 `"``1``+``*` 中 |
| Last search pattern | `/` | vim | 否 | 最近一次通过 `/``?``:global` 等命令调用的匹配条件 |
只要不是只读的寄存器,用户都有权限修改它的内容,比如:
@ -400,12 +406,12 @@ Vim 为我们提供了如下的寄存器:
范围 (Ranges) 其实很好理解,但很多 Vim 用户的理解不到位
- 很多命令都可以加一个数字,用于指明操作范围
- 可以是一个 "地址",用于指定某一行
- 可以是一个 "地址" 或者一对通过 `,``;` 分割的一对 "地址"
- 可以是一个行号,用于指定某一行
- 可以是一个行号或者一对通过 `,``;` 分割的行号
- 大部分命令,默认只作用于当前行
- 只有 `:white``:global` 是默认作用于所有行的
范围的使用是十分直观的。以下为一些例子(其中,`:d``:delete` 的缩写:
范围的使用是十分直观的。以下为一些例子(其中,`:d``:delete` 的缩写
| 命令 | 操作的行 |
|---------|----------------|
@ -426,7 +432,7 @@ Vim 为我们提供了如下的寄存器:
需要注意的是,`;` 也可以用于表示范围。区别在于,`a,b``b` 是以当前行作为参考的。而 `a;b``b` 是以 `a` 行作为参考的。举个例子,现在你的光标在第 5 行。这时 `:1,+1d` 会删除第 1 行至第 6 行,而 `:1;+1d` 会删除第 1 行和第 2 行
你可以在通过在地址前加上 `/` 来设置多个地址,比如:
如果你想设置多个寻找条件,只需要在条件前加上 `/`,比如:
```vim
:/foo//bar//quux/d
@ -434,6 +440,54 @@ Vim 为我们提供了如下的寄存器:
这就会删除当前行之后的某一行。定位方式是,现在当前行之后寻找第一个包含 "foo" 字符的那一行,然后在找到的这一行之后寻找第一个包含 "bar" 字符的那一行,然后再在找到的这一行之后寻找第一个包含 "quux" 的那一行。删除的就是最后找到的这一行
有时Vim 会在命令前自动添加范围。举个例子,如果你先通过 `V` 命令进入行选取模式,选中一些行后按下 `:` 进入命令模式,这时候你会发现 Vim 自动添加了 `'<,'>` 范围。这表示接下来的命令会使用之前选取的行号作为范围。但如果后续命令不支持范围Vim 就会报错。为了避免这样的情况发生,有些人会设置这样的按键映射:`:vnoremap foo :<c-u>command`,组合键 <kbd>Ctrl + u</kbd> 可以清除当前命令行中的内容
另一个例子是在普通模式中按下 `!!`,命令行中会出现 `:.!`。如果这时你如果输入一个外部命令,那么当前行的内容就会被这个外部命令的输出替换。你也可以通过命令 `:?^$?+1,/^$/-1!ls` 来把当前段落的内容替换成外部命令 `ls` 的输出
请参阅以下两个命令来获取更多帮助:
```vim
:h cmdline-ranges
:h 10.3
```
## 标注
你可以使用标注功能来标记一个位置,也就是在文件中标记行号和列
| 标注 | 设置者 | 使用 |
| ---- | ------ | ---- |
| `a` - `z` | 用户 | 仅对当前的一个文件生效,也就意味着只可以在当前文件中跳转 |
| `A` - `Z` | 用户 | 全局标注,可以作用于不同文件。大写标注也称为"文件标注"。跳转时有可能会切换到另一个缓冲区 |
| `0` - `9` | viminfo | `0` 代表 viminfo 最后一次被写入的位置。实际使用中,就代表 Vim 进程最后一次结束的位置。`1` 代表 Vim 进程倒数第二次结束的位置,以此类推 |
如果想跳转到指定的标注,你可以先按下 `'``g'``\`` 或 `g\`` 然后按下标注名
如果你想定义当前文件中的标注,可以先按下 `m` 再按下标注名。比如,按下 `mm` 就可以把当前位置标注为 `m`。在这之后,如果你的光标切换到了文件的其他位置,只需要通过 `'m` 或者 `\`m` 即可回到刚才标注的行。区别在于,`'m` 会跳转回被标记行的第一个非空字符,而 `\`m` 会跳转回被标记行的被标记列。根据 viminfo 的设置,你可以在退出 Vim 的时候保留小写字符标注。请参阅 `:h viminfo-'` 来获取更多帮助
如果你想定义全局的标注,可以先按下 `m` 再按下大写英文字符。比如,按下 `mM` 就可以把当前文件的当前位置标注为 `M`。在这之后,就算你切换到其他的缓冲区,依然可以通过 `'M``\`M` 跳转回来
关于跳转,还有以下的方式:
| 按键 | 跳转至 |
| ---- | ------ |
| `'[` 与 ```[`` | 上一次修改或复制的第一行或第一个字符 |
| `']` 与 ```]`` | 上一次修改或复制的最后一行或最后一个字符 |
| `'<` 与 ```<`` | 上一次在可视模式下选取的第一行或第一个字符 |
| `'>` 与 ```>`` | 上一次在可视模式下选取的最后一行或最后一个字符 |
| `''` 与 ```'`` | 上一次跳转之前的光标位置 |
| `'"` 与 ```"`` | 上一次关闭当前缓冲区时的光标位置 |
| `'^` 与 ```^`` | 上一次插入字符后的光标位置 |
| `'.` 与 ```.`` | 上一次修改文本后的光标位置 |
| `'(` 与 ```(`` | 当前句子的开头 |
| `')` 与 ```)`` | 当前句子的结尾 |
| `'{` 与 ```{`` | 当前段落的开头 |
| `'}` 与 ```}`` | 当前段落的结尾 |
标注也可以搭配 [范围](#范围) 一起使用。前面提到过,如果你在可视模式下选取一些文本,然后按下 `:`,这时候你会发现命令行已经被填充了 `:'<,'>`。对照上面的表格,现在你应该明白了,这段代表的就是可视模式下选取的范围
## 加入我们