如何将Yanked文本粘贴到Vim命令行中

我想将拉出的文本粘贴到Vim的命令行中。有可能吗?

154096 次浏览

是的。点击Ctrl-R,然后点击。如果您有文字控制字符,请使用Ctrl-RCtrl-O

下面是对寄存器能做什么的解释。你能用寄存器做什么是非凡的,一旦你知道如何使用它们,你就离不开它们。

寄存器基本上是字符串的存储位置。Vim有许多以不同方式工作的寄存器:

  • 0(yank寄存器:当您在正常模式下使用y时,在不指定寄存器的情况下,yank文本会进入那里并进入默认寄存器),
  • 19(移位删除寄存器,当您使用cd等命令时,已删除的内容转到寄存器1,寄存器1中的内容转到寄存器2,),
  • "(默认寄存器,也称为未命名寄存器。这是Ctrl-R中的位置),
  • az供您自己使用(大写的AZ用于附加到相应的寄存器)。
  • _(类似于/dev/null(Unix)或NUL(Windows),您可以写入它,但它会被丢弃,当您从中读取时,它总是空的),
  • -(小型删除寄存器),
  • /(搜索模式寄存器,例如在查找带有/?*#的文本时更新;您也可以写入它以动态更改搜索模式),
  • :(通过Q:存储最后一个VimL键入的命令,只读),
  • +*(系统剪贴板寄存器,您可以写入它们来设置剪贴板并从中读取剪贴板内容)

有关完整参考,请参阅:help registers

您可以随时使用:registers显示所有寄存器的内容。此命令的同义词和简写是:display:reg:di

在插入或命令行模式下,Ctrl-R加上一个寄存器名称,插入此寄存器的内容。如果您想按字面意思插入它们(不自动缩进,不转换控制字符,如0x08到退格等),您可以使用Ctrl-RCtrl-O,寄存器名称。 有关更多参考,请参阅:help i_CTRL-R和以下段落。

但您也可以执行以下操作(我可能忘记了寄存器的许多用途)。

  • 在正常模式下,点击:p。您在vim中使用的最后一个命令将粘贴到您的缓冲区中。
    让我们分解一下:"是一个正常模式命令,允许您选择下一次yank、删除或粘贴操作要使用的寄存器。所以:选择冒号寄存器(存储最后一个命令)。然后p是一个你已经知道的命令,它粘贴寄存器的内容。

    参见:help ":help quote_:

  • 您正在编辑一个VimL文件(例如您的.vimrc),现在想执行几个连续的行:yj:@输入
    在这里,yj将当前行和下一行(这是因为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')然后psetreg函数设置名称作为第一个参数(作为字符串)的寄存器,使用第二个参数的内容初始化它(您可以将寄存器用作名称为@x的变量,其中x是VimL中的寄存器名称),并将其转换为第三个参数中指定的模式,V用于线性,没有用于字符,文字^V用于块。

    参考。:help setreg()。反向函数是getreg()getregtype()

  • 如果你用qaq记录了一个宏,那么:echo @a会告诉你你键入了什么,@a会重播宏(可能你知道那个,为了避免重复任务非常有用)

    参见:help qhelp @

    从上例推论:如果剪贴板中有8go,那么@+会将剪贴板内容作为宏播放,从而转到文件的第8个字节。实际上,这几乎适用于所有寄存器。如果您最后插入的字符串是插入模式下的dd,那么@.将(因为.寄存器包含最后插入的字符串)删除一行。(Vim留档在这方面是错误的,因为它指出寄存器#%:.仅适用于p@+0、@+1和@+2-@+3)。

    参见:help @

    不要混淆:@(从寄存器播放Vim命令的命令)和@(从寄存器播放正常模式命令的正常模式命令)。

    值得注意的例外是@:。命令寄存器不包含初始冒号,也不包含最终回车。但是在正常模式下,@:会执行您期望的操作,将寄存器解释为Ex命令,而不是尝试在正常模式下播放它。因此,如果您的最后一个命令是:e,则寄存器包含e,但@:将重新加载文件,而不是转到单词末尾。

    参见:help @:

  • 在运行之前显示您将在正常模式下执行的操作:@='dd'输入。一旦您点击=键,Vim就会切换到表达式求值:当您输入表达式并点击输入时,Vim会对其进行计算,结果将充当寄存器内容。当然寄存器=是只读的,并且是一次性的。每次您开始使用它时,您都必须输入一个新表达式。

    参见:help quote_=

    推论:如果您正在编辑命令,并且您意识到您应该需要在命令行中插入当前缓冲区中的一些行:不要按Esc!使用Ctrl-R=getline(58)输入。之后您将返回命令行编辑,但它插入了第58行的内容。

  • 手动定义搜索模式::let @/ = 'foo'

    参见:help :let

    请注意,这样做,您不必在模式中转义/。但是,您当然需要将所有单引号加倍。

  • 复制所有以foo开头的行,然后将所有包含bar的行复制到剪贴板,链接这些命令:qaq(重置一个寄存器,其中存储一个空宏),:g/^foo/y A:g/bar/y A:let @+ = @a

    使用资本寄存器名称使寄存器工作在追加模式

    更好的是,如果Q没有被mswin.vim重新映射,则使用Q启动Ex模式,链接那些实际上更好地称为“Ex命令”的“冒号命令”,并通过键入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')输入'并对其进行编辑。这将修改存储在寄存器a中的宏的内容,这里显示了如何使用表达式寄存器来做到这一点。另一种更简单的修改宏的方法是将其粘贴到缓冲区("ap)中,编辑它,然后通过选择它和"ay再次将其放入寄存器中。

  • 如果您执行了dddd,您可能会执行uu以撤消。使用p,您可以获得最后删除的行。但实际上,您还可以使用寄存器@1@9恢复多达9个删除。

    更好的是,如果您执行"1P,则正常模式下的.将播放"2P,依此类推。

    参见:help .:help quote_number

  • 如果要在插入模式下插入当前日期:Ctrl-R=strftime('%y%m%d')输入

    参见:help strftime()

再一次,什么可能令人困惑:

  • :@是一个命令行命令,它将寄存器的内容解释为vimcript并将其来源

  • @在正常模式下的命令,将寄存器的内容解释为正常模式击键(除非您使用:寄存器,它包含没有初始冒号的最后播放命令:在这种情况下,它重播命令,就好像您还重新键入冒号和最终返回键一样)。

  • "在正常模式下命令,可帮助您选择一个寄存器,用于Yank、粘贴、删除、更正等。

  • "也是一个有效的寄存器名称(默认或未命名的寄存器),因此可以作为期望寄存器名称的命令的参数传递

要粘贴系统剪贴板,您可以使用SHIFT-INS

它适用于Windows,但我猜它也适用于Linux。

要将系统剪贴板中的内容粘贴到Vim命令行(“命令模式”),请使用Ctrl+R后跟+。对我来说,至少在Ubuntu上,Shift+ins不起作用。

PS:我不知道为什么Ctrl+R后跟*,理论上与Ctrl+R后跟+相同似乎并不总是有效。我搜索并发现了+版本,它似乎总是有效,至少在我的盒子上。

还值得注意的是,yank寄存器与宏缓冲区相同。换句话说,您可以简单地在文档中写出整个命令(包括粘贴的片段),然后"by将其yank到b寄存器,然后使用@b运行它。

"我想将拉出的文本粘贴到Vim命令行中。"

虽然投票最多的答案非常完整,但我更喜欢编辑命令历史记录。

在正常模式下,键入:q:。这将为您提供最近命令的列表,可使用普通vim命令编辑和搜索。您将从底部的空白命令行开始。

对于文章所问的确切问题,将一个被拉行(或任何东西)粘贴到命令行中,拉你的文本,然后:q:p(进入命令历史编辑模式,然后(p)将被拉行的文本放入新的命令行。随意编辑,输入执行。

要退出命令历史记录模式,则相反。在命令历史记录的正常模式下,键入::q+输入

我遇到了类似的问题。我希望选定的文本以命令结束,但不依赖于粘贴它。这是我试图为其编写映射的命令:

:call VimuxRunCommand("python")

此插件的文档仅使用字符串文字显示。如果您尝试选择包含双引号的文本,以下内容将中断:

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

要解决这个问题,您只需使用@引用宏的内容:

vnoremap y:call VimuxRunCommand(@")<cr>

将未命名寄存器的内容传入并使用我的双引号和多行边缘字符。

osx

如果您在Mac OS X中使用Vim,不幸的是它配备了旧版本,并且不符合剪贴板选项。幸运的是,自制可以轻松解决这个问题。

安装Vim:

brew install vim --with-lua --with-override-system-vi

安装Vim的GUI版本:

brew install macvim --with-lua --with-override-system-vi

重新启动终端使其生效。


将以下行附加到~/.vimrc
set clipboard=unnamed

现在您可以使用yy在Vim中复制该行并将其粘贴到系统范围内。

对于上下文,此信息来自开箱即用,没有插件,没有. vimrc Vim 7.4行为LinuxMint中的默认选项。

您始终可以使用鼠标选择文本(或使用Vv并将所选内容放在“*寄存器中),并使用Shift+Ctrl+v将其粘贴到命令行中。

在命令行中键入Ctrl+r将导致寄存器名称的提示。因此键入: CTRL-r*将把内容寄存器*放入命令行。它将粘贴任何寄存器,而不仅仅是“*。请参阅:help c_CTRL-R

此外,鼠标中键将粘贴到命令行中。

有关X Window如何处理选择的描述,请参阅:help->quote-plus。即使在普通的开箱即用的Vim中(无论如何,在LinuxMint的Vim 7.4中),使用鼠标左键进行的任何选择都可以使用鼠标中键粘贴到命令行中。

此外,鼠标中键还将在Vim中选择的文本粘贴到许多其他X Window应用程序中,甚至是GUI应用程序(例如,Firefox和雷鸟),并且还可以将文本粘贴到命令行中,其中文本是从其他应用程序中选择的。

有关addl信息,请参阅:help->x11选择。

tl; dr

首先尝试:CTRL-r方法,然后使用Shift+Ctrl+v或鼠标中键,如果您需要其他东西。

人们承认,这可能会令人困惑。

  1. "[a-z]y:将文本复制到[a-z]寄存器

  2. 使用:!转到编辑命令

  3. Ctrl+R:按照寄存器标识粘贴您复制的内容。

使用CentOS 7。

如果您将两个值拉入两个不同的寄存器(例如寄存器a和寄存器b),那么您可以简单地设置变量c并对其进行操作。

例如,:set c = str2float(@a) + str2float(@b),然后您可以将c的内容粘贴到任何地方。

例如,在INSERT模式下,CTRL + R然后键入=进入表达式寄存器,只需在等号后键入c并按ENTER。完成后,您现在应该拥有ab寄存器的总数。

所有这些都可以记录在一个宏中并重复!

如果您使用浮点数,则使用str2float函数,如果不使用,则将获得整数。

我不确定这是否惯用,但它适用于我需要连续添加2个数字并重复500行的情况。

我喜欢使用Control-v从系统剪贴板粘贴,所以我使用:

cnoremap <C-v> <C-r>+