繁体   English   中英

如何将抽出的文本粘贴到 Vim 命令行中

[英]How to paste yanked text into the Vim command line

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

是的。 点击Ctrl - R然后" 。如果您在拉出的内容中有文字控制字符,请使用Ctrl - RCtrl - O"

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

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

  • 0 (抽出寄存器:当您在正常模式下使用y时,未指定寄存器,抽出的文本会出现在那里,也会转到默认寄存器),
  • 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 中使用的最后一个命令将粘贴到您的缓冲区中。
    让我们分解: "是一个普通模式命令,可让您选择在下一次拉动、删除或粘贴操作期间要使用的寄存器。所以" 选择冒号寄存器(存储最后一个命令)。 那么p是一个你已经知道的命令,它粘贴寄存器的内容。

    参看。 :help " , :help quote_:

  • 你正在编辑一个 VimL 文件(例如你的.vimrc )并且现在想执行几个连续的行: y j : @ " Enter
    在这里, y j将当前行和下一行(这是因为 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),并将其转换为第三个参数中指定的模式, V表示 linewise,nothing 表示字符和文字^V表示块。

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

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

    参看。 :help qhelp @

    上一个示例的推论:如果剪贴板中有8go ,那么@+会将剪贴板内容作为宏播放,从而转到文件的第 8 个字节。 实际上,这几乎适用于每个寄存器。 如果您最后插入的字符串是dd在插入模式下,那么@. 将(因为.寄存器包含最后插入的字符串)删除一行。 (Vim 文档在这方面是错误的,因为它声明寄存器#%:.只能与pP:putCtrl - 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 (重置a寄存器,其中存储一个空宏), :g/^foo/y A:g/bar/y A , :let @+ = @a

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

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

    参看。 :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') Enter

    参看。 :help strftime()

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

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

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

  • "在正常模式下,该命令可帮助您选择用于拉取、粘贴、删除、更正等操作的寄存器。

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

对于粘贴系统剪贴板的内容,您可以使用SHIFT - INS

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

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

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

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

对于文章所要求的确切内容,将拉出的行(或拉出的任何内容)粘贴到命令行中,拉出您的文本,然后: q:p (进入命令历史编辑模式,然后(p)将您拉出的文本放入一个新的命令行,随意编辑,回车执行。

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

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

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

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

就上下文而言,此信息来自具有默认选项的 Linux Mint 中的开箱即用、无插件、无 .vimrc Vim 7.4 行为。

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

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

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

请参阅:help->quote-plus以了解 X Window 如何处理选择的描述。 即使在一个普通的、开箱即用的 Vim 中(同样,在 Linux Mint 的 Vim 7.4 中,无论如何),使用鼠标左键所做的任何选择都可以使用鼠标中键粘贴到命令行中。

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

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

tl;博士

首先尝试 :CTRL-r 方法,然后在需要其他内容时使用Shift + Ctrl + v或鼠标中键。

承认它可能会令人困惑。

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

:call VimuxRunCommand("python")

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

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

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

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

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

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

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

  3. Ctrl + R :按照注册标识粘贴您复制的内容。

它曾经用于 CentOS 7。

操作系统

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

安装 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

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

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

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

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

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

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

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

我只是right-click我的鼠标。

打开带有vim fileName的 vim 文件 按i进入insert mode 然后right-click鼠标进行粘贴。 我在 VS Code 中编辑并从那里复制。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM