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')
这将允许您在 hello
和 world
之间粘贴 yanked text\n
,导致:
hello yanked text
world!
yanked text
请直接使用y$
。
当您从寄存器中放置时,寄存器的内容决定了它的放置方式。
如果寄存器的内容以“EOL”字符结尾,则放置是“按行”完成的,这意味着它发生在当前行下方或上方的新行上。
如果寄存器的内容不以“EOL”字符结尾,则放置是“按字符”完成的,这意味着它发生在当前行,光标之前或之后。
当您执行 Vy
或 yy
时,它是整行,包括“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'
然后你可以使用yil
和p
将它插入到其他行的中间。
在上面做 yil
或 dil
等,然后移动光标(在
下面的示例通过 ^
) 到不同文本行的中间:
a new line
^
并按下 p
给出:
a new here is some text with whitespace at the endline
^
并按下 p
给出:
理解这听起来很不聪明,但还是要在这里学习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')
这将允许您在 hello
和 world
之间粘贴 yanked text\n
,导致:
hello yanked text
world!
yanked text
请直接使用y$
。
当您从寄存器中放置时,寄存器的内容决定了它的放置方式。
如果寄存器的内容以“EOL”字符结尾,则放置是“按行”完成的,这意味着它发生在当前行下方或上方的新行上。
如果寄存器的内容不以“EOL”字符结尾,则放置是“按字符”完成的,这意味着它发生在当前行,光标之前或之后。
当您执行 Vy
或 yy
时,它是整行,包括“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'
然后你可以使用yil
和p
将它插入到其他行的中间。
在上面做 yil
或 dil
等,然后移动光标(在
下面的示例通过 ^
) 到不同文本行的中间:
a new line
^
并按下 p
给出:
a new here is some text with whitespace at the endline
^
并按下 p
给出: