我如何使用vim寄存器?

veh*_*zzz 893 vi vim

我只知道一个使用寄存器的实例是via CtrlR*,我从剪贴板粘贴文本.

寄存器的其他用途是什么?怎么用?

关于VI寄存器的所有知识(让我们关注vi 7.2) - 与我们分享.

FMo*_*da3 1138

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

"KYY

或者您可以使用大写字母附加到注册表中

"KYY

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

"KP

从Linux上的系统剪贴板粘贴

"+ P

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

"*P

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

:REG

  • 而``+`是一个特殊的寄存器,指的是系统剪贴板. (161认同)
  • 在X(Linux,可能还有OS-X)中,`*`是"鼠标高亮"剪贴板,而`+`是Ctrl-XCV剪贴板. (43认同)
  • 有没有办法附加到剪贴板寄存器(因为没有资本`+`)? (19认同)
  • 在Windows中,可以使用`"*`访问剪贴板;因此复制到文件末尾的命令变为"**yG`. (17认同)
  • @dotancohen技术上它被称为PRIMARY选择,但我猜"鼠标higlight"更容易让人们得到:) (6认同)
  • 在终端Vim(即非窗口环境)中,没有"剪贴板"或"复制/粘贴缓冲区".因此`+`寄存器(基本上)将始终为空(因为您无法从另一个应用程序/窗口/编辑器复制到另一个应用程序/窗口/编辑器).但是,可以将东西放在`+`缓冲区中.与`*`缓冲区相同.但是没有窗口环境,它们就没用了. (2认同)
  • @naitsirhc:我认为使用 `"` 命令没有任何方法可以做到这一点,但是您可以运行 `let @+ .= @"` 将未命名寄存器的内容附加到剪贴板寄存器。如果你把它映射到,比如说,`<Leader>+`,那么你可以做,例如,`yy<Leader>+` 将当前行附加到剪贴板寄存器。 (2认同)

nel*_*rom 753

当我发现0寄存器时,我很高兴.如果您在不将文本分配给特定寄存器的情况下抽取文本,则它将被分配给0寄存器,并保存在默认"寄存器中.的之间的差0"寄存器是0只填充有抽出的文本,而默认寄存器也填入文字中使用删除d/ D/ x/ X/ c/ C/ s/ S命令.

当我想复制一些文本,删除一些东西并用复制的文本替换它时,我觉得这很有用.以下步骤说明了一个示例:

  • 拉出要复制的文本y[motion]- 此文本保存在"0注册
  • 删除要替换的文本d[motion]- 此文本保存在"注册表中
  • 粘贴被拉动的文本 "0p

在哪里"使用寄存器来执行下一个命令.

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

请注意默认寄存器中的粘贴pP粘贴.手写的等价物将是""p(或""P)并"0保持最后一次猛拉,"1保持最后一次删除或更改.

有关详情,请参阅:help registers.

  • 顺便说一句,"0保持最后一次猛拉"的方式相同,1保持最后一次删除或更改. (182认同)
  • `p`或`P`来自默认寄存器.等长的等价物将是"""p"(或"""P"). (17认同)
  • 同样的方式"1保持最后删除",2保持第二个最后删除,"3保持第三个最后删除,等等到"9 (14认同)
  • ```是使用寄存器执行下一个命令的命令.所以``"p`将使用```寄存器用于paste命令,``0p`将使用`0`寄存器. (6认同)
  • `0p`意味着转到当前行的第一个字符并从默认寄存器(```)的内容粘贴.`"p`将是一个不完整的命令,因为你需要指定使用寄存器的命令` p`为. (5认同)
  • 如何粘贴默认寄存器? (2认同)

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

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

  2. EE:转到第3列的末尾.

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

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

  5. <ESC>:返回命令模式.

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

  7. 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.... 在我们的数据行上运行宏....

天哪,它加了一个 !

从本质上讲,运行宏就像按下宏的寄存器中的确切键序列.如果这不是一个很酷的注册技巧,我会吃掉我的帽子.

  • 这完全是关键.直到现在我才注意到寄存器与宏缓冲区相同.这意味着您可以将所有宏存储在文本中,将它们拉出来并运行它们.非常酷,有点奇怪.很Vim. (62认同)
  • 这太棒了。@naught101,一开始看起来很奇怪,但它允许你写出宏并编辑它,而无需在 Vim “录制”时正确执行它的压力。就像在运行之前编写代码,调试它,然后再次运行它直到正确为止。 (3认同)
  • 您可以使用“+”而不是“j0”来转到下一行的第一个非空白字符。 (2认同)

Ant*_*Roy 97

其他有用的寄存器

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

"/ - 最后一个搜索命令

": - 最后一个命令.

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

  • 在X11中,``*`和``+`甚至更酷:``+`粘贴用`ctrl + c`复制的最后一个文本(复制缓冲区),或者你使用的快捷方式(或`右键单击>复制`).````粘贴用鼠标突出显示的最后一个文本(选择缓冲区).因此,如果您使用`ctrl + c`复制某些内容,然后使用鼠标突出显示其他内容,则可以选择要粘贴的内容.这在Windows中不起作用,这两个寄存器是同义词. (14认同)
  • OSX上的默认vim不包括"*integration.你可以安装一个来自homebrew-alt的版本.检查`vim --version` - `-clipboard`意味着你没有它,`+ clipboard`意味着你做. (6认同)

mru*_*cci 74

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

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

noremap x "_x
Run Code Online (Sandbox Code Playgroud)

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

vnoremap p "_dP
Run Code Online (Sandbox Code Playgroud)

  • "x"的映射对于转置字符变得不太方便. (19认同)
  • 按 x 不会删除您最后提取的内容,您会发现它位于寄存器 0 中。按 xa 几次,然后按“0p 粘贴您提取的内容。 (2认同)
  • 要扩展上面的skeept的注释:使用这个`x`映射,你不能再使用`xp`"命令"来切换当前的下一个字符.对拼写错误修复非常有用.我们还有`Xp`来切换前一个字符的电流. (2认同)

ags*_*ala 52

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

你为什么要用这个?我想做一个搜索并替换一个长字符串,所以我在可视模式下选择它,开始输入搜索/替换表达式:%s/[PASTE YANKED PHRASE]//g并继续我的一天.

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

  • 在`:`命令行中粘贴文本是我今天学到的最好的东西 (5认同)
  • 我喜欢先用 `/[write out your regex]&lt;cr&gt;` 编写查找/替换正则表达式,然后只替换 `s/&lt;CR&gt;//replacement/`。这样,您就可以在运行替换之前获得有关正则表达式的实时反馈。 (3认同)
  • 您还可以在插入模式下使用 &lt;CR&gt;&lt;registerletter&gt; (2认同)

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)

  • 查看Derek Wyatt的[关于使用表达式寄存器的视频](http://www.derekwyatt.org/vim/vim-tutorial-videos/vim-advanced-tutorial-videos/#expression-register) (3认同)

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

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

  • 我不喜欢@key来启动宏(三次击键).所以我已经映射了F2来启动存储在寄存器q中的宏:`nmap <F2> @ q`我使用寄存器q,因为然后为了保存一个宏来播放F2,我只需要点击`qq`.快速宏保存和重播. (15认同)

Mat*_*ell 14

我使用默认寄存器来访问我的vim窗口中的文本,而无需使用鼠标.

  1. 猛拉文
  2. :!grep "<CTRL-R>0"<CR>


Cir*_*四事件 12

使用寄存器命令@.例如:

echo @a
echo @0
echo @+
Run Code Online (Sandbox Code Playgroud)

在命令中设置它们:

let @a = 'abc'
Run Code Online (Sandbox Code Playgroud)

现在"ap将粘贴abc.


siu*_*siu 9

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


小智 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默认的寄存器或命名寄存器.


zza*_*per 7

一个被忽视的注册表是'.' 包含最后插入文本的点寄存器,无论它是如何插入的,例如ct](改为直到]).然后你意识到你需要将其插入别处,但不能使用点重复方法.

 :reg .
 :%s/fred/<C-R>./
Run Code Online (Sandbox Code Playgroud)

  • 很好,我认为基于命令的编辑与实际键入的文本不同,这是很自然的,因此使用 `".` 寄存器来避免破坏插入似乎很有用。 (2认同)

Mad*_*mme 5

我的朋友布莱恩写了一篇关于这个的综合文章。我认为这是一个很好的介绍如何使用主题。https://www.brianstorti.com/vim-registers/