如何使用 vim 寄存器?

我只知道一个使用寄存器的实例是通过Ctrl R * 的 ,因此我从剪贴板粘贴了文本。

寄存器的其他用途是什么?如何使用它们?

您所了解的关于 VI 寄存器的所有信息(让我们关注 vi 7.2)- 与我们分享。

答案

"kyy
"Kyy
"kp
"+p
"*p
:reg

当我发现0寄存器时,我感到很高兴。如果在不将文本分配给特定寄存器的情况下对其进行抽签,则将其分配给0寄存器,并保存在默认的"寄存器” 中0"寄存器之间的区别在于0仅填充有被抽签的文本,而默认寄存器也填充了使用d / D / x / X / c / C / s / S命令删除的文本。

当我要复制一些文本,删除某些内容并将其替换为复制的文本时,我觉得这很有用。以下步骤说明了一个示例:

  • y[motion]选中要复制的文本 - 此文本保存在"0寄存器中
  • 删除您要用d[motion]替换的文本 - 此文本保存在"注册” 中
  • 将带标记的文本粘贴为"0p

其中"是用于下一个命令的寄存器的命令。

在最后一步,如果要从默认寄存器(带有p )粘贴,它将使用您刚删除的文本(可能不是您想要的文本)。

请注意, pP从默认寄存器粘贴。等效的长时字符为""p (或""P ), "0代表最后一次, "1代表最后一次删除或更改。

有关更多信息,请参见:help registers

ID  Df  %Dev    Lambda
1   0   0.000000    0.313682
2   1   0.023113    0.304332
3   1   0.044869    0.295261
4   1   0.065347    0.286460
5   1   0.084623    0.277922
6   1   0.102767    0.269638
7   1   0.119845    0.261601
EEa%<ESC>j0
EEa!<ESC>j0

其他有用的寄存器:

"*"+ - 系统剪贴板的内容

"/ - 最后一个搜索命令

": - 最后一条命令。

请注意,对于 vim 宏,您可以编辑它们,因为它们只是记录宏时使用的击键列表。因此,您可以将宏写入文本文件(使用"ap写入宏a” )并对其进行编辑,然后使用"ay$将其加载到寄存器中。存储有用宏的好方法。

noremap x "_x
vnoremap p "_dP

如果要在 ex-mode 命令中粘贴寄存器的内容,请按<Cr><registerletter>

你为什么要用这个?我想进行搜索并替换一个长字符串,因此我以可视模式将其选中,然后开始输入搜索 / 替换表达式:%s/[PASTE YANKED PHRASE]//g ,然后开始工作。

如果您只想在 ex 模式下粘贴单个单词,可以在进入 ex 模式之前确保光标在其上,然后在 ex 模式下按<Cr><Cw>粘贴单词。

:inoremap  \d The current date <c-r>=system("date")<cr>
<c-r>=35+7<cr>

一个很酷的技巧是使用"1p粘贴上一个删除 / 更改(,然后使用.重复粘贴后续的删除。 "1p...换句话说, "1p...基本上等同于"1p"2p"3p"4p

您可以使用此命令对少数几行进行反向排序: dddddddddd"1p....

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
        Insert the contents of a numbered or named register.  Between
        typing CTRL-R and the second character '"' will be displayed
        <...snip...>
        Special registers:
            '"' the unnamed register, containing the text of
                the last delete or yank
            '%' the current file name
            '#' the alternate file name
            '*' the clipboard contents (X11: primary selection)
            '+' the clipboard contents
            '/' the last search pattern
            ':' the last command-line
            '-' the last small (less than a line) delete
            '.' the last inserted text
                            *c_CTRL-R_=*
            '=' the expression register: you are prompted to
                enter an expression (see |expression|)
                (doesn't work at the expression prompt; some
                things such as changing the buffer or current
                window are not allowed to avoid side effects)
                When the result is a |List| the items are used
                as lines.  They can have line breaks inside
                too.
                When the result is a Float it's automatically
                converted to a String.
        See |registers| about registers.  {not in Vi}
        <...snip...>
  • q5 将编辑内容记录到寄存器 5 中(下一个 q 停止记录)
  • :reg 显示所有寄存器及其中的任何内容
  • @ 5 执行寄存器 5 宏(记录的编辑)