【问题标题】:How do I use vim registers?如何使用 vim 寄存器?
【发布时间】:2010-12-02 15:33:14
【问题描述】:

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

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

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

【问题讨论】:

  • 关于寄存器的使用我给了一个很长的答案there

标签: vim vi


【解决方案1】:

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

"kyy

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

"Kyy

然后您可以在文档中移动并将其粘贴到其他地方

"kp

在 Linux 上从系统剪贴板粘贴

"+p

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

"*p

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

:reg

【讨论】:

  • "+是指系统剪贴板的特殊寄存器。
  • 在 Windows 中,可以使用"* 访问剪贴板;所以复制到文件末尾的命令变为"*yG
  • 在 X(Linux,也可能是 OS-X)中,* 是“鼠标高亮”剪贴板,+ 是 Ctrl-XCV 剪贴板。
  • 有没有办法追加到剪贴板寄存器(因为没有大写+)?
  • @dotancohen 从技术上讲,它被称为 PRIMARY selection,但我猜“mouse higlight”对人们来说更容易获得:)
【解决方案2】:

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

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

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

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

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

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

欲了解更多信息,请参阅:help registers

【讨论】:

  • pP 从默认寄存器粘贴。普通的等价物是""p(或""P)。
  • 顺便说一句,同样的方式,“0 代表最后一次 yank,”1 代表最后一次删除或更改。
  • " 是为下一个命令使用寄存器的命令。所以""p 将使用" 寄存器作为粘贴命令,"0p 将使用0 寄存器。
  • 0p 意味着转到当前行的第一个字符并从默认寄存器 (") 的内容中粘贴。 "p 将是一个不完整的命令,因为您需要指定要使用寄存器 p 的命令。
  • 同理,“1 保存最后一个删除,”2 保存倒数第二个删除,“3 保存倒数第三个,以此类推,直到“9”
【解决方案3】:

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

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

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 次!生活看起来很美好。

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

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

EEa%<ESC>j0

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

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

EEa!<ESC>j0

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

它添加了一个!

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

【讨论】:

  • 这很关键。直到现在我才注意到寄存器与宏缓冲区相同。这意味着您可以将所有宏存储在文本中,拉取它们并运行它们。很酷,也有点奇怪。非常 Vim。
  • 您可以使用+ 代替j0 转到下一行的第一个非空白字符。
  • 这太棒了。 @naught101,一开始看起来很奇怪,但它允许你写出你的宏并编辑它,而无需在 Vim 正在“录制”时做正确的压力。就像在运行之前编写代码,调试它,然后再次运行它直到它正确为止。
【解决方案4】:

其他有用的寄存器:

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

"/ - 最后一个搜索命令

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

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

【讨论】:

  • OSX 上的默认 vim 不包括 "* 集成。您可以从 homebrew-alt 安装一个版本。检查 vim --version - -clipboard 表示您没有它,@ 987654329@ 表示您愿意。
  • 在 X11 中,"*"+ 更酷:"+ 粘贴使用 ctrl+c(复制缓冲区)复制的最后一个文本,或者您使用的任何快捷方式(或 right-click&gt;copy )。 "* 粘贴最后一个用鼠标突出显示的文本(选择缓冲区)。因此,如果您使用ctrl+c 复制某些内容,然后用鼠标突出显示其他内容,您可以选择粘贴哪一个。这在 Windows 中不起作用,这两个寄存器是同义词。
  • 祝福你,我多年来一直在寻找"*"+!我以为只有 gvim 可以访问系统剪贴板,但显然普通 vim 也可以!
  • @Tarrasch 如果你使用控制台 vim 而不是 gvim,你会发现更多的东西。我想。也访问 freenode 上的 #vim!
  • 如果在vim --version 上有-xterm_clipboard,如何启用。有什么简单的安装包吗? (debian/apt-get)。谢谢。
【解决方案5】:

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

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

noremap x "_x

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

vnoremap p "_dP

【讨论】:

  • 第二个映射也很有用。解释见这里:marcorucci.com/blog/#visualModePaste
  • x 的映射不太方便转置字符。
  • 按 x 不会删除您拉出的最后一个内容,您会发现它在寄存器 0 中。按 x 几次,然后按“0p 粘贴您拉出的内容。
  • 扩展上述 skeept 的评论:使用此 x 映射,您不能再使用 xp "命令" 将当前字符切换到下一个字符。对于错字修复非常有用。我们还有Xp 可以用前一个字符切换当前字符。
【解决方案6】:

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

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

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

【讨论】:

  • : 命令行中粘贴文本是我今天学到的最好的东西
  • 你也可以在插入模式下使用
  • 我喜欢先用/[write out your regex]&lt;cr&gt; 编写查找/替换正则表达式,然后只替换s/&lt;C-R&gt;//replacement/。这样,您就可以在运行替换之前获得对正则表达式的实时反馈。
【解决方案7】:

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

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

【讨论】:

  • 啊哈,这太棒了。我真正想要的是 yanks 的相同行为
【解决方案8】:

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

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

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

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

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

【讨论】:

【解决方案9】:

来自 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...>

【讨论】:

    【解决方案10】:
    • q5 将编辑记录到寄存器 5(下一个 q 停止记录)
    • :reg 显示所有寄存器和其中的任何内容
    • @5 执行寄存器 5 宏(记录编辑)

    【讨论】:

    • 我不喜欢 @ 键来启动宏(三个按键)。所以我已经映射 F2 来启动存储在寄存器 q 中的宏:nmap &lt;F2&gt; @q 我使用寄存器 q,因为为了保存 F2 播放的宏,我只需点击 qq。快速的宏保存和回放。
    【解决方案11】:

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

    1. 复制文本
    2. :!grep "&lt;CTRL-R&gt;0"&lt;CR&gt;

    【讨论】:

      【解决方案12】:

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

      echo @a
      echo @0
      echo @+
      

      在命令中设置它们:

      let @a = 'abc'
      

      现在"ap 将粘贴abc

      【讨论】:

        【解决方案13】:

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

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

        【讨论】:

        • 很好,我认为基于命令的编辑与实际输入的文本不同是很自然的,因此使用". 寄存器来避免破坏插入似乎很有用。
        【解决方案14】:

        我最喜欢的寄存器是':' 寄存器。在 Normal 模式下运行 @: 可以让我重复之前运行的 ex 命令。

        【讨论】:

          【解决方案15】:

          混淆的一大来源是默认寄存器"。了解它的工作方式很重要。如果在大多数情况下避免使用默认寄存器会更好。 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 文档说:

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

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

          【讨论】:

            【解决方案16】:

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

            【讨论】:

              【解决方案17】:

              我最喜欢的功能是能够使用大写字母追加到寄存器中。例如,假设您要将导入的子集从缓冲区 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>
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-03-29
                • 2021-03-09
                • 2013-10-26
                • 2012-07-17
                • 2011-01-25
                • 2020-10-03
                • 2010-12-10
                • 2023-03-07
                相关资源
                最近更新 更多