如何将粘贴的文本粘贴到Vim命令行?

我想将抽取的文本粘贴到Vim命令行中。 可能吗?

是。 按CtrlR然后是 ,如果你有字面控制字符的话,使用CtrlRCtrlO

这里是一个解释你可以用寄存器做什么。 你可以用寄存器做什么是非凡的,一旦你知道如何使用它们,你就离不开它们。

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

  • 0 (yank寄存器:当你在正常模式下使用y ,没有指定一个寄存器,被抽出的文本到那里,也是默认的寄存器),
  • 19 (移动删除寄存器,当你使用cd这样的命令时,删除的内容到寄存器1,寄存器1到寄存器2的内容等等 ),
  • " (默认寄存器,也称为未命名的寄存器,这是进入CtrlR “的地方
  • az供您自己使用(大写字母AZ用于附加到相应的寄存器)。
  • _ (像/dev/null (Unix)或NUL (Windows),你可以写入,但是它被丢弃,当你读它时,它总是空的),
  • - (小删除寄存器),
  • / (search模式寄存器,当您查找带有/?*#文本时更新;您也可以通过写入来dynamic更改search模式),
  • :通过Q: ,只读存储最后的VimLtypes命令),
  • +* (系统剪贴板寄存器,您可以写信给他们设置剪贴板并从中读取剪贴板中的内容)

请参阅:help registers以供参考。

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

在插入或命令行模式下, CtrlR加上一个寄存器名称,插入该寄存器的内容。 如果你想直接插入它们(不需要自动缩进,不需要像0x08这样的控制字符转换到退格键等等),你可以使用CtrlRCtrlO ,注册名。 请参阅:help i_CTRL-R和以下段落以获取更多参考。

但是你也可以做下面的事情(我可能忘记了寄存器的许多用途)。

  • 在正常模式下,点击 p 。你在vim中使用的最后一个命令被粘贴到你的缓冲区中。
    让我们分解一下: "是一个普通模式命令,可以让你select在下一个抽签,删除或者粘贴操作中使用哪个寄存器,所以 select冒号寄存器(存储最后的命令)。 那么p是你已经知道的一个命令,它粘贴寄存器的内容。

    比照 :help ":help quote_:

  • 你正在编辑一个VimL文件(比如你的.vimrc文件),现在想执行几行连续的行: y j @ Enter”
    在这里, y j把当前行和下一行(这是因为j是一个行向运动,但是这个超出了这个回答的范围)写入默认寄存器(也称为未命名寄存器)。 然后:@ @Ex命令播放存储在寄存器中的Ex命令作为参数, "你是如何引用未命名的寄存器的,同样参见这个答案的顶部。

    不要混淆在这里使用(这是一个注册名称)与"来自前面的例子,这是一个正常模式命令。

    比照 :help :@:help quote_quote

  • 在插入模式下将最后的search模式插入到文件中,或者使用CtrlR/插入到命令行中。

    比照 :help quote_/help i_CTRL-R

    推论:保持你的search模式,但添加一个替代: / CtrlR/ \|alternative

  • 你已经在视觉模式中select了一行中间的两个单词,用y抽出它们,它们在未命名的寄存器中。 现在你想在你的下面打开一个新的行,用这两个词:pu 。 这是:put "简写:put命令与许多Ex命令一样,只能以线性方式工作。

    比照 :help :put

    你也可以这样做:: :call setreg('"', @", 'V')然后psetreg函数将给定名称的寄存器设置为第一个参数(作为string),使用第二个参数的内容对其进行初始化(并且可以使用寄存器作为名称@xvariables,其中x是VimL),并将其转换为第三个参数中指定的模式, V为linewise,characterwise和literal分别为^V和blockwise。

    比照 :help setreg() 。 相反的function是getreg()getregtype()

  • 如果你用qaqlogging了一个macros,那么:echo @a会告诉你你input的内容,而@a将重放macros(可能你知道这个macros对于避免重复任务非常有用)

    比照 :help qhelp @

    前面例子的推论:如果剪贴板中有8go ,那么@+会将剪贴板内容作为一个macros来播放,然后转到文件的第8个字节。 其实这将几乎每个登记册。 如果最后插入的string在插入模式下是dd ,那么@. 将(因为.寄存器包含最后插入的string)删除一行。 (Vim文档在这方面是错误的,因为它指出寄存器#% :.只能和pP:putCtrlR一起工作 )。

    比照 :help @

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

    值得注意的例外是@: :。 命令寄存器不包含最初的冒号也不包含最终的回车。 然而在普通模式下, @:会做你所期望的,把这个寄存器解释为一个Ex命令,而不是在正常模式下播放它。 所以如果你的最后一个命令是:e ,寄存器包含e但是@:将重新加载文件,而不是到词的结尾。

    比照 :help @:

  • 在正常模式下显示您将要执行的操作: @='dd' 。 只要你按=键,Vim就会切换到expression式求值:当你input一个expression式并按回车键 ,Vim就会计算出来,结果作为寄存器内容。 当然,register =是只读的,而且是一次性的。 每次你开始使用它,你将不得不input一个新的expression式。

    比照 :help quote_=

    推论:如果你正在编辑一个命令,并且你意识到你应该需要在你的命令行插入当前缓冲区的一行:不要按Esc ! 使用CtrlR =getline(58) Enter 。 之后,你将回到命令行编辑,但它已经插入了第58行的内容。

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

    比照 :help :let

    请注意,这样做,你不需要逃避/在模式中。 但是,当然,你需要加倍所有的单引号。

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

    使用资本注册名称使注册工作在附加模式

    更好的是,如果Q没有被mswin.vim重新映射,用Q启动Ex模式,链接那些实际上更好的叫做“Ex命令”的“冒号命令”,并通过inputvisual返回到正常模式。

    比照 :help :g:help :y:help Q

  • 双空间你的文件:: :g/^/put _ 。 这使黑洞寄存器的内容(在读取时为空,但是可写,像/dev/null )在每行之后(因为每行都有一个开始!)。

  • 在每行之前添加一个包含foo行:: :g/^/-put ='foo' 。 这是expression式寄存器的巧妙使用。 在这里, -.-1的同义词(参见:help :range )。 因为:put把文本:put行后面,你必须明确地告诉它对前一行进行操作。

  • 将整个缓冲区复制到系统剪贴板:%y+

    比照 :help :range (对于%部分)和:help :y

  • 如果你错误地logging了一个macros,你可以input:let @a=' CtrlR =replace(@a,"'","''",'g') input '并编辑它。 这将修改存储在寄存器a中的macros的内容,这里显示了如何使用expression式寄存器来完成这个操作。

  • 如果你做了dddd ,你可以做uu来撤销。 用p你可以得到最后删除的行。 但实际上,您也可以使用寄存器@1@9来恢复多达9次删除。

    更好的是,如果你做的是"1P ,那么在普通模式下会播放"2P ,依此类推。

    比照 :help .:help quote_number

  • 如果要在插入模式下插入当前date: CtrlR =strftime('%y%m%d') input

    比照 :help strftime()

再次,有什么可以混淆的:

  • :@是一个命令行命令,它将一个寄存器的内容解释为vimscript并将其发送
  • @在正常模式命令中,将寄存器的内容解释为正常模式的击键(除了当你使用: register时,包含最后播放的命令而没有初始冒号:在这种情况下,它重放命令,就好像你也重新input了冒号和最后的返回键)。

  • "在正常模式命令,可以帮助您select一个注册为扬,粘贴,删除,正确等

  • "也是有效的寄存器名称(默认或未命名的寄存器),因此可以作为期望寄存器名称的命令的parameter passing

粘贴系统剪贴板的东西,你可以使用SHIFT-INS

它在Windows中工作,但我猜测它在Linux中也能很好地工作。

“我想把抽取的文本粘贴到Vim命令行中。”

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

在正常模式下,input: q: 这会给你一个最近的命令列表,可以用普通的vim命令编辑和search。 您将从底部的空白命令行开始。

对于文章所要求的确切的事情,粘贴一个被抽出的线(或任何东西)插入到命令行中,抽出你的文本,然后: q:p (进入命令历史编辑模式,然后(p)一个新的命令行,随意编辑, 进入执行。

要摆脱命令历史模式,情况正好相反。 在命令历史logging的正常模式下,input:q + enter

值得注意的是,这些跳转寄存器与macros缓冲区相同。 换句话说,你可以简单地在你的文档(包括你粘贴的代码片段)中写出你的整个命令,然后"by将它们放到b寄存器中,然后用@b运行它。

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

PS:不知道为什么Ctrl + R后面跟着* ,这在理论上与Ctrl + R+是一样的。 我search并发现了+版本,它似乎始终工作,至less在我的盒子上。

我有一个类似的问题。 我希望所选文本最终以一个命令结束,但不要依赖于粘贴。下面是我正在尝试编写映射的命令:

 :call VimuxRunCommand("python") 

这个插件的文档只显示使用string文字。 如果您尝试select包含双引号的文本,以下操作将会中断:

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

为了解决这个问题,你只需使用@引用macros的内容:

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

传递未命名registry的内容,并与我的双引号和多行边框一起使用。

OSX

如果您在MAC OSX中使用vim,不幸的是,它带有较旧的版本,而不符合剪贴板选项。 幸运的是,自制软件很容易解决这个问题。

安装vim:

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

安装vim的gui verion:

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

重启terminal生效。

~/.vimrc附加到~/.vimrc
set clipboard=unnamed

现在你可以在vim中用yy复制该行,并将其粘贴到系统范围内。