我只知道一个使用寄存器的实例是via CtrlR*,我从剪贴板粘贴文本.
寄存器的其他用途是什么?怎么用?
关于VI寄存器的所有知识(让我们关注vi 7.2) - 与我们分享.
FMo*_*da3 1138
Vim中的寄存器允许您对存储在其中的文本运行操作或命令.要访问寄存器,请"a在命令前键入,其中a是寄存器的名称.如果要将当前行复制到寄存器中k,可以键入
"KYY
或者您可以使用大写字母附加到注册表中
"KYY
然后,您可以浏览文档并将其粘贴到其他位置
"KP
从Linux上的系统剪贴板粘贴
"+ P
从Windows上的系统剪贴板粘贴(或从Linux上的"鼠标突出显示"剪贴板粘贴)
"*P
访问所有当前定义的寄存器类型
:REG
nel*_*rom 753
当我发现0寄存器时,我很高兴.如果您在不将文本分配给特定寄存器的情况下抽取文本,则它将被分配给0寄存器,并保存在默认"寄存器中.的之间的差0和"寄存器是0只填充有抽出的文本,而默认寄存器也填入文字中使用删除d/ D/ x/ X/ c/ C/ s/ S命令.
当我想复制一些文本,删除一些东西并用复制的文本替换它时,我觉得这很有用.以下步骤说明了一个示例:
y[motion]- 此文本保存在"并0注册d[motion]- 此文本保存在"注册表中"0p在哪里"使用寄存器来执行下一个命令.
在最后一步,如果您要从默认寄存器(with p)粘贴,它将使用您刚刚删除的文本(可能不是您想要的).
请注意默认寄存器中的粘贴p或P粘贴.手写的等价物将是""p(或""P)并"0保持最后一次猛拉,"1保持最后一次删除或更改.
有关详情,请参阅:help registers.
Fra*_*sco 319
关于寄存器,我最喜欢的部分之一是将它们用作宏!
假设您正在处理制表符分隔的值文件:
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
Run Code Online (Sandbox Code Playgroud)
现在您决定需要在%Dev字段的末尾添加百分号(从第2行开始).我们将在(任意选择的)m寄存器中创建一个简单的宏,如下所示:
按:: qm开始在m寄存器下录制宏.
EE:转到第3列的末尾.
a:插入模式以附加到此列的末尾.
%:键入我们要添加的百分号.
<ESC>:返回命令模式.
j0:转到下一行的开头.
q:停止录制宏
我们现在只需键入@m即可在当前行上运行此宏.此外,我们可以输入@@重复,或者100@m这样做100次!生活看起来很不错.
在这一点上,你应该说," 但是,等待这些注册事项需要做什么?"
优点.让我们m通过输入来调查寄存器内容"mp.然后我们得到以下内容:
EEa%<ESC>j0
Run Code Online (Sandbox Code Playgroud)
起初,这看起来像你不小心在记事本中打开了一个二进制文件,但第二眼看,它是我们宏中的确切字符序列!
你是一个好奇的人,所以让我们做一些有趣的事情并编辑这一行文字来插入一个!而不是枯燥的旧文章%.
EEa!<ESC>j0
Run Code Online (Sandbox Code Playgroud)
然后让我们n通过输入将其打入寄存器B"nyE.然后,只是为了踢,让n我们使用@n.... 在我们的数据行上运行宏....
天哪,它加了一个 !
从本质上讲,运行宏就像按下宏的寄存器中的确切键序列.如果这不是一个很酷的注册技巧,我会吃掉我的帽子.
Ant*_*Roy 97
其他有用的寄存器
"*或"+- 系统剪贴板的内容
"/ - 最后一个搜索命令
": - 最后一个命令.
请注意vim宏,您可以编辑它们,因为它们只是录制宏时使用的击键列表.因此,您可以将宏写入文本文件("ap用于编写宏a)并编辑它们,然后将它们加载到寄存器中"ay$.存储有用宏的好方法.
mru*_*cci 74
该黑洞寄存器 _是/dev/null寄存器.
我在我的vimrc中使用它来允许删除单个字符而不更新默认寄存器:
noremap x "_x
Run Code Online (Sandbox Code Playgroud)
并以可视模式粘贴而不更新默认寄存器:
vnoremap p "_dP
Run Code Online (Sandbox Code Playgroud)
ags*_*ala 52
如果您想在ex-mode命令中粘贴寄存器的内容,请点击<C-r><registerletter>.
你为什么要用这个?我想做一个搜索并替换一个长字符串,所以我在可视模式下选择它,开始输入搜索/替换表达式:%s/[PASTE YANKED PHRASE]//g并继续我的一天.
如果您只想在ex模式下粘贴单个单词,可以在进入ex模式之前确保光标在其上,然后<C-r><C-w>在ex模式下单击以粘贴单词.
mic*_*ael 42
我认为秘密大师寄存器是表达式=寄存器.它可用于创意映射.
:inoremap \d The current date <c-r>=system("date")<cr>
Run Code Online (Sandbox Code Playgroud)
您可以将其与上述系统结合使用,或从自定义VimL功能等获取响应.
或者只是特别的东西
<c-r>=35+7<cr>
Run Code Online (Sandbox Code Playgroud)
nau*_*101 38
一个很酷的技巧是使用"1p粘贴最后一次删除/更改(然后.用来反复粘贴后续删除.换句话说,"1p...基本上相当于"1p"2p"3p"4p.
您可以使用它来反向排序少数几行:
dddddddddd"1p....
小智 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...>
Run Code Online (Sandbox Code Playgroud)
fpm*_*phy 16
Cir*_*四事件 12
使用寄存器命令用@.例如:
echo @a
echo @0
echo @+
Run Code Online (Sandbox Code Playgroud)
在命令中设置它们:
let @a = 'abc'
Run Code Online (Sandbox Code Playgroud)
现在"ap将粘贴abc.
小智 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.
Run Code Online (Sandbox Code Playgroud)
因此,默认寄存器实际上是指向最后使用的寄存器的指针.当您删除或抽出某个东西时,该寄存器将指向其他寄存器.您可以通过检查寄存器来测试它.总是有另一个寄存器与默认寄存器完全相同:yank寄存器("0),第一个删除寄存器("1),小删除寄存器("-)或用于删除或抽取的任何其他寄存器.
唯一的例外是黑洞登记.Vim doc说:
An exception is the '_' register: "_dd does not store the deleted text in any
register.
Run Code Online (Sandbox Code Playgroud)
通常你是通过直接使用好得多:"0,"-和"1-"9默认的寄存器或命名寄存器.
一个被忽视的注册表是'.' 包含最后插入文本的点寄存器,无论它是如何插入的,例如ct](改为直到]).然后你意识到你需要将其插入别处,但不能使用点重复方法.
:reg .
:%s/fred/<C-R>./
Run Code Online (Sandbox Code Playgroud)