我只知道一个使用寄存器的实例是通过 Ctrl R * 从而粘贴剪贴板中的文本。
寄存器的其他用途是什么?怎么用?
关于VI寄存器的所有知识(让我们关注vi 7.2) - 与我们分享。
答案 0 :(得分:1101)
Vim中的注册允许您对存储在其中的文本运行操作或命令。要访问寄存器,请在命令前键入"a
,其中a
是寄存器的名称。如果要将当前行复制到寄存器k
,可以键入
“KYY
或者您可以使用大写字母
将追加添加到注册表中“KYY
然后,您可以浏览文档并使用
将其粘贴到其他位置“KP
从Linux上的系统剪贴板粘贴
“+ P
从Windows上的系统剪贴板粘贴(或从Linux上的“鼠标突出显示”剪贴板粘贴)
“* P
访问所有当前定义的寄存器类型
:REG
答案 1 :(得分:736)
当我发现0
注册时,我很高兴。如果您在不将文本分配给特定寄存器的情况下抽取文本,则会将其分配给0
寄存器,并保存在默认的"
寄存器中。 0
和"
寄存器之间的区别在于0
仅填充了被填充的文本,而默认寄存器也填充了使用d
/ {{1删除的文本} / D
/ x
/ X
/ c
/ C
/ s
命令。
当我想复制一些文本,删除某些内容并将其替换为复制的文本时,我觉得这很有用。以下步骤说明了一个示例:
S
抓取您要复制的文字 - 此文字保存在y[motion]
和"
个寄存器0
删除要替换的文字 - 此文本保存在d[motion]
注册"
其中"0p
是使用寄存器执行下一个命令的命令。
在最后一步,如果您要从默认寄存器(使用"
)粘贴,它将使用您刚刚删除的文本(可能不是您想要的)。
请注意默认寄存器中的p
或p
粘贴。等长的等价物为P
(或""p
),""P
保留最后一次猛拉,"0
保留最后一次删除或更改。
有关详细信息,请参阅:help registers
。
答案 2 :(得分:312)
我最喜欢的关于寄存器的部分是将它们用作宏!
假设您正在处理制表符分隔的值文件:
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
起初看起来你不小心在记事本中打开了一个二进制文件,但第二眼,这是我们宏中字符的确切顺序!
你是一个好奇的人,所以让我们做一些有趣的事情并编辑这一行文字以插入!
而不是无聊的旧%
。
EEa!<ESC>j0
然后通过输入n
将其打入B"nyE
寄存器。然后,只是为了踢,让我们使用n
在我们的数据行上运行@n
宏....
OMG,IT增加了!
基本上,运行宏就像按下宏的寄存器中的确切键序列。如果这不是一个很酷的注册技巧,我会吃掉我的帽子。
答案 3 :(得分:96)
其他有用的寄存器:
"*
或"+
- 系统剪贴板的内容
"/
- 上次搜索命令
":
- 最后一个命令。
请注意,对于vim宏,您可以编辑它们,因为它们只是录制宏时使用的击键列表。因此,您可以将宏写入文本文件(使用"ap
编写宏 a )并编辑它们,然后将它们加载到"ay$
的寄存器中。存储有用宏的好方法。
答案 4 :(得分:71)
黑洞寄存器 _
是寄存器的/dev/null
。
我在我的vimrc中使用它来允许删除单个字符而不更新默认寄存器:
noremap x "_x
并以可视模式粘贴而不更新默认寄存器:
vnoremap p "_dP
答案 5 :(得分:49)
如果您想在ex-mode命令中粘贴寄存器的内容,请点击<C-r><registerletter>
。
你为什么要用这个?我想搜索并替换一个长字符串,所以我在可视模式下选择它,开始输入搜索/替换表达式:%s/[PASTE YANKED PHRASE]//g
并继续我的一天。
如果您只想在ex模式下粘贴单个单词,可以在进入ex模式之前确保光标在其上,然后在ex模式下点击<C-r><C-w>
以粘贴单词。
答案 6 :(得分:42)
我认为秘密大师注册表达式是= register。它可用于创意映射。
:inoremap \d The current date <c-r>=system("date")<cr>
您可以将其与上述系统结合使用,或从自定义VimL功能等获取响应。
或只是像
这样的特殊内容<c-r>=35+7<cr>
答案 7 :(得分:35)
一个很酷的技巧是使用"1p
粘贴上次删除/更改(然后使用.
重复粘贴后续删除。换句话说,"1p...
基本上是相当于"1p"2p"3p"4p
。
您可以使用它来反向排序少数几行:
dddddddddd"1p....
答案 8 :(得分:18)
从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...>
答案 9 :(得分:16)
答案 10 :(得分:14)
我使用默认寄存器来查看vim窗口中的文本,而无需使用鼠标。
:!grep "<CTRL-R>0"<CR>
答案 11 :(得分:12)
在命令中使用注册和@
。 E.g:
echo @a
echo @0
echo @+
在命令中设置它们:
let @a = 'abc'
现在"ap
将粘贴abc
。
答案 12 :(得分:8)
混淆的一个重要原因是默认寄存器"
。知道它的工作方式很重要。如果大多数时候都避免使用默认寄存器,那就更好了。 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
默认寄存器或命名寄存器。
答案 13 :(得分:6)
一个被忽视的注册表是&#39;。&#39;包含最后插入文本的点寄存器,无论它是如何插入的,例如ct](改为直到])。然后你意识到你需要将它插入其他地方,但不能使用点重复方法。
:reg .
:%s/fred/<C-R>./
答案 14 :(得分:3)
我最喜欢的注册是':'
注册。在正常模式下运行@:
允许我重复先前运行的ex命令。
答案 15 :(得分:1)
我的朋友布莱恩(Brian)为此撰写了一篇综合文章。我认为这是如何使用主题的精彩介绍。 https://www.brianstorti.com/vim-registers/
答案 16 :(得分:0)
我最喜欢的功能是能够使用大写字母附加到寄存器中。例如,假设您要将一部分导入从缓冲区X移到缓冲区Y。
x1
行。"ayy
,用行a
的内容替换寄存器x1
。x5
行。"Ayy
(大写A),将x5
行添加到寄存器a
的末尾。"ap
进行粘贴<content of line x1>
<content of line x5>