首页 文章

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

提问于
浏览
540

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

9 回答

  • 1046

    是 . 按Ctrl-R然后“ . 如果您在已拉动的内容中有文字控制字符,请使用Ctrl-R,Ctrl-O,” .

    以下是对可以使用寄存器执行的操作的说明 . 你可以用寄存器做什么是非凡的,一旦你知道如何使用它们就不能没有它们 .

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

    • 0 (yank寄存器:当你在正常模式下使用 y 时,没有指定寄存器,被拉出的文本也会到达默认寄存器),

    • 19 (移位删除寄存器,当您使用 cd 等命令时,已删除的内容转到寄存器1,寄存器1中的内容转到寄存器2等),

    • " (默认寄存器,也称为未命名寄存器 . 这是“来自Ctrl-R”,),

    • az 供您自己使用(大写 AZ 用于附加到相应的寄存器) .

    • _ (类似于 /dev/null (Unix)或 NUL (Windows),您可以写入但它被丢弃,当您从中读取时,它始终为空),

    • - (小删除寄存器),

    • / (搜索模式寄存器,例如,当您查找带有 /?* 或_895674的文本时更新;您也可以写入它以动态更改搜索模式),

    • : (通过 Q: ,readonly存储最后一个VimL类型命令),

    • +* (系统剪贴板寄存器,您可以写入它们来设置剪贴板并从中读取剪贴板内容)

    有关完整参考,请参见 :help registers .

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

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

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

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

    比照 :help ":help quote_:

    • 您正在编辑VimL文件(例如您的 .vimrc )并且想立即执行几个连续的行:yj:@“Enter .
      在这里,yj将当前和下一行(这是因为j是行向运动,但这超出了这个答案的范围)到默认寄存器(也称为未命名寄存器)中 . 然后 :@ Ex命令播放存储在作为参数给出的寄存器中的Ex命令, " 是您引用未命名寄存器的方式 . 另请参阅此答案的顶部,这是相关的 .

    不要将此处使用的 " (这是一个寄存器名称)与上一个示例中的 " 混淆,后者是一个普通模式命令 .

    比照 :help :@:help quote_quote

    • 在插入模式下将最后一个搜索模式插入到文件中,或使用Ctrl-R / /将其插入命令行 .

    比照 :help quote_/help i_CTRL-R

    推论:保留搜索模式,但添加替代方案: / Ctrl-R,/ \|alternative .

    • 您在视觉模式中在一行中间选择了两个单词,用 y 猛拉它们,它们位于未命名的寄存器中 . 现在,您想要在您所在的位置下方打开一个新行,并使用这两个词: :pu . 这是 :put " 的简写 . 与许多Ex命令一样, :put 命令仅适用于行 .

    比照 :help :put

    你也可以做到: :call setreg('"', @", 'V') 然后 p . setreg 函数设置名称作为第一个参数(作为字符串)给出的寄存器,使用第二个参数的内容初始化它(并且您可以使用寄存器作为变量,名称为 @x ,其中 x 是VimL中的寄存器名称),并将其转换为第三个参数中指定的模式, V 为linewise,没有用于按字符和字面 ^V 为blockwise .

    比照 :help setreg() . 反向函数是 getreg()getregtype() .

    • 如果你用 qa ... q 录制了一个宏,那么 :echo @a 会告诉你你输入了什么, @a 将重放宏(可能你知道那个,非常有用,以避免重复的任务)

    比照 :help qhelp @

    上一个例子的推论:如果你在剪贴板中有 8go ,那么 @+ 将以宏的形式播放剪贴板内容,从而转到文件的第8个字节 . 实际上这几乎适用于每个寄存器 . 如果您在插入模式下最后插入的字符串是 dd ,那么 @. 将(因为 . 寄存器包含最后插入的字符串)删除一行 . (Vim文档在这方面是错误的,因为它声明寄存器 #%:. 仅适用于 pP:put 和Ctrl-R) .

    比照 :help @

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

    值得注意的例外是 @: . 命令寄存器不包含初始冒号,也不包含最终的回车符 . 但是在正常模式下, @: 将执行您所期望的操作,将寄存器解释为Ex命令,而不是尝试在正常模式下播放 . 因此,如果您的上一个命令是 :e ,则寄存器包含 e@: 将重新加载文件,而不是结束字 .

    比照 :help @:

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

    比照 :help quote_=

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

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

    比照 :help :let

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

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

    使用大写寄存器名称使寄存器在附加模式下工作

    更好的是,如果没有 mswin.vim 重新映射 Q ,则使用 Q 启动Ex模式,链接那些实际上更好地称为“Ex命令”的“冒号命令”,并通过键入 visual 返回正常模式 .

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

    • 双倍空间文件: :g/^/put _ . 这使得黑洞寄存器的内容(在读取时为空,但可写,行为类似于 /dev/null )在每行之后(因为每行都有一个开头!) .

    • 在每行之前添加包含 foo 的行: :g/^/-put ='foo' . 这是表达式寄存器的巧妙使用 . 这里, -.-1 (cf. :help :range )的同义词 . 由于 :put 将文本放在行之后,因此必须明确告诉它对前一行进行操作 .

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

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

    • 如果您错误地记录了一个宏,可以输入 :let @a=' Ctrl-R =replace(@a,"'","''",'g') 输入 ' 并进行编辑 . 这将修改存储在寄存器 a 中的宏的内容,这里显示了如何使用表达式寄存器来执行此操作 .

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

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

    比照 :help .:help quote_number

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

    比照 :help strftime()

    再一次,可能令人困惑的是:

    • :@ 是一个命令行命令,它将寄存器的内容解释为vimscript并将其获取

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

    • " 在普通模式命令中帮助您选择一个用于猛拉,粘贴,删除,更正等的寄存器 .

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

  • 0

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

    它适用于Windows,但我猜它在Linux中运行良好 .

  • 13

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

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

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

    对于文章要求的确切事情,将一条猛拉线(或任何东西猛拉)粘贴到命令行中,将文本拉出来然后: q:p (进入命令历史编辑模式,然后(p)将您的拉出文本转换为新文本命令行 . 随意编辑,输入执行 .

    要退出命令历史记录模式,情况正好相反 . 在命令历史记录的正常模式下,键入: :q enter

  • 13

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

  • 1

    要将系统剪贴板中的内容粘贴到vim命令行("command mode"),请使用Ctrl R,然后按 . 对我来说,至少在Ubuntu上,Shift Ins无效 .

    PS:不确定为什么Ctrl R后跟*,理论上与Ctrl R相同后跟似乎总是不起作用 . 我搜索并发现了它的版本,它似乎总是起作用,至少在我的盒子上 .

  • 34

    我遇到了类似的问题 . 我希望所选文本最终出现在命令中,但不要依赖于粘贴它 . 这是我试图为以下内容编写映射的命令:

    :call VimuxRunCommand("python")
    

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

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

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

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

    传递未命名寄存器的内容,并使用我的双引号和多行边框 .

  • 44

    OSX

    如果你在MAC OSX中使用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中的行并在系统范围内粘贴它 .

  • 1

    这个问题已经很老了,但是因为它被观看了很多次,所以它似乎很受欢迎 - 我会把这个放在后代 . 对于上下文,这个信息来自开箱即用,没有插件,没有.vimrc vim 7.4在linux mint中的行为与默认选项 .

    您始终可以使用鼠标选择文本(或使用V或v并将选择放在“*寄存器”中),然后使用SHIFT-CTL-v将其粘贴到命令行中 .

    在命令行中键入CTL-r将导致提示注册名称 . 所以输入:CTL-r 会将内容寄存器放入命令行 . 它将粘贴任何寄存器,而不仅仅是“* . 请参阅:help c_CTRL-R .

    此外,鼠标中键将粘贴到命令行中 . 请参阅:help-> quote-plus,了解x11如何处理选择 . 即使在一个简单的,开箱即用的vim中(再次,在linux mint中的vim 7.4中),使用鼠标左键进行的任何选择都可以使用鼠标中键粘贴在命令行中 .

    此外,鼠标中键还会将在vim中选择的文本粘贴到许多其他x11应用程序中,即使是gui文件(例如,firefox,thunderbird),也可以将文本粘贴到命令行,其中文本是从其他应用程序中选择的 .

    请参阅:help-> x11-add for addl info .

    tl;dr

    首先尝试:CTL-r方法,然后使用SHIFT-CTL-v或鼠标中键,如果你需要别的东西 .

    我们承认它可能令人困惑 .

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

    • 使用 :! 转到编辑命令;

    • CTRL+R 按照注册标识粘贴您复制的内容 .

    它曾经用于CentOS7 .

相关问题