在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。