我只知道使用寄存器的一个实例是通过CtrlR*,从中我从剪贴板粘贴文本。
寄存器的其他用途是什么?如何使用它们?
你所知道的关于VI寄存器的一切(让我们关注VI 7.2)——分享给我们。
我只知道使用寄存器的一个实例是通过CtrlR*,从中我从剪贴板粘贴文本。
寄存器的其他用途是什么?如何使用它们?
你所知道的关于VI寄存器的一切(让我们关注VI 7.2)——分享给我们。
Vim中的寄存器允许您对存储在其中的文本运行操作或命令。要访问寄存器,在命令前键入“a”,其中a是寄存器的名称。如果你想把当前的行复制到寄存器k中,你可以输入
"kyy
或者你也可以使用大写字母来添加到寄存器中
"Kyy
然后,您可以使用
"kp
从Linux上的系统剪贴板粘贴
"+p
从Windows上的系统剪贴板粘贴(或从Linux上的“鼠标突出显示”剪贴板粘贴)
"*p
访问当前定义的所有寄存器类型
:reg
其他有用的寄存器:
“*”或“+ -”系统剪贴板的内容
/ -最后一次搜索命令
:—最后一个命令行命令。
注意,对于vim宏,您可以编辑它们,因为它们只是记录宏时使用的击键列表。因此,您可以将宏写入文本文件(使用“ap”来编写宏a)并编辑它们,并使用“ay$”将它们加载到寄存器中。存储有用宏的好方法。
我认为秘密的大师寄存器是表达式= register。它可以用于创建映射。
:inoremap \d The current date <c-r>=system("date")<cr>
您可以将它与您的系统结合使用,或者从自定义VimL函数等获得响应。
或者只是一些特别的东西
<c-r>=35+7<cr>
当我发现0寄存器时,我很高兴。如果你不将文本分配给特定的寄存器,那么它将被分配给0寄存器,并被保存在默认的“寄存器”中。0寄存器和' '寄存器之间的区别是0只填充被删除的文本,而默认寄存器也填充使用d/ d/ x/ x/ c/ c/ s/ s命令删除的文本。
当我想复制一些文本,删除一些东西并用复制的文本替换它时,我发现这很有用。举例如下:
Yank你想要复制的文本与y[动议]-这个文本保存在“和0寄存器 删除你想用d[动议]替换的文本-此文本保存在“寄存器 用“0p .”粘贴被拉拽的文本
其中“是为下一个命令使用寄存器的命令。
在最后一步,如果您要从默认寄存器粘贴(使用p),它将使用您刚刚删除的文本(可能不是您想要的)。
注意p或p是从默认寄存器中粘贴的。传统的等效方法是""p(或""p)和"0保存最后一次yank, "1保存最后一次删除或更改。
有关更多信息,请参阅:帮助寄存器。
如果你想在ex-mode命令中粘贴寄存器的内容,点击<C-r><寄存器字母>。
你为什么要用这个?我想对一个较长的字符串进行搜索和替换,所以我在可视模式下选择了它,开始输入搜索/替换表达式:%s/[PASTE YANKED PHRASE]//g,然后继续我的一天。
如果你只想在ex模式下粘贴一个单词,可以在进入ex模式前确保光标在它上面,然后在ex模式下点击<C-r><C-w>来粘贴单词。
为了更方便:
cnoremap <c-g> <c-r>"
cnoremap <C-Right> <c-r><c-w>
来自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...>
关于寄存器,我最喜欢的部分之一是将它们用作宏!
假设你正在处理一个以制表符分隔的值文件:
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字段的末尾添加一个百分比符号(从第二行开始)。我们将在(任意选择的)m寄存器中创建一个简单的宏,如下所示:
按:qm:开始记录m寄存器下的宏。 EE:转到第三列的末尾。 a:插入模式,附加到该列的末尾。 %:输入要添加的百分号。 <ESC>:返回命令模式。 j0:转到下一行的开头。 q:停止录制宏
现在我们只需输入@m在当前行上运行这个宏。此外,我们可以输入@@来重复,或者输入100@m来重复100次!生活看起来还不错。
这时,您应该说:“但是这与寄存器有什么关系呢?”
优秀的点。让我们通过输入“mp”来研究m寄存器的内容。然后我们得到以下结果:
EEa%<ESC>j0
乍一看,这看起来像你不小心在记事本中打开了一个二进制文件,但乍一看,这是我们宏中的字符序列!
你是一个好奇的人,所以让我们做一些有趣的事情,编辑这一行文本插入一个!而不是无聊的老%。
EEa!<ESC>j0
然后让我们输入B"nyE "把它拉进n寄存器。然后,只是为了好玩,让我们使用@n....在数据行上运行n宏
它加了一个!
本质上,运行宏就像按下宏寄存器中精确的键序列。如果这不是一个很酷的收银机戏法,我就把帽子吃了。
黑洞寄存器_是寄存器中的/dev/null。
我在我的vimrc中使用它来允许删除单个字符而不更新默认寄存器:
noremap x "_x
并且在不更新默认寄存器的情况下以可视模式粘贴:
vnoremap p "_dP
一个很酷的技巧是使用“1p粘贴最后删除/更改(,然后使用。重复粘贴后续删除的内容。换句话说,“1p…基本上相当于"1p"2p"3p"4p。
你可以用它来倒序一些行: dddddddddd“1 p…
一个很大的混淆来源是默认寄存器”。了解它的工作方式是很重要的。如果在大多数情况下避免使用默认寄存器,情况会好得多。来自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默认寄存器或命名寄存器会更好。
我最喜欢的寄存器是':'寄存器。在正常模式下运行@:可以重复之前运行的ex命令。
所以我们可以用MY_commandXXXXX来验证一些命令,然后把MY_commandXXXXX放在vimrc中
一个被忽视的寄存器是'。'点寄存器,它包含最后插入的文本,无论它是如何插入的,例如ct](更改直到])。然后你意识到你需要将它插入到其他地方,但不能使用点重复方法。
:reg .
:%s/fred/<C-R>./
我的朋友布莱恩写了一篇关于这方面的全面文章。我认为这是一个很好的介绍如何使用主题。https://www.brianstorti.com/vim-registers/
我最喜欢的特性是能够使用大写字母追加到寄存器中。例如,假设您想要将导入的一个子集从缓冲区X移动到缓冲区Y。
到缓冲区X中的x1行。 输入“ayy”以将寄存器a替换为行x1的内容。 到第x5行。 输入“Ayy(大写A)以在寄存器A的末尾追加行x5。 转到缓冲区Y,输入“ap”进行粘贴
<content of line x1>
<content of line x5>