How to paste yanked text into Vim command line?
我想把拉出来的文本粘贴到vim命令行中。有可能吗?
对。点击ctrl r,然后点击""。如果在所提取的内容中有文字控制字符,请使用ctrl r、ctrl o、""。好的。
下面是一个关于如何使用寄存器的解释。你能用寄存器做的事情是非同寻常的,一旦你知道如何使用它们,你就不能没有它们生活。好的。
寄存器基本上是字符串的存储位置。VIM有许多以不同方式工作的寄存器:好的。
0 (扬克寄存器:当您在正常模式下使用y 时,如果不指定寄存器,扬克文本会出现在那里,也会出现在默认寄存器中)。1 到9 (移位删除寄存器,当您使用c 或d 等命令时,删除的内容进入寄存器1,寄存器1中的内容进入寄存器2等。)" (默认寄存器,也称为未命名寄存器。这是"进入CtrL RABBBD,"的地方,a 到z 供您自己使用(a 到z 大写,用于附加到相应的寄存器)。_ (类似于/dev/null (unix)或NUL (windows),你可以写它,但它被丢弃了,当你读到它时,它总是空的)。- (小型删除寄存器)/ (搜索模式寄存器,使用/ 、? 、* 或# 等查找文本时更新,也可以写入该寄存器动态更改搜索模式)。: (通过Q 或: 存储最后一个viml类型的命令,只读),+ 和* (系统剪贴板寄存器,可以写入它们来设置剪贴板并从中读取剪贴板内容)
完整参考见
您可以随时使用
在插入或命令行模式下,ctrl r加上寄存器名,插入该寄存器的内容。如果您想从字面上插入它们(不自动缩进,不将控制字符(如
但您也可以执行以下操作(我可能忘记了寄存器的许多用法)。好的。
在正常模式下,点击":p。在vim中使用的最后一个命令被粘贴到缓冲区中。让我们分解:
" 是一个正常模式命令,允许您选择在下一次扬克、删除或粘贴操作中要使用的寄存器。所以":选择冒号寄存器(存储最后一个命令)。那么p是一个您已经知道的命令,它粘贴寄存器的内容。好的。参见
:help" 、:help quote_: 。好的。您正在编辑一个VIML文件(例如您的
.vimrc 文件),现在要执行几个连续的行:yxkbdxkbdxbbdxkbdxkbd:xkbd@"xkbdenterakbd"。这里,yjbbdjbbkbd将当前和下一行(这是因为j是一个线条运动,但这超出了这个答案的范围)拉入默认寄存器(也称为未命名寄存器)。然后,:@ ex命令将存储在寄存器中的ex命令作为参数播放,而" 是如何引用未命名寄存器的。另请参阅此答案的顶部,这是相关的。好的。不要将这里使用的
" (这是一个寄存器名)与前一个示例中的" (这是一个正常模式命令)混淆。好的。参见
:help :@ 和:help quote_quote 。好的。在插入模式下将最后一个搜索模式插入到文件中,或者在命令行中使用ctrl r、/。好的。
参见
:help quote_/ 、help i_CTRL-R 。好的。推论:保留您的搜索模式,但添加一个备选方案:
/ ctrl r,/\|alternative 。好的。在视觉模式下,你在一行的中间选择了两个单词,用
y 将它们拉出来,它们就在未命名的寄存器中。现在,你想用这两个词::pu ,在你所在位置的正下方打开一条新行。这是:put" 的简写。:put 命令和许多ex命令一样,只起到线条效果。好的。参见
:help :put 。好的。你也可以这样做:
:call setreg('"', @", 'V') ,然后p 。setreg 函数设置名为第一个参数的寄存器(作为字符串),用第二个参数的内容初始化它(可以使用名为@x 的寄存器作为变量,其中x 是viml中的寄存器名),并将其转换为int。o第三个参数中指定的模式,V 表示线条,不表示字符,文字^V 表示块。好的。参见
:help setreg() 。反向函数是getreg() 和getregtype() 。好的。如果你用
qa …q 录制了一个宏,那么:echo @a 会告诉你你键入了什么,@a 会重放这个宏(可能你知道这个宏,为了避免重复的任务很有用)。好的。参见
:help q 、help @ 。好的。上一个例子的推论是:如果剪贴板中有
8go ,那么@+ 将以宏的形式播放剪贴板内容,从而转到文件的第8个字节。实际上,这几乎适用于每个寄存器。如果您最后插入的字符串是插入模式中的dd ,那么@. 将(因为. 寄存器包含最后插入的字符串)删除一行。(VIM文件在这方面是错误的,因为它指出,寄存器# 、% 、: 和. 只适用于p 、p 、:put 和CtrL rabbd)。好的。参见
:help @ 。好的。不要混淆
:@ 和@ (从寄存器中播放vim命令的正常模式命令)。好的。值得注意的例外是
@: 。命令寄存器不包含初始冒号,也不包含最终回车。然而,在正常模式下,@: 将按您的期望执行,将寄存器解释为一个ex命令,而不是尝试在正常模式下播放。因此,如果您最后一个命令是:e ,那么寄存器包含e ,但@: 将重新加载文件,而不是转到单词结尾。好的。参见
:help @: 。好的。在运行它之前,显示您将在正常模式下执行的操作:
@='dd' enter。当你点击= 键时,vim就切换到表达式评估:当你输入一个表达式并点击enter时,vim计算它,结果作为寄存器内容。当然,寄存器= 是只读的,只有一次。每次开始使用它时,都必须输入新的表达式。好的。参见
:help quote_= 。好的。推论:如果您正在编辑一个命令,并且您意识到应该在命令行中插入当前缓冲区中的一些行:不要按esc!使用CtrL RABBBD
=getline(58) ENTRABBBD。之后,您将返回到命令行编辑,但它已经插入了第58行的内容。好的。手工定义搜索模式:
:let @/ = 'foo' 。好的。参见
:help :let 。好的。注意,这样做,您就不需要在模式中逃避
/ 。当然,你需要把所有的单引号都加倍。好的。复制以
foo 开头的所有行,然后将包含bar 的所有行复制到剪贴板,将这些命令链接到:qaq (重置其中存储空宏的寄存器)、:g/^foo/y A 、:g/bar/y A 、:let @+ = @a 。好的。使用大写寄存器名使寄存器以附加模式工作好的。
更好的办法是,如果
mswin.vim 没有重新映射Q ,用Q 启动ex模式,将那些实际上更好称为"ex命令"的"colon命令"链接起来,然后通过键入visual 回到正常模式。好的。参见
:help :g 、:help :y 、:help Q 。好的。双空间文件:
:g/^/put _ 。这会将黑洞寄存器的内容(读取时为空,但可写,行为类似于/dev/null 行)放在每行之后(因为每行都有一个开始!).好的。在每行前面加一行含有
foo ::g/^/-put ='foo' 。这是表达式寄存器的巧妙使用。这里,- 是.-1 的同义词(参见:help :range )。由于:put 将文本放在行后,您必须明确地告诉它按照前一行操作。好的。将整个缓冲区复制到系统剪贴板:
:%y+ 。好的。参见
:help :range (用于% 部分)和:help :y 。好的。如果错误记录了宏,可以键入
:let @a=' ctrl r=replace(@a,"'","''",'g') enter' ,然后编辑它。这将修改存储在寄存器a 中的宏的内容,这里显示了如何使用表达式寄存器来执行此操作。好的。如果你做了
dddd ,你可以做uu 来撤销。使用p ,您可以得到最后删除的行。但实际上,您也可以通过@9 使用寄存器@1 恢复最多9次删除。好的。更好的是,如果你在正常模式下使用
"1P ,那么. 将在正常模式下播放"2P ,依此类推。好的。参见
:help . 和:help quote_number 。好的。如果要在插入模式下插入当前日期:ctrl-rabkb
=strftime('%y%m%d') enter。好的。参见
:help strftime() 。好的。
又一次,什么会让人困惑:好的。
:@ 是一个命令行命令,它将寄存器的内容解释为vimscript并源于它正常模式下的
@ 命令,将寄存器的内容解释为正常模式击键(使用: 寄存器时除外,该寄存器包含最后播放的没有初始冒号的命令:在这种情况下,它会像重新键入冒号和最终返回键一样重播命令)。好的。" 在正常模式下的命令,帮助您选择一个寄存器进行扬克、粘贴、删除、更正等操作。好的。" 也是一个有效的寄存器名(默认或未命名的寄存器),因此可以作为期望寄存器名的命令的参数传递。
好啊。
对于粘贴系统剪贴板的内容,您只需使用shift-in。
它在Windows中工作,但我猜它在Linux中也工作得很好。
"我想将被提取的文本粘贴到VIM命令行中。"
虽然最热门的答案非常完整,但我更喜欢编辑命令历史记录。
在正常模式下,类型:
对于本文要求的确切内容,将一条被拉入的行(或任何被拉入的内容)粘贴到命令行中,拉入文本,然后:
要退出命令历史模式,则相反。在命令历史记录的正常模式下,键入:
要将系统剪贴板中的内容粘贴到VIM命令行("命令模式"),请使用ctrl+r,后跟+。对我来说,至少在Ubuntu上,shift+ins不工作。
PS:不知道为什么CtrL+rabbbd后接*,理论上与CtrL+rabbd后接+一样,似乎并不总是有效。我搜索并发现了+版本,它似乎总是有效,至少在我的盒子里是这样。
值得注意的是,扬克寄存器与宏缓冲区是相同的。换言之,您可以简单地在文档中写出整个命令(包括粘贴的代码片段),然后
这个问题已经很古老了,但既然它已经被看过很多次了,它似乎很流行——我会把它放在这里留给子孙后代。对于上下文,这个信息来自于开箱即用的LinuxMint中没有插件,没有使用默认选项的vimrcVim7.4行为。
您可以使用鼠标选择文本(或使用v或v并将所选内容放入"*寄存器"),然后使用shift-ctl-v将其粘贴到命令行中。
在命令行中键入ctl-r将导致提示输入寄存器名。所以键入:ctl-r*将把内容寄存器*放入命令行。它将粘贴任何寄存器,而不仅仅是"*"。请参阅:帮助c_ctrl-r。
此外,鼠标中键将粘贴到命令行中。有关x11如何处理选择的说明,请参见:帮助->Quote Plus。即使在一个普通的,outta-the-box-vim(同样,在linux-mint的vim 7.4中,无论如何),用鼠标左键所做的任何选择都可以用鼠标中键粘贴到命令行中。
此外,鼠标中键还可以将vim中选择的文本粘贴到许多其他x11应用程序中,甚至可以将GUI应用程序(如firefox、thunderbird)粘贴到命令行中,也可以将文本从其他应用程序中选择。
有关addl信息,请参见:帮助->x11选择。
DR
首先尝试:ctl-r方法,然后使用shift-ctl-v或鼠标中键(如果您需要其他东西)。
人们承认这可能会令人困惑。
OSX
如果您在MacOSX中使用VIM,不幸的是它附带了老版本的Verion,并且不符合剪贴板选项。幸运的是,自制啤酒可以很容易地解决这个问题。
安装VIM:
安装VIM的GUI版本:
重新启动终端以生效。
在
现在您可以使用
我也遇到了类似的问题。我希望所选文本以命令结尾,但不依赖于粘贴它。下面是我试图为以下对象编写映射的命令:
1 | :call VimuxRunCommand("python") |
此插件的文档仅使用字符串文字显示。如果试图选择包含双引号的文本,则以下内容将中断:
1 | vnoremap y:call VimuxRunCommand("<c-r>"")<cr> |
为了解决这个问题,您只需使用
1 | vnoremap y:call VimuxRunCommand(@")<cr> |
在中传递未命名寄存器的内容,并使用双引号和多行Edgecases。
使用
它曾经是中央7号。