我如何使用vim寄存器?

我只知道使用寄存器的一个实例是通过Ctrl R * ,从而粘贴剪贴板中的文本。

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

你所知道的关于VI寄存器的一切(让我们关注vi 7.2) – 与我们分享。

Vim中的寄存器让你可以对存储在其中的文本执行操作或命令。 要访问一个寄存器,可以在命令之前input"a ,其中a是寄存器的名称,如果要将当前行复制到寄存器k ,可以键入

“KYY

或者您可以使用大写字母追加到registry中

“KYY

然后,您可以在文档中移动并使用它将其粘贴到其他位置

“KP

从系统剪贴板粘贴到Linux上

“+ P

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

“* P

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

:REG

当我发现0寄存器时,我很高兴。 如果你将文本分配给一个特定的寄存器,那么它将被分配到0寄存器,并保存在默认的"寄存器”中0"寄存器之间的区别在于0只填充了被抽出的文本,而缺省寄存器也使用d / D / x / X / c / C / s / S命令填充文本。

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

  • y[motion]将要复制的文本抽出 – 将该文本保存在"0寄存器中
  • d[motion]删除要replace的文本 – 该文本保存在"注册”中
  • 粘贴被抽出的文本与"0p

其中"是为下一个命令使用寄存器的命令。

在最后一步,如果你要从默认的registry(使用p )粘贴,它会使用你刚删除的文本(可能不是你想要的)。

请注意, pP从默认寄存器中粘贴。 等号为""p (或""P ), "0为最后一个下拉"1为最后一个删除或更改。

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

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

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

 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字段末尾添加百分号(从第二行开始)。 我们将在(任意select的) m寄存器中创build一个简单的macros,如下所示:

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

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

  3. a :插入模式追加到本栏末尾。

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

  5. 回到命令模式。

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

  7. q :停止录制macros

我们现在只需键入@m就可以在当前行上运行这个macros。 此外,我们可以input@@重复,或100@m来做这个100次! 生活看起来不错。

在这一点上,你应该说:“ 但是等等,这是否需要用registry进行检查 ?”

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

 EEa%<ESC>j0 

起初,这看起来像是不小心在记事本中打开了一个二进制文件,但是第二眼就是我们macros中的确切序列!

你是一个好奇的人,所以让我们做一些有趣的事情,并编辑这行文本插入! 而不是枯燥的旧%

 EEa!<ESC>j0 

然后,我们通过键入B"nyE来将它放到n寄存器中,然后,只需要踢,就可以使用@n …在我们的数据行上运行nmacros

OMG,IT增加了!

实质上,运行一个macros就好像按下该macros的寄存器中的键的确切顺序。 如果这不是一个很酷的登记伎俩,我会吃我的帽子。

其他有用的寄存器

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

"/ – 最后的search命令

": – 最后的命令。

请注意,vimmacros可以编辑它们,因为它们只是录制macros时使用的击键列表。 所以你可以写一个文本文件的macros(使用"ap来写入macros”)并编辑它们,并将它们加载到"ay$的寄存器中。 存储有用的macros的好方法。

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

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

 noremap x "_x 

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

 vnoremap p "_dP 

如果您想要使用ex-mode命令粘贴寄存器的内容,请按<Cr><registerletter>

你为什么要用这个? 我想做一个search并replace一个很长的string,所以我select了它在可视化模式下,开始inputsearch/replaceexpression式:%s/[PASTE YANKED PHRASE]//g ,继续我的一天。

如果您只想在ex模式下粘贴一个单词,可以在进入ex模式之前确保光标在上面,然后在ex模式下按<Cr><Cw>粘贴该单词。

我认为秘密大师注册是expression式=注册。 它可以用于创意映射。

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

您可以像上面一样将它与您的系统一起使用,或者从自定义VimL函数等获得响应

或只是像特别的东西

 <cr>=35+7<cr> 

一个很酷的窍门就是用"1p粘贴最后一次删除/更改(然后用“ .来重复粘贴后续的删除。换句话说, "1p...基本上相当于"1p"2p"3p"4p

你可以用这个命令反转一些行: dddddddddd"1p....

  • q5将logging编辑到寄存器5中(接下来q停止logging)
  • :reg显示所有寄存器及其中的任何内容
  • @ 5执行注册5macros(录制编辑)

从vim的帮助页面:

 CTRL-R {0-9a-z"%#:-=.} *c_CTRL-R* *c_<CR>* 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...> 

我使用默认寄存器grep在我的vim窗口中的文本,而不必到达鼠标。

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

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

 echo @a echo @0 echo @+ 

在命令中设置它们:

 let @a = 'abc' 

现在"ap将粘贴abc

混淆的一个重要来源是默认寄存器" ,了解它的工作方式非常重要,如果大部分时间避免使用默认寄存器会好得多。

 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 (eg "xdd). This is like the unnamed register is pointing to the last used register. 

所以默认寄存器实际上是一个指向最后使用的寄存器的指针。 当你删除或者取消某些东西时,这个寄存器会指向其他寄存器。 您可以通过检查寄存器来testing。 总是有另外一个寄存器与默认寄存器完全相同:YANK寄存器( "0 ),第一个删除寄存器( "1 ),小删除寄存器( "- )或者其他被用来删除或者跳转的寄存器。

唯一的例外是黑洞登记册。 Vim doc说:

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

通常情况下,通过直接使用"0 "-"1-"9默认寄存器或指定寄存器,您的状况会好很多。

一个被忽视的登记是'。' 包含最后插入的文本的点寄存器,不pipe它是如何插入的,例如ct](改变直到)。 然后你意识到你需要将它插入到其他地方,但不能使用点重复方法。

  :reg . :%s/fred/<CR>./ 

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