mirror of
https://gitlab.com/wsdjeg/vim-galore-zh_cn.git
synced 2025-01-19 03:19:27 +08:00
Addressed comments
This commit is contained in:
parent
7167c94316
commit
3367ea9f90
40
README.md
40
README.md
@ -339,7 +339,7 @@ Vim 是一个文本编辑器。每次文本都是作为**缓冲区**的一部分
|
||||
nnoremap <leader>h :helpgrep<space>
|
||||
```
|
||||
|
||||
这样,我们只需要先按 <kbd>\\</kbd> 然后按 <kbd>h</kbd> 就可以执行 `:helpgrep<space>` 了。如果你想通过先按 <kbd>空格</kbd> 键来触发,只需要这样做:
|
||||
这样,我们只需要先按 <kbd>\\</kbd> 然后连续按 <kbd>\\h</kbd> 就可以激活这个映射 `:helpgrep<space>`。如果你想通过先按 <kbd>空格</kbd> 键来触发,只需要这样做:
|
||||
|
||||
```vim
|
||||
let mapleader = ' '
|
||||
@ -348,7 +348,7 @@ nnoremap <leader>h :helpgrep<space>
|
||||
|
||||
另外,还有一个叫 `<localleader>` 的,可以把它理解为局部环境中的 `<leader>`,默认值依然为 <kbd>\\</kbd>。当我们需要只对某一个条件下(比如,特定文件类型的插件)的缓冲区设置特别的 `<leader>` 键,那么我们就可以通过修改当前环境下的 `<localleader>` 来实现。
|
||||
|
||||
**注意**:如果你打算设置 Leader 键,请确保在设置按键映射之前,先设置好 Leader 键。如果你先设置了含有 Leader 键的映射,然后又修改了 Leader 键,那么之前映射的 Leader 键是不会因此而改变的。你可以通过执行 `:nmap <leader>` 来查看普通模式中已绑定给 Leader 键的所有映射。
|
||||
**注意**:如果你打算设置 Leader 键,请确保在设置按键映射之前,先设置好 Leader 键。如果你先设置了含有 Leader 键的映射,然后又修改了 Leader 键,那么之前映射内的 Leader 键是不会因此而改变的。你可以通过执行 `:nmap <leader>` 来查看普通模式中已绑定给 Leader 键的所有映射。
|
||||
|
||||
请参阅 `:h mapleader` 与 `:h maploacalleader` 来获取更多帮助。
|
||||
|
||||
@ -362,14 +362,14 @@ Vim 为我们提供了如下的寄存器:
|
||||
| ---- | ---- | ------ | ---------- | -------------- |
|
||||
| Unnamed | `"` | vim | 否 | 最近一次的复制或删除操作 (`d`, `c`, `s`, `x`, `y`) |
|
||||
| Numbered | `0`至`9` | vim | 否 | 寄存器 `0`: 最近一次复制。寄存器 `1`: 最近一次删除。寄存器 `2`: 倒数第二次删除,以此类推。对于寄存器 `1` 至 `9`,他们其实是只读的最多包含 9 个元素的队列。这里的队列即为数据类型 [queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) |
|
||||
| Small delete | `-` | vim | 否 | 最近一次,内容在一行以内的删除 |
|
||||
| Small delete | `-` | vim | 否 | 最近一次行内删除 |
|
||||
| Named | `a`至`z`, `A`至`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`、`+` 或 `*` 中 |
|
||||
| Black hole | `_` | vim | 否 | 一般称为黑洞寄存器。对于当前操作,如果你不希望在其他寄存器中保留文本,那就在命令前加上 `_`。比如,`"_dd` 命令不会将文本放到寄存器 `"`、`1`、`+` 或 `*` 中 |
|
||||
| Last search pattern | `/` | vim | 否 | 最近一次通过 `/`、`?` 或 `:global` 等命令调用的匹配条件 |
|
||||
|
||||
只要不是只读的寄存器,用户都有权限修改它的内容,比如:
|
||||
@ -406,7 +406,7 @@ Vim 为我们提供了如下的寄存器:
|
||||
- 范围可以是一个行号,用于指定某一行
|
||||
- 范围也可以是一对通过 `,` 或 `;` 分割的行号
|
||||
- 大部分命令,默认只作用于当前行
|
||||
- 只有 `:white` 和 `:global` 是默认作用于所有行的
|
||||
- 只有 `:write` 和 `:global` 是默认作用于所有行的
|
||||
|
||||
范围的使用是十分直观的。以下为一些例子(其中,`:d` 为 `:delete` 的缩写):
|
||||
|
||||
@ -419,7 +419,7 @@ Vim 为我们提供了如下的寄存器:
|
||||
| `:1,$d` | 所有行 |
|
||||
| `:%d` | 所有行(这是 `1,$` 的语法糖) |
|
||||
| `:.,5d` | 当前行至第 5 行 |
|
||||
| `:,5d` | 当前行至第 5 行 |
|
||||
| `:,5d` | 同样是当前行至第 5 行 |
|
||||
| `:,+3d` | 当前行及接下来的 3 行 |
|
||||
| `:1,+3d` | 第一行至当前行再加 3 行 |
|
||||
| `:,-3d` | 当前行及向上的 3 行(Vim 会弹出提示信息,因为这是一个保留的范围) |
|
||||
@ -439,7 +439,7 @@ Vim 为我们提供了如下的寄存器:
|
||||
|
||||
有时,Vim 会在命令前自动添加范围。举个例子,如果你先通过 `V` 命令进入行选取模式,选中一些行后按下 `:` 进入命令模式,这时候你会发现 Vim 自动添加了 `'<,'>` 范围。这表示,接下来的命令会使用之前选取的行号作为范围。但如果后续命令不支持范围,Vim 就会报错。为了避免这样的情况发生,有些人会设置这样的按键映射:`:vnoremap foo :<c-u>command`,组合键 <kbd>Ctrl + u</kbd> 可以清除当前命令行中的内容。
|
||||
|
||||
另一个例子是在普通模式中按下 `!!`,命令行中会出现 `:.!`。如果这时你如果输入一个外部命令,那么当前行的内容就会被这个外部命令的输出替换。你也可以通过命令 `:?^$?+1,/^$/-1!ls` 把当前段落的内容替换成外部命令 `ls` 的输出。
|
||||
另一个例子是在普通模式中按下 `!!`,命令行中会出现 `:.!`。如果这时你如果输入一个外部命令,那么当前行的内容就会被这个外部命令的输出替换。你也可以通过命令 `:?^$?+1,/^$/-1!ls` 把当前段落的内容替换成外部命令 `ls` 的输出,原理是向前和向后各搜索一个空白行,删除这两个空白行之间的内容,并将外部命令 `ls` 的输出放到这两个空白行之间。
|
||||
|
||||
请参阅以下两个命令来获取更多帮助:
|
||||
|
||||
@ -450,7 +450,7 @@ Vim 为我们提供了如下的寄存器:
|
||||
|
||||
## 标注
|
||||
|
||||
你可以使用标注功能来标记一个位置,也就是在文件中标记某一个行号或某行的某个位置。
|
||||
你可以使用标注功能来标记一个位置,也就是记录文件某行的某个位置。
|
||||
|
||||
| 标注 | 设置者 | 使用 |
|
||||
| ---- | ------ | ---- |
|
||||
@ -483,6 +483,8 @@ Vim 为我们提供了如下的寄存器:
|
||||
|
||||
标注也可以搭配 [范围](#范围) 一起使用。前面提到过,如果你在可视模式下选取一些文本,然后按下 `:`,这时候你会发现命令行已经被填充了 `:'<,'>`。对照上面的表格,现在你应该明白了,这段代表的就是可视模式下选取的范围。
|
||||
|
||||
请使用 `:marks` 命令来显示所有的标注,参阅 `:h mark-motions` 来获取关于标注的更多帮助。
|
||||
|
||||
## 补全
|
||||
|
||||
Vim 在插入模式中为我们提供了多种补全方案。如果有多个补全结果,Vim 会弹出一个菜单供你选择。
|
||||
@ -495,8 +497,8 @@ Vim 在插入模式中为我们提供了多种补全方案。如果有多个补
|
||||
| ---- | ---- | -------- |
|
||||
| `<c-x><c-l>` | 整行 | `:h i^x^l` |
|
||||
| `<c-x><c-n>` | 当前文件中的关键字 | `:h i^x^n` |
|
||||
| `<c-x><c-k>` | 字典中的关键字 | `:h i^x^k` |
|
||||
| `<c-x><c-t>` | 同义词字典中的关键字 | `:h i^x^t` |
|
||||
| `<c-x><c-k>` | 字典(请参阅 `:h 'dictionary'`)中的关键字 | `:h i^x^k` |
|
||||
| `<c-x><c-t>` | 同义词字典(请参阅 `:h 'thesaurus'`)中的关键字 | `:h i^x^t` |
|
||||
| `<c-x><c-i>` | 当前文件以及包含的文件中的关键字 | `:h i^x^i` |
|
||||
| `<c-x><c-]>` | 标签 | `:h i^x^]` |
|
||||
| `<c-x><c-f>` | 文件名 | `:h i^x^f` |
|
||||
@ -537,7 +539,7 @@ Vim 在插入模式中为我们提供了多种补全方案。如果有多个补
|
||||
|
||||
文本对象操作一般用 `i` 或 `a` 加上对象标识符操作,其中 `i` 表示在对象内(英文 inner)操作,`a` 表示对整个对象(英文 around)操作,这时开头和结尾的空格都会被考虑进来。举个例子,`diw` 可以删除当前单词,`ci(` 可以改变括号中的内容。
|
||||
|
||||
文本对象同样可以与数字搭配使用。比如,像 `((( )))` 这样的文本,假如光标位于最内层的括号上或最内层的括号内,那么 `d2a(` 将会删除从最内层开始的两对括号,以及他们之间的所有内容。
|
||||
文本对象同样可以与数字搭配使用。比如,像 `((( )))` 这样的文本,假如光标位于最内层的括号上或最内层的括号内,那么 `d2a(` 将会删除从最内层开始的两对括号,以及他们之间的所有内容。其实,`d2a(` 这个操作等同于 `2da(`。在 Vim 的命令中,如果有两处都可以接收数字作为参数,那么最终结果就等同于两个数字相乘。在这里,`d` 与 `a(` 都是可以接收参数的,一个参数是 1,另一个是 2,我们可以把它们相乘然后放到最前面。
|
||||
|
||||
请参阅 `:h text-objects` 来获取更多关于文本对象的帮助。
|
||||
|
||||
@ -545,7 +547,7 @@ Vim 在插入模式中为我们提供了多种补全方案。如果有多个补
|
||||
|
||||
在特定的情况下,Vim 会传出事件。如果你想针对这些事件执行回调方法,那么就需要用到自动命令这个功能。
|
||||
|
||||
如果没有了自动命令,那你基本上是用不了 Vim 的。自动命令一直都在执行,只是很多时候你没有注意到。不信的话,你可以执行命令 `:au` 来查看一下当前可以触发的所有自动命令,是不是有很多?
|
||||
如果没有了自动命令,那你基本上是用不了 Vim 的。自动命令一直都在执行,只是很多时候你没有注意到。不信的话,可以执行命令 `:au` ,不要被结果吓到,这些是当前有效的所有自动命令。
|
||||
|
||||
请使用 `:h {event}` 来查看 Vim 中所有事件的列表,你也可以参考 `:h autocmd-events-abc` 来获取关于事件的更多帮助。
|
||||
|
||||
@ -559,7 +561,7 @@ autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#
|
||||
|
||||
在配置 vimrc 的时候,一般第一行加进去的就是 `filetype on`。这就意味着,Vim 启动时会读取 `filetype.vim` 文件,然后根据文件类型来触发相应的自动命令。
|
||||
|
||||
如果你有兴趣,可以执行一下 `:e $VIMRUNTIME/filetype.vim`,然后在输出中搜索 "Ruby"。这样,你就会发现其实 Vim 只是通过文件扩展名 `.rb` 判断某个文件是不是 Ruby 的。
|
||||
如果你勇于尝试,可以查看下 `:e $VIMRUNTIME/filetype.vim`,然后在输出中搜索 "Ruby"。这样,你就会发现其实 Vim 只是通过文件扩展名 `.rb` 判断某个文件是不是 Ruby 的。
|
||||
|
||||
**注意**:对于相同事件,如果有多个自动命令,那么自动命令会按照定义时的顺序执行。通过 `:au` 就可以查看它们的执行顺序。
|
||||
|
||||
@ -577,7 +579,7 @@ au BufNewFile,BufRead *.rb,*.rbw setf ruby
|
||||
|
||||
在 Vim 中,用户最近 100 次的文字改动都会被保存在**变更历史**中。如果在同一行有多个小改动,那么 Vim 会把它们合并成一个。尽管内容改动会合并,但作用的位置还是会只记录下最后一次改动的位置。
|
||||
|
||||
在你移动光标或跳转的时候,每一次的移动或跳转前的位置会被记录到**跳转历史**中。类似地,跳转历史也可以最多保存 100 条记录。对于每个窗口,跳转记录是独立的。但当你用 `split` 命令分离窗口时,跳转历史会被复制过去。
|
||||
在你移动光标或跳转的时候,每一次的移动或跳转前的位置会被记录到**跳转历史**中。类似地,跳转历史也可以最多保存 100 条记录。对于每个窗口,跳转记录是独立的。但当你分离窗口时(比如使用 `:split` 命令),跳转历史会被复制过去。
|
||||
|
||||
Vim 中的跳转命令,包括 `'`、`` ` ``、`G`、`/`、`?`、`n`、`N`、`%`、`(`、`)`、`[[`、`]]`、`{`、`}`、`:s`、`:tag`、`L`、`M`、`H` 以及开始编辑一个新文件的命令。
|
||||
|
||||
@ -590,7 +592,7 @@ Vim 中的跳转命令,包括 `'`、`` ` ``、`G`、`/`、`?`、`n`、`N`、`%
|
||||
|
||||
如果你希望关闭 Vim 之后还保留这些条目,请参阅 `:h viminfo-'` 来获取更多帮助。
|
||||
|
||||
**注意**:上面提到过,最后一次跳转前的位置也会记录在[标注](#标注)中,也可以通过 \`\` 或 `''` 跳转到那个位置
|
||||
**注意**:上面提到过,最后一次跳转前的位置也会记录在[标注](#标注)中,也可以通过连按 <kbd>\`\`</kbd> 或 <kbd>''</kbd> 跳转到那个位置
|
||||
|
||||
请参阅以下两个命令来获取更多帮助:
|
||||
|
||||
@ -603,7 +605,7 @@ Vim 中的跳转命令,包括 `'`、`` ` ``、`G`、`/`、`?`、`n`、`N`、`%
|
||||
|
||||
Vim 会记录文本改变之前的状态。因此,你可以使用"撤销"操作 <kbd>u</kbd> 来取消更改,也可以通过"重做"操作 <kbd>Ctrl + r</kbd> 来恢复更改。
|
||||
|
||||
值得注意的是,Vim 采用 [tree](https://en.wikipedia.org/wiki/Tree_(data_structure)) 数据结构来存储内容变更的历史记录,而不是采用 [queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type))。你的每次改动都会成为存储为树的节点。而且,除了第一次改动(根节点),之后的每次改动都可以找到一个对应的父节点。每一个节点都会记录改动的内容和时间。其中,"分支" 代表从任一节点到根节点的路径。当你进行了撤销操作,然后又输入了新的内容,这时候就相当于创建了分支。
|
||||
值得注意的是,Vim 采用 [tree](https://en.wikipedia.org/wiki/Tree_(data_structure)) 数据结构来存储内容变更的历史记录,而不是采用 [queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type))。你的每次改动都会成为存储为树的节点。而且,除了第一次改动(根节点),之后的每次改动都可以找到一个对应的父节点。每一个节点都会记录改动的内容和时间。其中,"分支" 代表从任一节点到根节点的路径。当你进行了撤销操作,然后又输入了新的内容,这时候就相当于创建了分支。这个原理和 git 中的 branch(分支)十分类似。
|
||||
|
||||
考虑以下这一系列按键操作:
|
||||
|
||||
@ -641,9 +643,9 @@ baz(3) quux(4)
|
||||
| `[count]g-` 或 `:earlier [count]?` | 根据时间回退到 `[count]` 次改动之前。"?" 为 "s"、"m"、"h"、"d" 或 "f"之一。例如,`:earlier 2d` 会回退到两天之前。`:earlier 1f` 则会回退到最近一次文件保存时的内容 |
|
||||
| `[count]g+` 或 `:later [count]?` | 类似 `g-`,但方向相反 |
|
||||
|
||||
内容变更记录会储存在内存中,当 Vim 退出时就会清空。详情请参阅本文[备份文件,交换文件,撤销文件以及viminfo文件的处理](#备份文件交换文件撤销文件以及viminfo文件的处理)章节的内容。
|
||||
内容变更记录会储存在内存中,当 Vim 退出时就会清空。如果需要持久化存储内容变更记录,请参阅[备份文件,交换文件,撤销文件以及viminfo文件的处理](#备份文件交换文件撤销文件以及viminfo文件的处理)章节的内容。
|
||||
|
||||
如果你觉得这一部分的内容难以理解,请参阅 [undotree](https://github.com/mbbill/undotree)。链接中的内容是这个树形结构的可视化版本。
|
||||
如果你觉得这一部分的内容难以理解,请参阅 [undotree](https://github.com/mbbill/undotree),这是一个可视化管理内容变更历史记录的插件。类似的还有 [vim-mundo](https://github.com/simnalamburt/vim-mundo)。
|
||||
|
||||
请参阅以下链接获取更多帮助:
|
||||
|
||||
@ -654,7 +656,7 @@ baz(3) quux(4)
|
||||
|
||||
## 全局位置信息表,局部位置信息表
|
||||
|
||||
在某一个动作返回"位置"的时候,我们可以利用"全局位置信息表"和"局部位置信息表"来获取位置。位置可以是一个文件,一个行号或者是一个列。
|
||||
在某一个动作返回一系列"位置"的时候,我们可以利用"全局位置信息表"和"局部位置信息表"来存储这些位置信息,方便以后跳转回对应的位置。每一个存储的位置包括文件名、行号和列号。
|
||||
|
||||
比如,编译代码是出现错误,这时候我们就可以把错误的位置直接显示在全局位置信息表,或者通过外部抓取工具使位置显示在局部位置信息表中。
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user