在Vim中有没有把文本放入寄存器的方法?
可能重复:
任何方式删除VIM中没有覆盖你最后一个猛拉?
使用Vim我经常要用一个刚刚被抽出的块代替一块代码。
但是,当我删除要被replace的代码块时,该块本身进入删除我刚刚被抽出的块的寄存器。 所以我养成了插入,然后删除我不想要的东西的习惯,但是对于大块的代码来说,这会让插入的块和块单独被删除变得混乱。
那么在Vim中取代文本的最简单和最快捷的方法是什么?
- 有没有办法删除文本而不把它放入registry?
- 有没有办法说例如“replace下一个单词”或“replace到下一个段落”
- 或者是以某种方式使用多寄存器function的最佳方式?
要删除一些内容而不将其保存在寄存器中,可以使用“黑洞寄存器”:
"_d
当然,你也可以使用其他任何你不感兴趣的寄存器。
是的。 它比先删除“旧”文本略微更复杂,但是:
我以…开始
line1 line2 line3 line4 old1 old2 old3 old4
我移动 + vselect行1,行2,3和4,并用d命令删除它们
然后我以同样的方式删除旧的1-4行。
然后做
"2p
这将粘贴倒数第二个被抽的线(1-4行)。 "3p
会做第三个,等等..
所以我结束了
line1 line2 line3 line4
参考: 编号寄存器上的Vim文档
VIM文档: 编号寄存器0包含来自最近的yank命令的文本,除非该命令用[“x”指定了另一个寄存器。
例如,我们猛击“foo”并删除“bar” – registry0仍然包含“foo”! 因此“foo”可以用"0p
”来粘贴
有一个简单的映射,可以让你用缓冲区replace当前的select是方便的。
例如,当你把它放在你的.vimrc中
vmap r "_dP // it's a capital 'p' on the end
然后,在将某些东西拷贝到寄存器(即用“y”)之后,您可以select要replace的文本,只需在键盘上按“r”即可。 select将被您当前的注册替代。
说明:
vmap - mapping for visual mode "_d - delete current selection into "black hole register" P - paste
我把我的vimrc中的以下内容:
noremap y "*y noremap Y "*Y noremap p "*p noremap P "*P vnoremap y "*y vnoremap Y "*Y vnoremap p "*p vnoremap P "*P
现在我从剪贴板寄存器中取出并放入,不必关心默认寄存器会发生什么情况。 一个额外的好处是,我可以从其他应用程序以最小的麻烦粘贴。 我知道,我失去了一些function,但是我无法跟踪多个注册/剪贴板。
对于你给出的具体例子,如果我理解这个问题,那么这可能工作:
*Highlight what you want to put somewhere else *delete (d) *Highlight the code that you want it to replace *paste (p)
为了强调EBGreen所说的话 :
如果在select文本时进行粘贴,则所选文本将被replace为粘贴文本。
如果你想复制一些文本然后粘贴到多个位置,使用"0p
来粘贴,编号寄存器0包含最近一次的“yank”命令的文本。
另外,您可以列出所有寄存器的内容:
:registers
这个命令可以让你更容易地找出你想要的东西,比如dbr的回答 。 你还会看到/,%,#寄存器。 (另见:help registers
)
最后,检查cW
和cW
来改变一个词,包括和不包括尾随空格。 (使用大写W
包括标点符号。)
所有的删除和删除操作默认写入未命名的寄存器。 但是,最近的抽签和最近的删除总是(单独)存储在编号的寄存器中。 寄存器0
保存最近一次的抽签。 寄存器1-9
保存最近9次删除(其中1
是最近的删除)。
换句话说, 删除覆盖了未命名的寄存器中最近的一个YANK,但是它仍然存在于0
寄存器中。 在其他答案中提到的blackhole-register trick( "_dd
,因为它可以防止覆盖未命名的寄存器,但这不是必需的。
你用双引号引用一个寄存器,所以粘贴最近被抽出的文本可以这样做:
"0p
这是一个很好的参考:
对于“replace字”,请在正常模式下尝试使用cw
。
对于“replace段落”,请尝试使用正常模式。
如果你使用的是Vim,那么你将拥有可视化的模式,就像select,但是使用分离模式是vi / vim的基础。
你想要做的是使用视觉模式来select源,然后抽出,然后再次使用可视模式来select目的地的范围,然后粘贴到默认缓冲区的文本。
例:
在一个文本文件中:
1 | QWER 2 | ASDF 3 | ZXCV 4 | poiu
按照以下顺序: ggVjyGVkp
你将以下列结尾:
1 | QWER 2 | ASDF 3 | qewr 4 | ASDF
解释:
-
gg
:去第一行 -
V
:用整行开始视觉模式 -
j
:向下一行(在前面的行上开始select,将select向下一行) -
y
:跳到默认缓冲区(两个选定的行,它会自动从可视模式退出) -
G
:到最后一行 -
V
:启动可视模式(与以前相同) -
k
:上一行(和以前一样,启用视觉模式,这会增加一行的select) -
p
:粘贴(最后两行的select,它将用缓冲区中的任何内容replace那些行 – 在这种情况下是前两行)
这有一点不方便,把最后一块放在缓冲区中,所以它不知道重复粘贴同一个东西,所以你需要将源文件保存到一个名为"ay
的缓冲区“a”)并粘贴"ap
(但是如果你正在编程,你可能不想多次粘贴,而是创build一个函数并调用它,对吗?)。
如果你只使用vi,那么你必须使用隐形标记,而不是视觉模式, :he mark
在这个:he mark
更多,对不起,但我不是很好,这个隐形标记的事情,我很沾染视觉模式。
针对懒惰的微创解决scheme:
注册0
总是包含最后一个排名(如Rafael , alex2k8和idbrii已经提到)。 不幸的是,select寄存器0
始终是非常烦人的,所以如果p
默认使用"0
,那么将会很好,这可以通过在.vimrc
放入以下代码来实现:
noremap p "0p noremap P "0P for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] execute 'noremap "'.s:i.'p "'.s:i.'p' execute 'noremap "'.s:i.'P "'.s:i.'P' endfor
第一行将每个p
笔划映射到"0p
,但是这样可以防止p
访问任何其他寄存器,因此所有具有显式select的寄存器的p
笔划都映射到for循环中的等效命令行expression式,对于P
。
这样标准的行为就被保留了,除了隐式的p
和P
笔画,现在默认使用寄存器0
。
提示1: cut命令现在是"0d
而不是“ d
,但是因为我很懒,所以对我来说太长了,所以我使用下面的映射:
noremap <LEADER>d "0d noremap <LEADER>D "0D
领导键是默认的\
,所以你可以通过键入\d
或\D
来轻松地剪切文本。
提示2:多键映射的默认超时很短。 您可能想要增加它以在select一个寄存器时有更多的时间。 有关详细信息,请参阅:help timeoutlen
我正在使用:
set timeout timeoutlen=3000 ttimeoutlen=100
那么,先做这个命令:
:hd
然后你会意识到你可以删除一个特定的寄存器。 这样你就不会改变默认寄存器的内容。
文本被删除,而在插入模式下,不会进入默认寄存器。
我在正确的环境中使用的两种解决scheme是:
- 使用Vims
VISUAL
模式突出显示要replace的内容,然后粘贴寄存器。
我大部分都是习惯性地使用这个习惯,因为我很晚才find第二个解决scheme,例如
yiw " yank the whole word viwp " replace any word with the default register
- YankRing 。 使用这个插件,你可以使用键盘绑定
<ctrl>+<p>
来replace之前编号的寄存器和你刚刚粘贴的那个。
基本上你会去粘贴,但是当你意识到你已经覆盖了默认寄存器,从而失去了你想要粘贴的东西时,你可以从<CP>
Y>的历史中find并replace!
其中一个必须有插件…
在windows版本(也可能在Linux中),你可以使用"*y
(例如在双引号和星号之前的yank命令)插入系统的复制/粘贴缓冲区。
然后,您可以正常删除可replace的行,并使用"*p
粘贴复制的文本。
我经常犯下一个错误的命令,然后''然后''''进入一个黑洞然后'p'aste。我宁愿'y'ank,然后删除,但我喜欢,然后''0p'从0寄存器,这是最后复制的文本被推送到的地方。
我发现一个非常有用的映射为您的目的:
xnoremap p "_dP
删除的文本被放入“黑洞登记册”,并且被抽出的文本保留。
资料来源: http : //vim.wikia.com/wiki/Replace_a_word_with_yanked_text
对于德沃夏克用户来说,一个非常方便的方法就是将不需要的文本删除到“1”寄存器而不是“_黑洞寄存器”中,这是因为您只需按下“+ 1”上面的钥匙“在德沃夏克(另一方面,这使得整个命令快如地狱)。
那么当然,“1registry可以用于其他的东西,因为它是方便的,但除非你有一个比replace文本更普遍的目的,我会说这是一个很好的使用registry。