Answers:
通过Vim中的寄存器,您可以对其中存储的文本运行操作或命令。要访问寄存器,请"a
在命令前键入,a
寄存器的名称为。如果要将当前行复制到register中k
,可以键入
"kyy
或者,您可以使用大写字母追加到注册簿中
"Kyy
然后,您可以浏览文档并将其粘贴到其他位置
"kp
从Linux上的系统剪贴板粘贴
"+p
从Windows上的系统剪贴板(或Linux上的“鼠标突出显示”剪贴板)粘贴
"*p
要访问所有当前定义的寄存器类型
:reg
"+
是引用系统剪贴板的特殊寄存器。
"*
; 访问剪贴板。因此复制到文件末尾的命令变为"*yG
。
*
是“鼠标突出显示”剪贴板,并且+
是Ctrl-XCV剪贴板。
+
)?
当我发现0
登记册时,我感到很高兴。如果在不将文本分配给特定寄存器的情况下提取文本,则该文本将被分配给该0
寄存器,并保存在默认"
寄存器中。的之间的差0
和"
寄存器是0
只填充有抽出的文本,而默认寄存器还与文本使用删填充d
/ D
/ x
/ X
/ c
/ C
/ s
/ S
命令。
当我想复制一些文本,删除某些内容并将其替换为复制的文本时,我觉得这很有用。以下步骤说明了一个示例:
y[motion]
-此文本已保存"
并0
注册d[motion]
-此文本保存在"
寄存器中"0p
"
将寄存器用于下一个命令的命令在哪里。
在最后一步,如果要从默认寄存器(带有p
)中进行粘贴,它将使用您刚删除的文本(可能不是您想要的文本)。
请注意,p
或P
从默认寄存器粘贴。长期等效项将是""p
(或""P
),并"0
保留最后一个字母,"1
保留最后一个删除或更改。
有关更多信息,请参见:help registers
。
p
或P
从默认寄存器粘贴。长期等效项将是""p
(或""P
)。
"
是用于下一个命令的寄存器的命令。因此,""p
将"
寄存器用于粘贴命令,"0p
并将使用0
寄存器。
0p
这将意味着转到当前行的第一个字符,并从默认寄存器("
)的内容中粘贴。"p
这将是一个不完整的命令,因为您需要指定要使用该寄存器的命令p
。
关于寄存器的我最喜欢的部分之一是将它们用作宏!
假设您正在处理制表符分隔的值文件,如下所示:
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次!生活看起来还不错。
在这一点上,您应该说:“ 但是,这与寄存器有什么关系?”
优点。让我们m
通过键入来调查寄存器的内容"mp
。然后,我们得到以下内容:
EEa%<ESC>j0
乍一看,这似乎是您在记事本中意外打开了一个二进制文件,但是乍一看,这是宏中字符的确切顺序!
您是个好奇的人,所以让我们做一些有趣的事情,并编辑此行文本以插入a !
而不是无聊的old %
。
EEa!<ESC>j0
然后,n
通过键入将其拉入寄存器B"nyE
。然后,仅需踢一下,让n
我们使用@n
... 在一行数据上运行宏。
天哪,它添加了A !
本质上,运行宏就像在该宏的寄存器中按下确切的按键顺序一样。如果那不是很酷的注册技巧,我会吃掉我的帽子。
+
而不是j0
转到下一行的第一个非空白字符。
其他有用的寄存器:
"*
或"+
-系统剪贴板的内容
"/
-最后搜索命令
":
-最后一条命令。
请注意,对于vim宏,您可以编辑它们,因为它们只是记录宏时使用的击键列表。因此,您可以将宏写入文本文件("ap
用于编写宏a)并进行编辑,然后使用将它们加载到寄存器中"ay$
。存储有用宏的好方法。
vim --version
- -clipboard
你没有它的意思,+clipboard
意味着你做的。
"*
并且"+
是更酷:"+
粘贴复制与最后一个文本ctrl+c
(复制缓冲区),或什么都快捷方式使用(或right-click>copy
)。"*
粘贴用鼠标突出显示的最后一个文本(选择缓冲区)。因此,如果您使用进行复制ctrl+c
,然后用鼠标突出显示其他内容,则可以选择要粘贴的内容。在这两个寄存器是同义词的Windows中,这不起作用。
"*
和"+
多年了!我以为只有gvim可以访问系统剪贴板,但是显然常规的vim也是可以的!
-xterm_clipboard
上vim --version
。要安装任何简单的软件包吗?(debian / apt-get)。谢谢。
该黑洞寄存器 _
是/dev/null
寄存器。
我在vimrc中使用它来允许删除单个字符而不更新默认寄存器:
noremap x "_x
并以可视模式粘贴而不更新默认寄存器:
vnoremap p "_dP
x
变得不太方便转置字符。
x
映射,您不再可以执行xp
“命令”来切换当前字符和下一个字符。对于拼写错误非常有用。我们还必须Xp
将当前字符切换为前一个字符。
如果要在ex-mode命令中粘贴寄存器的内容,请点击<C-r><registerletter>
。
你为什么要用这个?我想进行搜索并替换一个长字符串,因此我以可视模式选择了它,开始输入搜索/替换表达式,:%s/[PASTE YANKED PHRASE]//g
然后开始了我的一天。
如果只想在ex模式下粘贴单个单词,可以在进入ex模式之前确保光标在其上,然后<C-r><C-w>
在ex模式下单击以粘贴单词。
:
命令行中粘贴文本是我今天学到的最好的东西
/[write out your regex]<cr>
,然后用just代替s/<C-R>//replacement/
。这样,您可以在进行替换之前获得有关正则表达式的实时反馈的好处。
我认为秘密大师寄存器是表达式=寄存器。它可以用于创意映射。
: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...>
nmap <F2> @q
我使用寄存器q,因为要保存一个宏以供F2播放,我只需点击即可qq
。快速的宏保存和重播。
在命令中使用带有的寄存器@
。例如:
echo @a
echo @0
echo @+
在命令中设置它们:
let @a = 'abc'
现在"ap
将粘贴abc
。
默认寄存器是造成混乱的一个主要原因"
。知道其工作方式很重要。如果大多数时候都避免使用默认寄存器,那会更好。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
默认的寄存器或命名寄存器。
我的朋友布赖恩(Brian)为此撰写了一篇综合文章。我认为这是如何使用主题的精彩介绍。https://www.brianstorti.com/vim-registers/