我只知道一个使用寄存器的实例是通过CtrlR*我从剪贴板粘贴文本。
寄存器的其他用途是什么?如何使用它们?
你所知道的关于 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
),它将使用您刚刚删除的文本(可能不是您想要的)。
请注意,p
或P
从默认寄存器中粘贴。普通的等价物是""p
(or ""P
) 并"0
保存最后一个 yank,"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
寄存器中创建一个简单的宏,如下所示:
按下:qm
:开始录制m
寄存器下的宏。
EE
: 转到第 3 列的末尾。
a
:插入模式以追加到此列的末尾。
%
:输入我们要添加的百分号。
<ESC>
: 回到命令模式。
j0
: 转到下一行的开头。
q
:停止录制宏
我们现在只需键入@m
即可在当前行上运行此宏。此外,我们可以输入@@
重复,或重复100@m
此操作 100 次!生活看起来还不错。
此时你应该说,“但这与寄存器有什么关系?”
好点。m
让我们通过键入来调查寄存器内容中的内容"mp
。然后我们得到以下信息:
EEa%<ESC>j0
乍一看,这看起来像是您不小心在记事本中打开了一个二进制文件,但仔细一看,这就是我们宏中的确切字符序列!
你是一个好奇的人,所以让我们做一些有趣的事情,编辑这行文本插入 a!
而不是枯燥的 old %
。
EEa!<ESC>j0
然后让我们n
通过键入将其拉入寄存器B"nyE
。然后,只是为了好玩,让我们使用...n
在一行数据上运行宏。@n
它添加了一个!
.
从本质上讲,运行宏就像按该宏寄存器中的确切按键顺序。如果这不是一个很酷的注册技巧,我会吃掉我的帽子。
其他有用的寄存器:
"*
或"+
- 系统剪贴板的内容
"/
- 最后搜索命令
":
- 最后一个命令行命令。
注意 vim 宏,您可以编辑它们,因为它们只是录制宏时使用的击键列表。"ap
因此,您可以将宏(用于编写宏a )写入文本文件并编辑它们,然后将它们加载到带有"ay$
. 存储有用宏的好方法。
黑洞寄存器 _
是寄存器中的/dev/null
。
我在我的 vimrc 中使用它来允许删除单个字符而不更新默认寄存器:
noremap x "_x
并以可视模式粘贴而不更新默认寄存器:
vnoremap p "_dP
如果您想将寄存器的内容粘贴到 ex-mode 命令中,请点击<C-r><registerletter>
.
你为什么要用这个?我想对一个较长的字符串进行搜索和替换,所以我在可视模式下选择了它,开始输入搜索/替换表达式:%s/[PASTE YANKED PHRASE]//g
并继续我的一天。
如果您只想在ex模式下粘贴单个单词,可以在进入ex模式之前确保光标在它上面,然后<C-r><C-w>
在ex模式下点击粘贴单词。
为了更方便:
cnoremap <c-g> <c-r>"
cnoremap <C-Right> <c-r><c-w>
一个很酷的技巧是使用"1p
粘贴最后一个删除/更改 (,然后.
重复使用 to 粘贴后续删除。换句话说,"1p...
基本上相当于"1p"2p"3p"4p
.
您可以使用它来对几行进行反向排序:
dddddddddd"1p....
我认为秘密大师寄存器是表达式=寄存器。它可用于创意映射。
:inoremap \d The current date <c-r>=system("date")<cr>
您可以将它与上述系统结合使用,或者从自定义 VimL 函数等获取响应。
或者只是临时的东西,比如
<c-r>=35+7<cr>
从 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 窗口中对文本进行 grep,而无需使用鼠标。
:!grep "<CTRL-R>0"<CR>
在带有的命令中使用寄存器@
。例如:
echo @a
echo @0
echo @+
在命令中设置它们:
let @a = 'abc'
现在"ap
将粘贴abc
.
一个被忽视的寄存器是“。” 点寄存器,它包含最后插入的文本,无论它是如何插入的,例如 ct](更改为 ])。然后您意识到您需要将其插入其他地方但不能使用点重复方法。
:reg .
:%s/fred/<C-R>./
我最喜欢的寄存器是':'
寄存器。在正常模式下运行@:
允许我重复之前运行的 ex 命令。
所以我们可以验证一些命令,:MY_commandXXXXX
然后放入MY_commandXXXXX
vimrc
混淆的一大来源是默认寄存器"
。了解它的工作方式很重要。如果在大多数情况下避免使用默认寄存器会更好。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。
x1
缓冲区 X中的行。"ayy
将 register 替换a
为 line 的内容x1
。x5
。"Ayy
(大写 A)x5
以在 register 末尾附加行a
。"ap
要粘贴<content of line x1>
<content of line x5>