我如何使用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
)粘贴,它会使用你刚删除的文本(可能不是你想要的)。
请注意, p
或P
从默认寄存器中粘贴。 等号为""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,如下所示:
-
按:
qm
:在m
寄存器下开始录制macros。 -
EE
:转到第三栏的末尾。 -
a
:插入模式追加到本栏末尾。 -
%
:input我们要添加的百分号。 -
回到命令模式。
-
j0
:转到下一行的开始。 -
q
:停止录制macros
我们现在只需键入@m
就可以在当前行上运行这个macros。 此外,我们可以input@@
重复,或100@m
来做这个100次! 生活看起来不错。
在这一点上,你应该说:“ 但是等等,这是否需要用registry进行检查 ?”
优点。 让我们通过input"mp
调查m
寄存器的内容,然后我们得到以下结果:
EEa%<ESC>j0
起初,这看起来像是不小心在记事本中打开了一个二进制文件,但是第二眼就是我们macros中的确切序列!
你是一个好奇的人,所以让我们做一些有趣的事情,并编辑这行文本插入!
而不是枯燥的旧%
。
EEa!<ESC>j0
然后,我们通过键入B"nyE
来将它放到n
寄存器中,然后,只需要踢,就可以使用@n
…在我们的数据行上运行n
macros
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窗口中的文本,而不必到达鼠标。
- 猛拉文本
-
:!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命令。