在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


最后,检查cWcW来改变一个词,包括和不包括尾随空格。 (使用大写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

这样标准的行为就被保留了,除了隐式的pP笔画,现在默认使用寄存器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。