WIP ##Ranges

This commit is contained in:
S1ngS1ng 2017-03-24 03:25:43 -05:00
parent 2f3e45f992
commit 44aa8aed1b

166
README.md
View File

@ -332,88 +332,108 @@ Vim 是一个文本编辑器。每次文本都是作为**缓冲区**的一部分
:h 05.3
## 快捷键前缀
## 范围
"Leader" 键是一个触发器,默认为 `\\`。我们可以通过在 `map` 中调用 `<leader>` 来为 `<leader>` 键设置映射
```vim
nnoremap <leader>h :helpgrep<space>
```
这样,我们只需要先按 <kbd>\\</kbd> 然后按 <kbd>h</kbd> 就可以执行 `:helpgrep<space>` 了。如果你想通过先按 <kbd>空格</kbd> 键来触发,只需要这样做:
```vim
let mapleader = ' '
nnoremap <leader>h :helpgrep<space>
```
另外,还有一个叫 `<localleader>` 的,可以把它理解为局部环境中的 `<leader>`,默认值依然为 <kbd>\\</kbd>。当我们需要只对某一个条件下(比如,特定文件类型的插件)的缓冲区设置特别的 `<leader>` 键,那么我们就可以通过修改当前环境下的 `<localleader>` 来实现
**注意**:如果你打算设置 Leader 键,请确保在设置按键映射之前,先设置好 Leader 键。如果你先设置了含有 Leader 键的映射,然后又修改了 Leader 键,那么之前映射的 Leader 键是不会因此而改变的。你可以通过执行 `:nmap <leader>` 来查看普通模式中已绑定给 Leader 键的所有映射
请参阅 `:h mapleader``:h maploacalleader` 来获取更多帮助
## 寄存器
## 标注
## 补全
## 动作,操作符,文本对象
## 自动命令
## 变更历史,跳转历史
## 内容变更历史记录
## 全局位置信息表,局部位置信息表
## 宏
## 颜色主题
## 折叠
## 会话
## 局部化
# 用法
## 获取离线帮助
## 获取离线帮助(备选)
## 获取在线帮助
## 执行自动命令
### 用户自定义事件
### 内部自带事件
## 剪贴板
## 剪贴板使用 (Windows, OSX)
## 剪贴板使用 (Linux, BSD, ...)
## 打开文件时恢复光标位置
## 备份文件,交换文件,撤销文件以及 viminfo 文件的处理
## 编辑远程文件
## 插件管理
## 片段插入
## 使用外部程序和过滤器
## MatchIt
# 技巧
寄存器就是存储文本的地方。我们常用的"复制"操作就是把文本存储到寄存器,"粘贴"操作就是把文本从寄存器中读出来。顺便,在 Vim 中复制的快捷键是 <kbd>y</kbd>,粘贴的快捷键是 <kbd>p</kbd>
## 聪明的使用 n 和 N
## 聪明的使用命令行历史
## 智能 Ctrl-l
## 禁用错误报警声音和图标
## 快速移动当前行
## 快速添加空行
## 快速编辑自定义宏
## 快速跳转到源(头)文件
## 在 GUI 中快速改变字体大小
## 根据模式改变光标类型
## 防止水平滑动的时候失去选择
## 重新载入保存文件
## 智能当前行
## 更快的关键字补全
# 命令
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` 等命令调用的正则表达式 |
## :global - 在所有匹配行执行命令
## :normal and :execute - 脚本梦之队
## :redir - 重定向消息
# 调试
只要不是只读的寄存器,用户都有权限修改它的内容,比如:
## 常规建议
## 查看启动日志
## 查看运行时日志
## 调整日志等级
## vim 脚本调试
## 语法文件调试
# 杂项
```vim
:let @/ = 'register'
```
## 附加资源
## Vim 配置集合
## 内置插件
## 将 Control 映射到 CapsLock
## 复活节彩蛋
## 为何使用 hjkl
# 怪癖
这样,我们按 <kbd>n</kbd> 的时候就会跳转到单词 "register" 出现的地方
## 编辑小文件很慢
## 编辑大文件很慢
## 新行用于 NUL
## 相同部分粘贴 (要不为什么我总要设置‘粘贴’?)
## 在终端使用 Esc 延时
## 无法重复函数中执行的搜索
## 主题列表
有些时候,你的操作可能已经修改了寄存器,而你没有察觉到。请参考 `:h registers` 获取更多帮助
# 插件列表
上面提到过,复制的命令是 <kbd>y</kbd>,粘贴的命令是 <kbd>p</kbd> 或者 <kbd>P</kbd>。但请注意Vim 会区分"字符选取"与"行选取"。请参考 `:h linewise` 获取更多帮助
**行选取**
命令 `yy``Y` 都是复制当前行。这时移动光标至其他位置,按下 `p` 就可以在光标下方粘贴复制的行,按下 `P` 就可以在光标上方粘贴至复制的行
**字符选取**
命令 `0yw` 可以复制第一个单词。这时移动光标至其他位置,按下 `p` 就可以在当前行、光标后的位置粘贴单词,按下 `P` 就可以在当前行、光标前的位置粘贴单词
**将文本存到指定的寄存器中**
命令 `"aY` 可以将当前行复制,并存储到寄存器 `a` 中。这时移动光标至其他位置,通过命令 `"AY` 就可以把这一行的内容扩展到寄存器 `a` 中,而之前存储的内容也不会丢失
为了便于理解和记忆,建议大家现在就试一试上面提到的这些操作。操作过程中,你可以随时通过 `:reg` 来查看寄存器的变化
**有趣的是**
在 Vim 中,`y` 是复制命令,源于单词 "yanking"。而在 Emacs 中,"yanking" 代表的是粘贴(或者说,重新插入刚才删掉的内容),而并不是复制
## 范围
范围 (Ranges) 其实很好理解,但很多 Vim 用户的理解不到位
- 很多命令都可以加一个数字,用于指明操作范围
- 可以是一个 "地址",用于指定某一行
- 可以是一个 "地址" 或者一对通过 `,``;` 分割的一对 "地址"
- 大部分命令,默认只作用于当前行
- 只有 `:white``:global` 是默认作用于所有行的
范围的使用是十分直观的。以下为一些例子(其中,`:d``:delete` 的缩写:
| 命令 | 操作的行 |
|---------|----------------|
| `:d` | 当前行 |
| `:.d` | 当前行 |
| `:1d` | 第一行 |
| `:$d` | 最后一行 |
| `:1,$d` | 所有行 |
| `:%d` | 所有行(这是 `1,$` 的语法糖) |
| `:.,5d` | 当前行至第 5 行 |
| `:,5d` | 当前行至第 5 行 |
| `:,+3d` | 当前行及接下来的 3 行 |
| `:1,+3d` | 第一行至当前行再加 3 行 |
| `:,-3d` | 当前行及向上的 3 行Vim 会弹出提示信息,因为这是一个保留的范围) |
| `:3,'xdelete` | 第三行至[标记](#标记) 为 x 的那一行 |
| `:/^foo/,$delete` | 当前行以下,以字符 "foo" 开头的那一行至结尾 |
| `:/^foo/+1,$delete` | 当前行以下,以字符 "foo" 开头的那一行的下一行至结尾 |
需要注意的是,`;` 也可以用于表示范围。区别在于,`a,b``b` 是以当前行作为参考的。而 `a;b``b` 是以 `a` 行作为参考的。举个例子,现在你的光标在第 5 行。这时 `:1,+1d` 会删除第 1 行至第 6 行,而 `:1;+1d` 会删除第 1 行和第 2 行
你可以在通过在地址前加上 `/` 来设置多个地址,比如:
```vim
:/foo//bar//quux/d
```
这就会删除当前行之后的某一行。定位方式是,现在当前行之后寻找第一个包含 "foo" 字符的那一行,然后在找到的这一行之后寻找第一个包含 "bar" 字符的那一行,然后再在找到的这一行之后寻找第一个包含 "quux" 的那一行。删除的就是最后找到的这一行
# Neovim
## 加入我们