【问题标题】:vim yanked the entire line, but paste the text part later between texts?vim 猛拉整行,但稍后在文本之间粘贴文本部分?
【发布时间】:2021-12-21 00:23:13
【问题描述】:

理解这听起来很不聪明,但仍然要求在这里学习 vim 方法。

假设,我们在 vim 中拉出了整行。(但整行只有很少的文本)。 现在我们想将文本/整行粘贴到一些文本中。还有一些其他的文本。 例如:

hello world!
yanked text 

我们可以通过 shift + v,然后 y 来拉动整行“拉动文本”。 现在我们想在 hello world 之间粘贴被拉出的文本。如:

hello yanked text  world!

了解我们只能在开头而不是整行拉出文本。

Q:在我们拉出整行之后,我们可以只在文本之间粘贴被拉出的文本吗? (而不是粘贴整行)因为拉动整行似乎要快得多。

【问题讨论】:

  • 您可以使用 'yy' 来拉动整行而不是 shift+v 然后 y。当您拉出整行时,它也会复制回车符。你应该使用 'y$' 来做你想要的。

标签: vim macvim


【解决方案1】:

当您从寄存器中放入时,寄存器的内容决定了它的放入方式。

如果寄存器的内容以“EOL”字符结尾,则 put 是“linewise”完成的,这意味着它发生在新行上,低于或高于当前行。

如果寄存器的内容不以“EOL”字符结尾,则“按字符”完成放置,这意味着它发生在当前行中,在光标之前或之后。

当您执行Vy 或yy 时,包括“EOL”在内的整行都会被拉出,所以当您执行p 时,put 是“linewise”完成的,您会被拉出当前行下方的行。这很有意义:你拉一条线,你放一条线。

如果你想抽出一行的 content 并确保它是“按字符”放置的,这比 Vim 优化的内容相对不常见,你必须省略“EOL” ”。为此,您需要了解以下四个动作:

  • 0 将光标移动到该行的第一个字符,
  • ^ 将光标移动到该行的第一个非空白字符,
  • $ 将光标移动到该行的最后一个字符,
  • g_ 将光标移动到该行的最后一个非空白字符,

您可以将其与 y 结合以从当前行中提取准确您想要的内容:​

  • 0y$ 将所有内容从第一个字符拉到“EOL”(不包括“EOL”),
  • ^y$ 将所有内容从第一个非空白字符到“EOL”并排除在外,
  • 0yg_ 抽出从第一个字符到最后一个非空白字符的所有内容,
  • ^yg_ 从第一个非空白字符到最后一个非空白字符的所有内容。

在我看来,上述命令直观且富有表现力,足以在需要时使用,但如果您真的想要单个字符命令,那么您可以简单地进行自定义映射:

nnoremap <key> ^yg_

参考:

:help linewise
:help 0
:help ^
:help $
:help g_

【讨论】:

    【解决方案2】:

    一种选择是定义新的文本对象:

    " inner/around line text objects
    " visual mode
    xnoremap <silent> il <ESC>^vg_
    xnoremap <silent> al <ESC>0v$
    " operator pending mode
    onoremap <silent> il :<C-u>normal! ^vg_<CR>
    onoremap <silent> al :<C-u>normal! 0v$<CR>
    

    il 文本对象将捕获行上的文本,减去任何空格,而 al 文本对象将捕获整行,包括空格(但 不是 yy 那样的换行符:

                          'il'
        |------------------------------------------|
        here is some text with whitespace at the end      
    |----------------------------------------------------|
                          'al'
    

    然后您可以使用yil 和p 将其插入到其他行的中间。 在上面执行yil 或dil 等,然后移动光标(表示为 下面的示例由 ^) 到不同文本行的中间:

        a new line
             ^
    

    然后按p 给出:

        a new here is some text with whitespace at the endline
                                                         ^
    

    然后按p 给出:

    【讨论】:

    • Indeed 但我不想提供太多高级解决方案。哦,好吧……猫现在从袋子里出来了¯\_(ツ)_/¯。
    • @romainl 哦,我可能要偷几个...谢谢!
    【解决方案3】:

    只需使用0y$ 或简单地y$ 将行从光标拉到行尾。这将允许您根据需要粘贴该行。

    截至本次提交时,Neovims 默认映射将 Y 映射到 y$:5a111c1b0,如果您愿意,可以考虑添加相同的映射。

    如果你真的希望寄存器是字符方面的,那么你可以使用类似的东西:

    :call setreg('0', getreg('0'), 'c')
    

    这将允许您在hello 和world 之间粘贴yanked text\n,结果是:

    hello yanked text 
    world!
    yanked text
    

    请使用y$。

    【讨论】:

    • 如果不清楚,0y$ 从行首拉到行尾(不管光标在行中的哪个位置)但y$ 不包含任何内容从行首到光标。所以,“请使用y$”如果光标在行首。
    猜你喜欢
    • 2015-10-10
    • 2012-07-08
    • 2013-06-11
    • 1970-01-01
    • 2021-12-10
    • 2013-06-05
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多