【发布时间】:2010-12-02 15:33:14
【问题描述】:
我只知道一个使用寄存器的实例是通过 CtrlR* 粘贴剪贴板中的文本。
寄存器的其他用途是什么?如何使用它们?
你所知道的关于 VI 寄存器的一切(让我们关注 vi 7.2)——与我们分享。
【问题讨论】:
-
关于寄存器的使用我给了一个很长的答案there
我只知道一个使用寄存器的实例是通过 CtrlR* 粘贴剪贴板中的文本。
寄存器的其他用途是什么?如何使用它们?
你所知道的关于 VI 寄存器的一切(让我们关注 vi 7.2)——与我们分享。
【问题讨论】:
Vim 中的寄存器可让您对其中存储的文本运行操作或命令。要访问寄存器,请在命令前键入"a,其中a 是寄存器的名称。如果要将当前行复制到寄存器k,可以输入
"kyy
或者您可以使用大写字母追加到寄存器中
"Kyy
然后您可以在文档中移动并将其粘贴到其他地方
"kp
在 Linux 上从系统剪贴板粘贴
"+p
在 Windows 上从系统剪贴板粘贴(或在 Linux 上从“鼠标高亮”剪贴板粘贴)
"*p
访问所有当前定义的寄存器类型
:reg
【讨论】:
"+是指系统剪贴板的特殊寄存器。
"* 访问剪贴板;所以复制到文件末尾的命令变为"*yG。
* 是“鼠标高亮”剪贴板,+ 是 Ctrl-XCV 剪贴板。
+)?
当我发现0 寄存器时,我很高兴。如果您在没有将文本分配给特定寄存器的情况下拉取文本,那么它将被分配给0 寄存器,并保存在默认的" 寄存器中。 0 和 " 寄存器之间的区别在于 0 仅填充了抽出的文本,而默认寄存器也填充了使用 d/D/x/X 删除的文本/c/C/s/S 命令。
当我想复制一些文本、删除一些内容并用复制的文本替换它时,我发现这很有用。以下步骤举例说明:
y[motion] 拉出要复制的文本 - 此文本保存在" 和0 寄存器中d[motion] 的文本 - 此文本保存在" 寄存器中"0p 粘贴被抽出的文本
其中" 是为下一个命令使用寄存器的命令。
在最后一步,如果您要从默认寄存器粘贴(使用p),它将使用您刚刚删除的文本(可能不是您想要的)。
请注意,p 或 P 从默认寄存器粘贴。普通的等价物是""p(或""P),"0 保存最后一个 yank,"1保存最后一个删除或更改。
欲了解更多信息,请参阅:help registers。
【讨论】:
p 或 P 从默认寄存器粘贴。普通的等价物是""p(或""P)。
" 是为下一个命令使用寄存器的命令。所以""p 将使用" 寄存器作为粘贴命令,"0p 将使用0 寄存器。
0p 意味着转到当前行的第一个字符并从默认寄存器 (") 的内容中粘贴。 "p 将是一个不完整的命令,因为您需要指定要使用寄存器 p 的命令。
关于寄存器我最喜欢的部分之一是将它们用作宏!
假设您正在处理一个制表符分隔的值文件:
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 字段的末尾添加一个百分号(从第 2 行开始)。我们将在(任意选择的)m 寄存器中创建一个简单的宏,如下所示:
按:qm:开始在m寄存器下录制宏。
EE:转到第 3 列的末尾。
a:插入模式以追加到此列的末尾。
%:输入我们要添加的百分号。
<ESC>: 回到命令模式。
j0: 转到下一行的开头。
q: 停止录制宏
我们现在只需键入@m 即可在当前行运行此宏。此外,我们可以输入@@ 重复,或输入100@m 重复100 次!生活看起来很美好。
此时您应该说,“但这与寄存器有什么关系?”
很好的观点。让我们通过键入"mp 来调查m 寄存器的内容。然后我们得到以下信息:
EEa%<ESC>j0
乍一看,这看起来像是您不小心在记事本中打开了一个二进制文件,但仔细一看,这就是我们宏中的确切字符序列!
你是一个好奇的人,所以让我们做一些有趣的事情,编辑这行文本插入一个!,而不是无聊的老%。
EEa!<ESC>j0
然后让我们通过键入B"nyE 将其拉入n 寄存器。然后,为了好玩,让我们使用@n....在我们的数据行上运行n 宏。
它添加了一个!。
本质上,运行宏就像按该宏寄存器中的确切键序列。如果这不是一个很酷的注册技巧,我会吃掉我的帽子。
【讨论】:
+ 代替j0 转到下一行的第一个非空白字符。
其他有用的寄存器:
"* 或"+ - 系统剪贴板的内容
"/ - 最后一个搜索命令
": - 最后一个命令行命令。
注意 vim 宏,您可以编辑它们,因为它们只是录制宏时使用的击键列表。因此,您可以将宏写入文本文件(使用"ap 编写宏a)并编辑它们,然后使用"ay$ 将它们加载到寄存器中。存储有用宏的好方法。
【讨论】:
vim --version - -clipboard 表示您没有它,@ 987654329@ 表示您愿意。
"* 和 "+ 更酷:"+ 粘贴使用 ctrl+c(复制缓冲区)复制的最后一个文本,或者您使用的任何快捷方式(或 right-click>copy )。 "* 粘贴最后一个用鼠标突出显示的文本(选择缓冲区)。因此,如果您使用ctrl+c 复制某些内容,然后用鼠标突出显示其他内容,您可以选择粘贴哪一个。这在 Windows 中不起作用,这两个寄存器是同义词。
"* 和"+!我以为只有 gvim 可以访问系统剪贴板,但显然普通 vim 也可以!
vim --version 上有-xterm_clipboard,如何启用。有什么简单的安装包吗? (debian/apt-get)。谢谢。
黑洞寄存器 _ 是寄存器中的/dev/null。
我在我的 vimrc 中使用它来允许删除单个字符而不更新默认寄存器:
noremap x "_x
并以可视模式粘贴而不更新默认寄存器:
vnoremap p "_dP
【讨论】:
x 的映射不太方便转置字符。
x 映射,您不能再使用 xp "命令" 将当前字符切换到下一个字符。对于错字修复非常有用。我们还有Xp 可以用前一个字符切换当前字符。
如果您想在 ex-mode 命令中粘贴寄存器的内容,请点击 <C-r><registerletter>。
你为什么要用这个?我想对一个较长的字符串进行搜索和替换,所以我在可视模式下选择了它,开始输入搜索/替换表达式 :%s/[PASTE YANKED PHRASE]//g 并继续我的一天。
如果你只想在ex模式下粘贴单个单词,可以在进入ex模式之前确保光标在它上面,然后在ex模式下点击<C-r><C-w>粘贴单词。
【讨论】:
: 命令行中粘贴文本是我今天学到的最好的东西
/[write out your regex]<cr> 编写查找/替换正则表达式,然后只替换s/<C-R>//replacement/。这样,您就可以在运行替换之前获得对正则表达式的实时反馈。
一个很酷的技巧是使用"1p粘贴最后一个删除/更改(,然后使用.重复粘贴后续删除。换句话说,"1p...基本上等同于"1p"2p"3p"4p。
您可以使用它来对几行进行倒序:
dddddddddd"1p....
【讨论】:
我认为秘密大师寄存器是表达式 = 寄存器。它可用于创意映射。
:inoremap \d The current date <c-r>=system("date")<cr>
您可以将它与上述系统结合使用,或从自定义 VimL 函数等获取响应。
或者只是临时的东西,比如
<c-r>=35+7<cr>
【讨论】:
来自 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...>
【讨论】:
【讨论】:
nmap <F2> @q 我使用寄存器 q,因为为了保存 F2 播放的宏,我只需点击 qq。快速的宏保存和回放。
我使用默认寄存器在我的 vim 窗口中对文本进行 grep,而无需使用鼠标。
:!grep "<CTRL-R>0"<CR>【讨论】:
在命令中使用寄存器与@。例如:
echo @a
echo @0
echo @+
在命令中设置它们:
let @a = 'abc'
现在"ap 将粘贴abc。
【讨论】:
一个被忽略的寄存器是'.'点寄存器,它包含最后插入的文本,无论它是如何插入的,例如 ct](更改为 ])。然后您意识到您需要将其插入其他地方但不能使用点重复方法。
:reg .
:%s/fred/<C-R>./
【讨论】:
". 寄存器来避免破坏插入似乎很有用。
我最喜欢的寄存器是':' 寄存器。在 Normal 模式下运行 @: 可以让我重复之前运行的 ex 命令。
【讨论】:
混淆的一大来源是默认寄存器"。了解它的工作方式很重要。如果在大多数情况下避免使用默认寄存器会更好。 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 文档说:
An exception is the '_' register: "_dd does not store the deleted text in any
register.
通常你最好直接使用:"0、"- 和"1-"9 默认寄存器或命名寄存器。
【讨论】:
我的朋友布赖恩就此写了一篇综合文章。我认为这是一个很好的介绍如何使用主题。 https://www.brianstorti.com/vim-registers/
【讨论】:
我最喜欢的功能是能够使用大写字母追加到寄存器中。例如,假设您要将导入的子集从缓冲区 X 移动到缓冲区 Y。
x1。"ayy 将寄存器a 替换为x1 行的内容。x5行。"Ayy (大写A)将x5行追加到寄存器a的末尾。"ap 进行粘贴<content of line x1>
<content of line x5>
【讨论】: