如何使用vim寄存器?

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

登记册的其他用途是什么?如何使用它们?

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

319503 次浏览

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

"kyy

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

"Kyy

然后,您可以移动文档并将其粘贴到其他地方,使用

"kp

从系统剪贴板粘贴到Linux

"+p

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

"*p

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

:reg
  • q5记录编辑到寄存器5(下一个q停止记录)
  • : reg显示所有寄存器及其中的任何内容
  • @5执行寄存器5宏(记录编辑)

其他有用的寄存器:

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

"/-最后一个搜索命令

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

注意vim宏,您可以编辑它们,因为它们只是记录宏时使用的击键列表。因此,您可以将宏写入文本文件(使用"ap写入宏一个)并编辑它们,然后将它们加载到具有"ay$的寄存器中。存储有用宏的不错方法。

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

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

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

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

<c-r>=35+7<cr>

当我发现0寄存器时,我很高兴。如果您在不将文本分配给特定寄存器的情况下拉出文本,那么它将被分配给0寄存器,并保存在默认的"寄存器中。0"寄存器之间的区别在于0仅填充被拉出的文本,而默认寄存器也填充使用d/D/x/X/00/01/02/03命令删除的文本。

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

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

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

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

请注意,pP从默认寄存器粘贴。长写等效项为""p(或""P),"0保存最后一次yank,"1保存最后一次删除或更改。

有关更多信息,请参阅#0

如果您想在ex-mode命令中粘贴寄存器的内容,请按<C-r><registerletter>

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

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

为了使它更方便:

cnoremap <c-g> <c-r>"cnoremap <C-Right> <c-r><c-w>

从vim的帮助页面:

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*Insert the contents of a numbered or named register.  Betweentyping CTRL-R and the second character '"' will be displayed<...snip...>Special registers:'"' the unnamed register, containing the text ofthe 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 toenter an expression (see |expression|)(doesn't work at the expression prompt; somethings such as changing the buffer or currentwindow are not allowed to avoid side effects)When the result is a |List| the items are usedas lines.  They can have line breaks insidetoo.When the result is a Float it's automaticallyconverted to a String.See |registers| about registers.  {not in Vi}<...snip...>

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

假设您正在处理这样一个制表符分隔的值文件:

ID  Df  %Dev    Lambda1   0   0.000000    0.3136822   1   0.023113    0.3043323   1   0.044869    0.2952614   1   0.065347    0.2864605   1   0.084623    0.2779226   1   0.102767    0.2696387   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次!生活看起来很不错。

在这一点上,你应该说,“但这与注册有什么关系?”

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

EEa%<ESC>j0

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

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

EEa!<ESC>j0

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

它添加了一个!

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

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

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

noremap x "_x

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

vnoremap p "_dP

我使用默认寄存器在我的vim窗口中grep文本,而不必伸手拿鼠标。

  1. yank文本
  2. :!grep "<CTRL-R>0"<CR>

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

您可以使用它来颠倒一些行的顺序:dddddddddd"1p....

造成混淆的一大根源是默认寄存器"。了解它的工作方式很重要。如果大多数时候避免使用默认寄存器会更好。Vim留档的解释:

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

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

唯一的例外是黑洞寄存器。Vim医生说:

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

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

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

echo @aecho @0echo @+

将它们设置为命令:

let @a = 'abc'

现在"ap将粘贴abc

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

所以我们可以用:MY_commandXXXXX验证一些命令,然后把MY_commandXXXXX放在vimrc中

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

 :reg .:%s/fred/<C-R>./

我的朋友布赖恩就此写了一篇全面的文章。我认为这是一个很好的介绍如何使用主题。

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

  1. 转到缓冲区X中的第0行。
  2. 键入"ayy将寄存器a替换为第x1行的内容。
  3. 转到第x5行。
  4. 键入"Ayy(大写A)以在寄存器a的末尾附加行x5
  5. 转到缓冲区Y并键入"ap以粘贴
<content of line x1><content of line x5>