How do I use vim registers?
我只知道一个使用寄存器的实例是通过ctrlxkbdxkbdxkbdxkbd*,通过它我可以从剪贴板粘贴文本。
寄存器的其他用途是什么?如何使用它们?
关于vi寄存器的所有知识(让我们集中讨论vi 7.2)——与我们分享。
VIM中的寄存器允许您对其中存储的文本运行操作或命令。要访问寄存器,请在命令前键入
"kyy
也可以使用大写字母附加到寄存器
"kyy
然后,您可以移动文档并将其粘贴到其他位置,方法是使用
"kp
在Linux上从系统剪贴板粘贴
"+p
从Windows上的系统剪贴板粘贴(或从Linux上的"鼠标突出显示"剪贴板粘贴)
"*p
访问所有当前定义的寄存器类型
:reg
当我发现
当我想复制一些文本、删除一些内容并将其替换为复制的文本时,我发现这很有用。以下步骤举例说明:
- 将要与
y[motion] 一起复制的文本拉出来-此文本保存在" 和0 寄存器中 - 删除要替换为
d[motion] 的文本-此文本保存在" 寄存器中 - 用
"0p 粘贴扬起的文本
其中
在最后一步,如果要从默认寄存器粘贴(使用
注意,
有关更多信息,请参阅
关于寄存器,我最喜欢的部分之一是将它们用作宏!
假设您正在处理一个以制表符分隔的值文件,例如:
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行开始)添加一个百分号。我们将在(任意选择的)
按:
我们现在只需键入
这时你应该说,"等等,这跟寄存器有什么关系?"
非常好。让我们通过键入
1 | EEa%<ESC>j0 |
起初,这看起来像是您不小心在记事本中打开了一个二进制文件,但第二眼看到,它是宏中字符的确切序列!
你是个好奇的人,所以让我们做些有趣的事情,编辑这行文本,插入一个
1 | EEa!<ESC>j0 |
然后,我们通过键入
天哪,它加了一个
从本质上讲,运行宏就像在宏的寄存器中按键的确切顺序。如果这不是一个很酷的注册技巧,我会吃我的帽子。
其他有用的寄存器:
注意,对于VIM宏,您可以编辑它们,因为它们只是记录宏时使用的击键列表。因此,您可以将宏写入文本文件(使用
黑洞寄存器
我在vimrc中使用它来允许删除单个字符而不更新默认寄存器:
1 | noremap x"_x |
在不更新默认寄存器的情况下以可视模式粘贴:
1 | vnoremap p"_dP |
如果您想在ex-mode命令中粘贴寄存器的内容,请点击
你为什么要用这个?我想搜索并替换一个长字符串,所以我在视觉模式下选择了它,开始输入搜索/替换表达式
如果只想在ex模式下粘贴一个单词,可以在进入ex模式前确保光标在上面,然后在ex模式下点击
我认为神秘的大师寄存器是表达式=寄存器。它可以用于创造性映射。
1 | :inoremap \d The current date <c-r>=system("date")<cr> |
您可以像上面那样将它与您的系统结合使用,或者从自定义VIML函数等获得响应。
或者只是一些特别的东西
1 | <c-r>=35+7<cr> |
一个很酷的技巧是使用
您可以使用此命令对少数行进行反向排序:
从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处理文本,而不必使用鼠标。
使用
1 2 3 | echo @a echo @0 echo @+ |
将它们设置为命令:
1 | let @a = 'abc' |
现在,
造成混淆的一个主要原因是缺省寄存器
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. |
所以默认寄存器实际上是指向最后使用的寄存器的指针。当你删除或猛拉某个东西时,这个寄存器将指向其他寄存器。您可以通过检查寄存器来测试这一点。总是有另一个与默认寄存器完全相同的寄存器:扬克寄存器(
唯一的例外是黑洞寄存器。VIM博士说:
1 2 | An exception is the '_' register:"_dd does not store the deleted text in any register. |
通常情况下,直接使用
一个被忽略的寄存器是"."点寄存器,它包含最后插入的文本,不管它是如何插入的,例如ct](change until])。然后你意识到你需要把它插入其他地方,但是不能使用点重复方法。
1 2 | :reg . :%s/fred/<C-R>./ |
我最喜欢的寄存器是
我的朋友布莱恩写了一篇关于这个的综合文章。我认为这是一个很好的介绍如何使用主题。https://www.brianstorti.com/vim-寄存器/