繁体   English   中英

如何使用 vim 寄存器?

[英]How do I use vim registers?

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

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

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

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

"kyy

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

"Kyy

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

"kp

在 Linux 上从系统剪贴板粘贴

"+p

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

"*p

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

:reg

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

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

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

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 宏,您可以编辑它们,因为它们只是录制宏时使用的按键列表。 因此,您可以将宏写入文本文件(使用"ap写入宏a” )并对其进行编辑,然后将它们加载到带有"ay$的寄存器中。 存储有用宏的好方法。

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

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

noremap x "_x

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

vnoremap p "_dP

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

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

如果你在ex模式下只想粘贴一个单词,可以在进入ex模式前确定光标在上面,然后在ex模式下按<Cr><Cw>粘贴单词。

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

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

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

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

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

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

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

从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...>
  • q5 将编辑记录到寄存器 5(下一个 q 停止记录)
  • :reg 显示所有寄存器及其中的任何内容
  • @5 执行寄存器 5 宏(录制的编辑)

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

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

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

echo @a
echo @0
echo @+

在命令中设置它们:

let @a = 'abc'

现在"ap将粘贴abc

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

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

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

一个很大的混乱来源是默认寄存器" 。了解它的工作方式很重要。如果大多数时候避免使用默认寄存器会更好。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 ) 、小删除寄存器 ( "- ) 或任何其他用于删除或 yank 的寄存器.

唯一的例外是黑洞寄存器。 Vim 文档说:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM