如何使用vim寄存器?


925

我只知道一个使用寄存器的实例是通过它CtrlR*从剪贴板粘贴文本的。

寄存器的其他用途是什么?如何使用它们?

您所了解的关于VI寄存器的所有信息(让我们关注vi 7.2)-与我们分享。


22
我在这里对寄存器的使用给出了很长的答案
Benoit

Answers:


1185

通过Vim中的寄存器,您可以对其中存储的文本运行操作或命令。要访问寄存器,请"a在命令前键入,a寄存器的名称为。如果要将当前行复制到register中k,可以键入

"kyy

或者,您可以使用大写字母追加到注册簿中

"Kyy

然后,您可以浏览文档并将其粘贴到其他位置

"kp

从Linux上的系统剪贴板粘贴

"+p

从Windows上的系统剪贴板(或Linux上的“鼠标突出显示”剪贴板)粘贴

"*p

要访问所有当前定义的寄存器类型

:reg

165
并且"+是引用系统剪贴板的特殊寄存器。
亚伦·麦克戴德

17
在Windows中,可以使用"*; 访问剪贴板。因此复制到文件末尾的命令变为"*yG
Aditya MP

44
在X(Linux,也可能是OS-X)中,*是“鼠标突出显示”剪贴板,并且+是Ctrl-XCV剪贴板。
dotancohen

20
有没有一种方法可以追加到剪贴板寄存器(因为没有大写+)?
naitsirhc

8
@dotancohen从技术上讲,它被称为“主要选择”,但我想人们更容易获得“ mouse higlight” :)
kyrias 2013年

783

当我发现0登记册时,我感到很高兴。如果在不将文本分配给特定寄存器的情况下提取文本,则该文本将被分配给该0寄存器,并保存在默认"寄存器中。的之间的差0"寄存器是0只填充有抽出的文本,而默认寄存器还与文本使用删填充d/ D/ x/ X/ c/ C/ s/ S命令。

当我想复制一些文本,删除某些内容并将其替换为复制的文本时,我觉得这很有用。以下步骤说明了一个示例:

  • 输入要复制的文本y[motion]-此文本已保存"0注册
  • 删除您要替换的文本d[motion]-此文本保存在"寄存器中
  • 将粘贴的文本粘贴到 "0p

"将寄存器用于下一个命令的命令在哪里。

在最后一步,如果要从默认寄存器(带有p)中进行粘贴,它将使用您刚删除的文本(可能不是您想要的文本)。

请注意,pP从默认寄存器粘贴。长期等效项将是""p(或""P),并"0保留最后一个字母,"1保留最后一个删除或更改。

有关更多信息,请参见:help registers


17
pP从默认寄存器粘贴。长期等效项将是""p(或""P)。
纳尔斯特罗姆,

186
顺便说一句,“ 0代表最后一次删除,” 1代表最后一次删除或更改。
FireAphis 2011年

6
"是用于下一个命令的寄存器的命令。因此,""p"寄存器用于粘贴命令,"0p并将使用0寄存器。
拉蒙·马可·纳瓦罗

5
0p这将意味着转到当前行的第一个字符,并从默认寄存器(")的内容中粘贴。"p这将是一个不完整的命令,因为您需要指定要使用该寄存器的命令p
拉蒙·马可·纳瓦罗

15
以同样的方式“ 1保留最后一个删除,” 2保留最后一个删除,“ 3保留最后一个删除,
James

330

关于寄存器的我最喜欢的部分之一是将它们用作宏!

假设您正在处理制表符分隔的值文件,如下所示:

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寄存器中创建一个简单的宏,如下所示:

  1. 按下::qm开始在m寄存器下录制宏。

  2. EE:转到第三列的末尾。

  3. a:插入模式以追加到此列的末尾。

  4. %:输入我们要添加的百分号。

  5. <ESC>:回到命令模式。

  6. j0:转到下一行的开头。

  7. q:停止录制宏

现在,我们可以键入@m以在当前行上运行此宏。此外,我们可以键入@@重复或100@m执行100次!生活看起来还不错。

在这一点上,您应该说:“ 但是,这与寄存器有什么关系?”

优点。让我们m通过键入来调查寄存器的内容"mp。然后,我们得到以下内容:

EEa%<ESC>j0

乍一看,这似乎是您在记事本中意外打开了一个二进制文件,但是乍一看,这是宏中字符的确切顺序!

您是个好奇的人,所以让我们做一些有趣的事情,并编辑此行文本以插入a !而不是无聊的old %

EEa!<ESC>j0

然后,n通过键入将其拉入寄存器B"nyE。然后,仅需踢一下,让n我们使用@n... 在一行数据上运行宏。

天哪,它添加了A !

本质上,运行宏就像在该宏的寄存器中按下确切的按键顺序一样。如果那不是很酷的注册技巧,我会吃掉我的帽子。


65
这完全是关键。直到现在我还没有注意到寄存器与宏缓冲区相同。这意味着您可以仅将所有宏存储在文本中,对其进行抽签并运行它们。很酷,有点怪异。非常Vim。
naught101

1
这是次要的编辑说明,但大写字母大写...可以解决。目前还很令人讨厌。
ashrasmun

1
您可以使用+而不是j0转到下一行的第一个非空白字符。
Gokul

100

其他有用的寄存器:

"*"+-系统剪贴板的内容

"/ -最后搜索命令

": -最后一条命令。

请注意,对于vim宏,您可以编辑它们,因为它们只是记录宏时使用的击键列表。因此,您可以将宏写入文本文件("ap用于编写宏a)并进行编辑,然后使用将它们加载到寄存器中"ay$。存储有用宏的好方法。


6
在OSX vim默认不包括“*整合您可以安装自制-ALT,做一个版本检查,。vim --version- -clipboard你没有它的意思,+clipboard意味着你做的。
泽维尔吉文

15
在X11,"*并且"+是更酷:"+粘贴复制与最后一个文本ctrl+c(复制缓冲区),或什么都快捷方式使用(或right-click>copy)。"*粘贴用鼠标突出显示的最后一个文本(选择缓冲区)。因此,如果您使用进行复制ctrl+c,然后用鼠标突出显示其他内容,则可以选择要粘贴的内容。在这两个寄存器是同义词的Windows中,这不起作用。
naught101 '04

1
祝福你,我一直在寻找"*"+多年了!我以为只有gvim可以访问系统剪贴板,但是显然常规的vim也是可以的!
塔拉施2012年

@Tarrasch如果您使用控制台vim而不是gvim,您会发现更多的东西。我认为。也可以在freenode上访问#vim!
trusktr 2013年

1
如何启用,如果一个人-xterm_clipboardvim --version。要安装任何简单的软件包吗?(debian / apt-get)。谢谢。
Beco博士

77

黑洞寄存器 _/dev/null寄存器。

我在vimrc中使用它来允许删除单个字符而不更新默认寄存器:

noremap x "_x

并以可视模式粘贴而不更新默认寄存器:

vnoremap p "_dP

第二个映射也非常有用。看到这里的解释:marcorucci.com/blog/#visualModePaste
mrucci 2011年

21
的映射x变得不太方便转置字符。
2011年

按下x并不会清除您最后拉过的内容,您将在寄存器0中找到它。按下xa几次,然后“ 0p粘贴您所拉过的内容
。– trusktr

2
为了扩展上面关于skeept的说明:使用此x映射,您不再可以执行xp“命令”来切换当前字符和下一个字符。对于拼写错误非常有用。我们还必须Xp将当前字符切换为前一个字符。
丹尼尔·安德森

56

如果要在ex-mode命令中粘贴寄存器的内容,请点击<C-r><registerletter>

你为什么要用这个?我想进行搜索并替换一个长字符串,因此我以可视模式选择了它,开始输入搜索/替换表达式,:%s/[PASTE YANKED PHRASE]//g然后开始了我的一天。

如果只想在ex模式下粘贴单个单词,可以在进入ex模式之前确保光标在其上,然后<C-r><C-w>在ex模式下单击以粘贴单词。


6
:命令行中粘贴文本是我今天学到的最好的东西
Shahbaz 2012年

1
您也可以在插入模式下使用<CR> <registerletter>
Floegipoky

1
我喜欢先用just编写查找/替换正则表达式/[write out your regex]<cr>,然后用just代替s/<C-R>//replacement/。这样,您可以在进行替换之前获得有关正则表达式的实时反馈的好处。
GabeIsman '17

44

我认为秘密大师寄存器是表达式=寄存器。它可以用于创意映射。

:inoremap  \d The current date <c-r>=system("date")<cr>

您可以将其与上述系统结合使用,或者从自定义VimL函数等获得响应。

或者只是临时的东西

<c-r>=35+7<cr>

3
查看Derek Wyatt的[使用表达式寄存器的视频](derekwyatt.org/vim/vim-tutorial-videos/…
Jeromy Anglim 2011年

1
@JeromyAnglim的链接现在在这里:derekwyatt.org/vim/tutorials/advanced/#expression-register
Djizeus

39

一个很酷的技巧是使用"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...>

17
  • q5将编辑记录到寄存器5中(下一个q停止记录)
  • :reg显示所有寄存器及其中的任何内容
  • @ 5执行寄存器5宏(记录的编辑)

15
我不喜欢使用@键来启动宏(三个按键)。因此,我已经映射了F2以启动存储在寄存器q中的宏:nmap <F2> @q 我使用寄存器q,因为要保存一个宏以供F2播放,我只需点击即可qq。快速的宏保存和重播。
Andrej Panjkov 2011年

16

我使用默认寄存器对vim窗口中的文本进行grep编码,而无需伸手去拿鼠标。

  1. 抽出文字
  2. :!grep "<CTRL-R>0"<CR>

12

在命令中使用带有的寄存器@。例如:

echo @a
echo @0
echo @+

在命令中设置它们:

let @a = 'abc'

现在"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.

因此,默认寄存器实际上是指向最后使用的寄存器的指针。当您删除或删除某些内容时,该寄存器将指向其他寄存器。您可以通过检查寄存器来测试。总是有另一个与默认寄存器完全相同的寄存器:yank寄存器("0),第一个删除寄存器("1),小型删除寄存器("-)或用于删除或粘贴的任何其他寄存器。

唯一的例外是黑洞寄存器。Vim doc说:

An exception is the '_' register: "_dd does not store the deleted text in any
register.

通常你是通过直接使用好得多:"0"-"1-"9默认的寄存器或命名寄存器。


8

一个被忽略的寄存器是“。” 点寄存器,无论最后插入的文本如何插入,都包含最后插入的文本,例如ct](更改为])。然后,您意识到您需要将其插入其他位置,但是不能使用点重复方法。

 :reg .
 :%s/fred/<C-R>./

7

我最喜欢的寄存器是':'寄存器。@:在正常模式下运行使我可以重复之前运行的ex命令。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.