doc: 阅读vim register文档

This commit is contained in:
asahi
2025-08-02 23:48:45 +08:00
parent ed116d4bb7
commit 5fe5320e73

View File

@@ -234,3 +234,110 @@ numbered register会自动按照升序对其自身进行填充存在两种不
除了yank之外的操作都不会被存储到register 0。`故而即使yank操作后发生了delete/change操作register 0中的内容也不会被修改` 除了yank之外的操作都不会被存储到register 0。`故而即使yank操作后发生了delete/change操作register 0中的内容也不会被修改`
当处于insert mode时可以通过`ctrl + R 0`来快速粘贴register 0中的内容。 当处于insert mode时可以通过`ctrl + R 0`来快速粘贴register 0中的内容。
#### non-zero numbered register
当change/delete长度超过1行的文本时该文本将会被存储在non-zero numbered register中按照`most-recent`的顺序存储在`1-9`寄存器中。
> 其中,`长度超过一行`可以指`文本未包含完整的某一行,但是出现跨行`的场景,示例如下
>
> ```
> 111
> 222
> # 选中范围为第一行末尾的`11`和第二行开头的`2`,此时对选中内容
> 进行change/delete选中文本仍然会包含在non-zero register中
> ```
>
> 但是如果选中内容位于同一行并且不包含完整行那么change/delete内容不会填充到non-zero numbered register中
例如,
```
111
222
```
上述对第一行`111`内容进行删除后,`111`文本将会被包含在`register 1`中。
再次针对`222`调用`dd`删除后non-zero numbered registers内容如下
- `register 1`: 包含内容为`222`
- `register 2 ` 包含内容为`111`
##### `.`
当使用`"1p`粘贴完register 1中的内容时直接多次调用`.`其会自动粘贴`"2``"3``"4`寄存器中的内容。
如果从`"5p`开始粘贴,调用`.`后,其会自动粘贴`"6p`
对于`small deletion`(例如`dw``cw`其并不会被存储到numbered register中而是会被存储到small deletion register`"-`)中。
### small deletion register
对于小于一行的deletion或change其并不会被存储在numbered registers中而是会被存储在small deletion register(`"-`)中
例如,
- `diw`
- `ciw`
### named register
named register是vim中最通用的register其可以针对yank/change/delete的text进行存储其范围为`a-z`
named register和前面介绍的registers不同named register并不会被自动存储而是需要手动指定存储的named register。
例如,需要将文本存储到`register a`,需要执行如下命令`"ayiw`
- 其中`"a`告知vim将内容存储到`"a`寄存器中
- `yiw`用于复制word
如果需要获取register a中的内容可以通过`"ap`命令。
#### append to named register
如果想要对named register中的内容进行新增而不是完全替换可以使用如下方式
- register a中已经存在内容“hello”
- 想要添加“world”到register a中可以调用`"Ayiw`
此时register a中的内容将会变为`helloworld`,而不是被替换为`world`
### read-only register
vim中含有3个read-only register:
- `.`:存储了最后插入的文本(处于insert modez最后入的内容)
- `:`:存储了上次执行的命令
- `%`:存储了当前文件名称(绝对路径)
### alternate file register
alternate file代表最后打开的文件`alternate file register`代表最后打开文件的名称。
### expression register
vim中拥有expression register并可以通过`"=`来执行表达式。
例如,执行表达式`1 + 1`,可以进行如下操作`"=1+1<Enter>p`
- 其会执行`1+1`的运算
- `p`则是会拿到运算结果
在insert mode下则是可以通过`Ctrl-r =1+1`来执行表达式。
expression register还支持获取其他寄存器的值示例如下
`"=@a<Enter>p`可以获取register a的值。
在insert mode下`Ctrl-r =@a`也可以获取register a的值。
### selection register
通过selection register可以从外系统中粘贴文本。
vim中拥有两种selection register`*`, `+`。当在vim之外的程序例如chrome browser中复制文本时并不能直接通过`p`在vim中粘贴。但是vim的`"*``"+`会和系统的剪切板相关联,可以通过`"+p``"*p`来粘贴外部程序中复制的文本。
同样的,如果通过`"+yiw``"*yiw`来复制内容,那么复制的内容可以在外部程序中进行粘贴。(需要启用`+clipboard`选项)
如果想要直接通过`p`来粘贴外部程序中复制的内容,可以通过在`.vimrc`中添加如下配置:
```
set clipboard=unnamed
```
### black hole register
每次当对文本进行delete/change时文本都会自动保存在vim的寄存器中。如果此次操作不想保存任何内容到寄存器中可以使用black hole register `"_`
例如,想要删除行但是不保存到任何寄存器中,可以使用`"_dd`
black hole register类似于`/dev/null`
### last search register
如果想要对最后搜索的内容(通过`/``?`进行搜索进行粘贴可以使用last search register(`"/`)。
如果想要对最后搜索的内容进行粘贴,可以使用`"/p`insert mode模式下可以使用`Ctrl-r /`