From 5fe5320e7341497800567efc753d3376e34ad96b Mon Sep 17 00:00:00 2001 From: asahi Date: Sat, 2 Aug 2025 23:48:45 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E9=98=85=E8=AF=BBvim=20register?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vim/vim.md | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/vim/vim.md b/vim/vim.md index b77cd88..e67315a 100644 --- a/vim/vim.md +++ b/vim/vim.md @@ -234,3 +234,110 @@ numbered register会自动按照升序对其自身进行填充,存在两种不 除了yank之外的操作都不会被存储到register 0。`故而,即使yank操作后发生了delete/change操作,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+1p` +- 其会执行`1+1`的运算 +- `p`则是会拿到运算结果 + +在insert mode下,则是可以通过`Ctrl-r =1+1`来执行表达式。 + +expression register还支持获取其他寄存器的值,示例如下 +`"=@ap`可以获取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 /`。 + + +