关于vi:我如何使用vim寄存器?

How do I use vim registers?

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

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

关于vi寄存器的所有知识(让我们集中讨论vi 7.2)——与我们分享。


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

"kyy

也可以使用大写字母附加到寄存器

"kyy

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

"kp

在Linux上从系统剪贴板粘贴

"+p

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

"*p

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

:reg


当我发现0登记簿时,我很高兴。如果您在不将文本分配给特定寄存器的情况下猛拉文本,那么它将被分配给0寄存器,并保存在默认的"寄存器中。0"寄存器之间的区别在于,0只填充了斜接的文本,而默认寄存器也填充了使用ddxxccss命令删除的文本。

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

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

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

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

注意,pp从默认寄存器粘贴。相当于长线的是""p(或""p),"0持有最后一个扬克,"1持有最后一个删除或更改。

有关更多信息,请参阅:help registers


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

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

1
2
3
4
5
6
7
8
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寄存器中生成一个简单的宏,如下所示:

  • 按:qm:开始记录m寄存器下的宏。

  • EE:到第3栏的末尾。

  • a:插入方式追加到此列末尾。

  • %:键入要添加的百分号。

  • :回到命令模式。

  • j0转到下一行的开头。

  • q停止记录宏

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

    这时你应该说,"等等,这跟寄存器有什么关系?"

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

    1
    EEa%<ESC>j0

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

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

    1
    EEa!<ESC>j0

    然后,我们通过键入B"nyE把它放入n寄存器。然后,仅仅为了好玩,让我们使用@n在数据行上运行n宏……

    天哪,它加了一个!

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


    其他有用的寄存器:

    "*"+—系统剪贴板的内容。

    "/—上次搜索命令

    ":—最后一个命令。

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


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

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

    1
    noremap x"_x

    在不更新默认寄存器的情况下以可视模式粘贴:

    1
    vnoremap p"_dP


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

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

    如果只想在ex模式下粘贴一个单词,可以在进入ex模式前确保光标在上面,然后在ex模式下点击来粘贴该单词。


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

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

    您可以像上面那样将它与您的系统结合使用,或者从自定义VIML函数等获得响应。

    或者只是一些特别的东西

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


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

    您可以使用此命令对少数行进行反向排序:dddddddddd"1p....


    从VIM的帮助页面:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    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...>

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


    我在VIM窗口中使用默认的寄存器grep处理文本,而不必使用鼠标。

  • 歪文本
  • :!grep"0"

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

    1
    2
    3
    echo @a
    echo @0
    echo @+

    将它们设置为命令:

    1
    let @a = 'abc'

    现在,"ap将粘贴abc


    造成混淆的一个主要原因是缺省寄存器"。了解它的工作方式很重要。如果在大多数情况下避免使用默认寄存器,情况会好得多。VIM文档中的说明:

    1
    2
    3
    4
    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.

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

    唯一的例外是黑洞寄存器。VIM博士说:

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

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


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

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

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


    我的朋友布莱恩写了一篇关于这个的综合文章。我认为这是一个很好的介绍如何使用主题。https://www.brianstorti.com/vim-寄存器/