我如何使用vim寄存器?

时间:2009-09-30 13:02:15

标签: vim vi

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

寄存器的其他用途是什么?怎么用?

关于VI寄存器的所有知识(让我们关注vi 7.2) - 与我们分享。

17 个答案:

答案 0 :(得分:1101)

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

  

“KYY

或者您可以使用大写字母

追加添加到注册表中
  

“KYY

然后,您可以浏览文档并使用

将其粘贴到其他位置
  

“KP

从Linux上的系统剪贴板粘贴

  

“+ P

从Windows上的系统剪贴板粘贴(或从Linux上的“鼠标突出显示”剪贴板粘贴)

  

“* P

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

  

:REG

答案 1 :(得分:736)

当我发现0注册时,我很高兴。如果您在不将文本分配给特定寄存器的情况下抽取文本,则会将其分配给0寄存器,并保存在默认的"寄存器中。 0"寄存器之间的区别在于0仅填充了被填充的文本,而默认寄存器也填充了使用d / {{1删除的文本} / D / x / X / c / C / s命令。

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

  • 使用S抓取您要复制的文字 - 此文字保存在y[motion]"个寄存器
  • 使用0删除要替换的文字 - 此文本保存在d[motion]注册
  • 使用"
  • 粘贴抽出的文字

其中"0p是使用寄存器执行下一个命令的命令。

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

请注意默认寄存器中的pp粘贴。等长的等价物为P(或""p),""P保留最后一次猛拉,"0保留最后一次删除或更改。

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

答案 2 :(得分:312)

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

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

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:停止录制宏

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

    此时你应该说,“但是等待,这对注册事项有什么作用?”

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

    EEa%<ESC>j0
    

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

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

    EEa!<ESC>j0
    

    然后通过输入n将其打入B"nyE寄存器。然后,只是为了踢,让我们使用n在我们的数据行上运行@n宏....

    OMG,IT增加了!

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

答案 3 :(得分:96)

其他有用的寄存器:

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

"/ - 上次搜索命令

": - 最后一个命令。

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

答案 4 :(得分:71)

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

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

noremap x "_x

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

vnoremap p "_dP

答案 5 :(得分:49)

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

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

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

答案 6 :(得分:42)

我认为秘密大师注册表达式是= register。它可用于创意映射。

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

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

或只是像

这样的特殊内容
<c-r>=35+7<cr>

答案 7 :(得分:35)

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

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

答案 8 :(得分:18)

从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...>

答案 9 :(得分:16)

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

答案 10 :(得分:14)

我使用默认寄存器来查看vim窗口中的文本,而无需使用鼠标。

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

答案 11 :(得分:12)

在命令中使用注册@。 E.g:

echo @a
echo @0
echo @+

在命令中设置它们:

let @a = 'abc'

现在"ap将粘贴abc

答案 12 :(得分: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),小删除寄存器("-)或任何用于删除或猛拉的其他注册表。

唯一的例外是黑洞注册。 Vim doc说:

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

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

答案 13 :(得分:6)

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

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

答案 14 :(得分:3)

我最喜欢的注册是':'注册。在正常模式下运行@:允许我重复先前运行的ex命令。

答案 15 :(得分:1)

我的朋友布莱恩(Brian)为此撰写了一篇综合文章。我认为这是如何使用主题的精彩介绍。 https://www.brianstorti.com/vim-registers/

答案 16 :(得分:0)

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

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