vim 猛拉整行,但稍后将文本部分粘贴到文本之间?

vim yanked the entire line, but paste the text part later between texts?

理解这听起来很不聪明,但还是要在这里学习vim方法来做。

比方说,我们已经将您在 vim 中的整行抽了出来(但整行只有很少的文本)。 现在我们想将 text/entire 行粘贴到一些文本中。哪里还有一些其他的文字。 例如:

hello world!
yanked text 

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

hello yanked text  world!

了解我们可以只在开头而不是整行抽取文本。

问:整行抽取后,是否可以只在文本之间粘贴抽取的文本? (而不是粘贴整行)因为拉整行似乎更快。

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

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

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

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

这将允许您在 helloworld 之间粘贴 yanked text\n,导致:

hello yanked text 
world!
yanked text

请直接使用y$

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

如果寄存器的内容以“EOL”字符结尾,则放置是“按行”完成的,这意味着它发生在当前行下方或上方的新行上。

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

当您执行 Vyyy 时,它是整行,包括“EOL”,被抽出,因此当您执行 p 时,put 已完成“linewise”,你会在当前行下方得到你的抽取线。这很有意义:你拉一条线,你放一条线。

如果你想抽出一行的 content 从而确保它被“按字符”放置,这比 Vim 相对不太常见优化,你必须省略“EOL”。为此你需要知道这四个动作:

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

您可以将其与 y 结合使用以 完全 从当前行中提取您想要的内容:

  • 0y$ 提取从第一个字符到并排除“EOL”的所有内容,
  • ^y$ 提取从第一个非空白字符到并排除“EOL”的所有内容,
  • 0yg_ 提取从第一个字符到最后一个非空白字符的所有内容,
  • ^yg_ 提取从第一个非空白字符到最后一个非空白字符的所有内容。

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

nnoremap <key> ^yg_

参考:

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

一个选项是定义新的文本对象:

" 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'

然后你可以使用yilp将它插入到其他行的中间。 在上面做 yildil 等,然后移动光标(在 下面的示例通过 ^) 到不同文本行的中间:

    a new line
         ^

并按下 p 给出:

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

并按下 p 给出: