vim粘贴 我如何使用vim寄存器?




vim粘贴 (12)

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

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

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


当我发现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


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

echo @a
echo @0
echo @+

将它们设置为命令:

let @a = 'abc'

现在"ap会粘贴abc


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

其他有用的寄存器

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

"/ - 最后的搜索命令

": - 最后的命令。

请注意,vim宏可以编辑它们,因为它们只是录制宏时使用的击键列表。 所以你可以写一个文本文件宏(使用"ap来写入宏”)并编辑它们,并将它们加载到一个带有"ay$的寄存器中。 存储有用宏的好方法。


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


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

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

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

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

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


混淆的一个主要来源是默认寄存器" ,了解它的工作方式非常重要,如果大多数情况下避免使用默认寄存器会更好一些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默认寄存器或指定的寄存器,您的状况会好得多。


我使用默认寄存器来grep我的vim窗口中的文本,而不必到达鼠标。

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

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

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

您可以像上面一样将它与您的系统一起使用,或者获得自定义VimL函数的响应等。

或者只是特别的东西

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

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

“KYY

或者您可以使用大写字母追加到注册表中

“KYY

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

“KP

从系统剪贴板粘贴到Linux上

“+ P

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

“* P

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

:REG


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




vi