1022

我只知道一个使用寄存器的实例是通过CtrlR*我从剪贴板粘贴文本。

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

你所知道的关于 VI 寄存器的一切(让我们关注 vi 7.2)——与我们分享。

4

17 回答 17

1311

Vim 中的寄存器允许您对其中存储的文本运行操作或命令。要访问寄存器,请"a在命令前键入,其中a是寄存器的名称。如果要将当前行复制到寄存器k中,可以键入

"kyy

或者您可以使用大写字母附加到寄存器

"Kyy

然后,您可以在文档中移动并将其粘贴到其他位置

"kp

在 Linux 上从系统剪贴板粘贴

"+p

从 Windows 上的系统剪贴板(或 Linux 上的“鼠标高亮”剪贴板)粘贴

"*p

访问所有当前定义的寄存器类型

:reg
于 2009-09-30T13:12:34.540 回答
850

当我发现0注册表时,我很高兴。如果您在没有将文本分配给特定寄存器的情况下抽出文本,那么它将被分配给该0寄存器,并保存在默认"寄存器中。0"寄存器之间的区别在于0它只填充了抽出的文本,而默认寄存器也填充了使用d/ D/ x/ X/ c/ C/ s/S命令删除的文本。

当我想复制一些文本、删除一些内容并用复制的文本替换它时,我发现这很有用。以下步骤说明了一个示例:

  • 拉出您要复制的文本y[motion]- 此文本已保存"0注册
  • 删除要替换的文本d[motion]- 此文本保存在"寄存器中
  • 粘贴抽出的文本"0p

"一个命令使用寄存器的命令在哪里。

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

请注意,pP从默认寄存器中粘贴。普通的等价物是""p(or ""P) 并"0保存最后一个 yank,"1保存最后一个删除或更改。

有关详细信息,请参阅:help registers

于 2009-10-01T14:42:07.643 回答
355

关于寄存器,我最喜欢的部分之一是将它们用作宏!

假设您正在处理一个制表符分隔的值文件,如下所示:

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

现在您决定需要在 %Dev 字段的末尾添加一个百分号(从第 2 行开始)。我们将在(任意选择的)m寄存器中创建一个简单的宏,如下所示:

  1. 按下:qm:开始录制m寄存器下的宏。

  2. EE: 转到第 3 列的末尾。

  3. a:插入模式以追加到此列的末尾。

  4. %:输入我们要添加的百分号。

  5. <ESC>: 回到命令模式。

  6. j0: 转到下一行的开头。

  7. q:停止录制宏

我们现在只需键入@m即可在当前行上运行此宏。此外,我们可以输入@@重复,或重复100@m此操作 100 次!生活看起来还不错。

此时你应该说,“但这与寄存器有什么关系?”

好点。m让我们通过键入来调查寄存器内容中的内容"mp。然后我们得到以下信息:

EEa%<ESC>j0

乍一看,这看起来像是您不小心在记事本中打开了一个二进制文件,但仔细一看,这就是我们宏中的确切字符序列!

你是一个好奇的人,所以让我们做一些有趣的事情,编辑这行文本插入 a!而不是枯燥的 old %

EEa!<ESC>j0

然后让我们n通过键入将其拉入寄存器B"nyE。然后,只是为了好玩,让我们使用...n在一行数据上运行宏。@n

它添加了一个!.

从本质上讲,运行宏就像按该宏寄存器中的确切按键顺序。如果这不是一个很酷的注册技巧,我会吃掉我的帽子。

于 2011-08-10T22:34:54.373 回答
108

其他有用的寄存器:

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

"/- 最后搜索命令

":- 最后一个命令行命令。

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

于 2009-09-30T15:15:25.290 回答
80

黑洞寄存器 _是寄存器中的/dev/null

我在我的 vimrc 中使用它来允许删除单个字符而不更新默认寄存器:

noremap x "_x

并以可视模式粘贴而不更新默认寄存器:

vnoremap p "_dP
于 2011-08-10T23:13:50.873 回答
61

如果您想将寄存器的内容粘贴到 ex-mode 命令中,请点击<C-r><registerletter>.

你为什么要用这个?我想对一个较长的字符串进行搜索和替换,所以我在可视模式下选择了它,开始输入搜索/替换表达式:%s/[PASTE YANKED PHRASE]//g并继续我的一天。

如果您只想在ex模式下粘贴单个单词,可以在进入ex模式之前确保光标在它上面,然后<C-r><C-w>在ex模式下点击粘贴单词。

为了更方便:

cnoremap <c-g> <c-r>"
cnoremap <C-Right> <c-r><c-w>
于 2011-08-10T21:32:14.777 回答
47

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

您可以使用它来对几行进行反向排序: dddddddddd"1p....

于 2012-04-11T07:00:38.220 回答
45

我认为秘密大师寄存器是表达式=寄存器。它可用于创意映射。

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

您可以将它与上述系统结合使用,或者从自定义 VimL 函数等获取响应。

或者只是临时的东西,比如

<c-r>=35+7<cr>
于 2009-10-01T04:25:27.297 回答
19

从 vim 的帮助页面:

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...>
于 2011-08-10T22:07:18.050 回答
18
  • q5 将编辑记录到寄存器 5 中(下一个 q 停止记录)
  • :reg 显示所有寄存器和其中的任何内容
  • @5 执行寄存器 5 宏(记录的编辑)
于 2009-09-30T13:17:12.730 回答
17

我使用默认寄存器在我的 vim 窗口中对文本进行 grep,而无需使用鼠标。

  1. 抽出文本
  2. :!grep "<CTRL-R>0"<CR>
于 2011-08-11T01:09:36.160 回答
15

在带有的命令中使用寄存器@。例如:

echo @a
echo @0
echo @+

在命令中设置它们:

let @a = 'abc'

现在"ap将粘贴abc.

于 2014-06-11T15:23:11.257 回答
10

一个被忽视的寄存器是“。” 点寄存器,它包含最后插入的文本,无论它是如何插入的,例如 ct](更改为 ])。然后您意识到您需要将其插入其他地方但不能使用点重复方法。

 :reg .
 :%s/fred/<C-R>./
于 2015-11-18T12:18:04.400 回答
9

我最喜欢的寄存器是':'寄存器。在正常模式下运行@:允许我重复之前运行的 ex 命令。

所以我们可以验证一些命令,:MY_commandXXXXX然后放入MY_commandXXXXXvimrc

于 2014-08-29T20:17:15.927 回答
8

混淆的一大来源是默认寄存器"。了解它的工作方式很重要。如果在大多数情况下避免使用默认寄存器会更好。Vim 文档中的解释:

Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g.  "xdd).  This is like the unnamed register is pointing
to the last used register.

所以默认寄存器实际上是一个指向最后使用的寄存器的指针。当您删除或拉动某些内容时,此寄存器将指向其他寄存器。您可以通过检查寄存器来测试它。总是有另一个寄存器与默认寄存器完全相同:yank 寄存器 ( "0) 、第一个删除寄存器 ( "1) 、小删除寄存器 ( "-) 或任何其他用于删除或 yank 的寄存器。

唯一的例外是黑洞寄存器。Vim 文档 说:

An exception is the '_' register: "_dd does not store the deleted text in any
register.

"0通常,直接使用:"-"1-"9默认寄存器或命名寄存器会更好。

于 2013-01-04T22:51:15.073 回答
5

我的朋友布赖恩就此写了一篇综合文章。我认为这是一个很好的介绍如何使用主题。https://www.brianstorti.com/vim-registers/

于 2018-08-07T13:52:10.543 回答
2

我最喜欢的功能是能够使用大写字母附加到寄存器中。例如,假设您要将导入的子集从缓冲区 X 移动到缓冲区 Y。

  1. 转到x1缓冲区 X中的行。
  2. 键入"ayy将 register 替换a为 line 的内容x1
  3. 去行x5
  4. 键入"Ayy (大写 A)x5以在 register 末尾附加行a
  5. 转到缓冲区 Y 并键入"ap要粘贴
<content of line x1>
<content of line x5>
于 2020-10-14T22:55:16.633 回答