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

dan*_*dan 576 vim copy-paste

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

Ben*_*oit 1111

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

这是对使用寄存器可以做什么的解释.你可以用寄存器做什么是非凡的,一旦你知道如何使用它们,你就不能没有它们.

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

  • 0(yank寄存器:当你y在普通模式下使用时,没有指定寄存器,被拉动的文本也会到达默认寄存器),
  • 1to 9(移位删除寄存器,当你使用诸如cor之类的命令d,删除的内容进入寄存器1,寄存器1中的内容进入寄存器2 ),
  • "(默认寄存器,也称为未命名寄存器.这是"进来的地方Ctrl- R,"),
  • az供自己使用(大写AZ是附加到相应的寄存器).
  • _(就像/dev/null(Unix)或NUL(Windows)一样,你可以写它但它被丢弃了,当你从中读取它时,它总是空的),
  • - (小删除寄存器),
  • /(搜索模式寄存器,当你看文字更新了/,?,*#例如;你也可以写信给它动态地改变搜索模式),
  • :(通过Q:只读存储最后一个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 ".:put与许多Ex命令一样,该命令仅适用于行.

    比照 :help :put

    你也可以做到::call setreg('"', @", 'V')然后p.的setreg功能设定,其名称被给定为第一个参数(字符串)的寄存器,与所述第二参数的内容进行初始化(并且可以使用寄存器作为变量的名称@x,其中x是在VimL寄存器名),和将其转换为第三个参数中指定的模式,V对于linewise,^V对于按字段和字面,没有任何内容.

    比照 :help setreg().反向功能是getreg()getregtype().

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

    比照 :help q,help @

    上一个例子的推论:如果你8go在剪贴板中,那么@+将把剪贴板内容作为宏播放,从而转到你文件的第8个字节.实际上这几乎适用于每个寄存器.如果您最后插入的字符串dd处于插入模式,那么@.将(因为.寄存器包含最后插入的字符串)删除一行.(Vim文档是错在这方面,因为它指出寄存器#,%,:并且.将只与工作p,P,: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(复位一个寄存器中存储在其内部的空宏), ,:g/^foo/y A,.:g/bar/y A:let @+ = @a

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

    更好,如果Q没有被重新映射mswin.vim,启动Ex模式Q,链接那些实际上更好地称为"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') Enter '并进行编辑.这将修改存储在寄存器中的宏的内容,a这里显示了如何使用表达式寄存器来执行此操作.

  • 如果你这样做dddd,你可能会做uu以撤消.有了p你可以得到最后删除的行.但实际上你也可以@1通过寄存器恢复最多9次删除@9.

    更好的是,如果你这样做"1P,那么.在正常模式下会播放"2P,依此类推.

    比照 :help .:help quote_number

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

    比照 :help strftime()

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

  • :@ 是一个命令行命令,它将寄存器的内容解释为vimscript并将其作为源代码
  • @ 在正常模式命令中,将寄存器的内容解释为正常模式击键(除非使用:寄存器,包含上次播放的命令而没有初始冒号:在这种情况下,它会重放命令,就好像您还重新键入冒号和最后的回报键).

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

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

  • 是不是有一个徽章"答案和问题之间的长度比为100/1?":) (197认同)
  • 这个答案改变了我使用vim的方式.谢谢Benoit (18认同)
  • 这个伟大的注册说明+1!我会用它! (11认同)
  • 别忘了:reg会列出所有寄存器及其内容 (11认同)
  • 这是一个很好的答案,但它比1400短了大约900字.:) (6认同)
  • 为了更好地理解,请阅读此网址中的 42 pdf http://zmievski.org/talks/ (2认同)
  • 不应该`:g/^ foo/ya`是`:g/^ foo/y A`复制的不仅仅是匹配foo的最后一行?(然后你可能想要先写'let @a = @ _`来清除寄存器.)或者我错过了你链接这些命令的方式?我认为这意味着如果不使用Ex模式则一个接一个地输入它们.即使使用Ex模式(带有`Q`),一个接一个地输入它们也不起作用. (2认同)
  • 在最新版本的vim中,小于一行的删除将进入“小删除寄存器”,而不是进入编号寄存器。参考:[Vi和Vim](http://vi.stackexchange.com/questions/4532/numbered-register-doesnt-record-most-deleted-text-in-a-line),[Vi和Vim](http ://vi.stackexchange.com/questions/2493/can-i-make-vim-also-save-small-deletions-into-register-1),[Reddit](https://www.reddit.com/ r / vim / comments / yyq4a / is_there_anyway_to_configure_vim_to_use_the /) (2认同)

ske*_*ept 46

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

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

  • 是的,也适用于Linux.在Vim和GVim的GNOME下测试. (6认同)
  • @lericson我在答案中没有说这对系统键盘中的某些内容有用吗?我不理解downvote.对你而言,说真的吗?你真的有这个在剪贴板?你不认为输入`shift-ins`比`ctrl-R +*`更容易吗?这当然是你在gvim.如果你在终端连接到另一台机器并且想要从剪贴板上粘贴东西,你知道什么比`shift-ins`更好吗?因为寄存器在那种情况下不起作用.在评论和做其他事情之前请先思考(如downvoting). (3认同)
  • 这实际上将粘贴板作为键盘输入提供给Vim,所以如果你处于正常模式并粘贴`:!rm -rf/<cr>`,它就会执行它.改用寄存器! (2认同)

小智 38

"我想把猛拉的文字粘贴到Vim命令行中."

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

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

对于文章要求的确切事情,将一条拉线(或任何东西)拉到一个命令行中,拉动你的文本,然后:( q:p进入命令历史编辑模式,然后(p)将你的被拉动的文本放入一个新的命令line.随意编辑,enter执行.

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


小智 14

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

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

  • Ctrl-r +和Ctrl-r*之间的区别在于前者是常规剪贴板,但在Linux中有第二种类型的剪贴板,称为"primary",表示最近选择的文本(中间按钮鼠标粘贴) .但是,这在Windows或MAC中不可用 (2认同)

nau*_*101 13

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