假设我有以下代码块:
int main(void)
{
return 0;
}
int abc(void)
{
printf("First line\n");
printf("Druhy radek\n");
printf("tuna fish\n");
}
...我希望将函数abc的内容移动到函数main。我尝试使用visual selection
,但当我选择这三行并粘贴它们时,会发生这种情况:
int main(void)
{
return 0;
printf("First line\n"); }
printf("Druhy radek\n");
printf("tuna fish\n"); int justAregularFunction(void)
{
而不是这个,我想在已删除的文本块的main函数中创建一个空格,然后粘贴它。
我尝试使用]p
代替常规p
来粘贴文本,但它不起作用。
解决方法是使用d2j
删除这三行,然后我可以像我想的那样粘贴块。但是当你有很多行的代码时,它不是很有用。命令:set paste
和:set nopaste
也无济于事。我正在学习VIM并且没有vi的经验,所以我可能错过了一些东西。 Vim tutor
非常有帮助,但它解释的只是移动单行。另外我发现很多关于vim在堆栈溢出时移动线的材料,但是有什么帮助。我希望>>
<<
能够移动文本,但需要垂直移动。
我无法弄清楚的第二件事是如何删除视觉选择中的文本和空间。当我选择文本并尝试删除它时,它会留下空白空间。 Button D
仅删除没有空格的文本,X
也会删除相同的文本(以及带有shift和control的其他变体)。同样,使用d number j会有所帮助,但我想在visual
select。
我希望这不是完全愚蠢的问题,但我真的没有办法做到这一点。谢谢你的帮助。
答案 0 :(得分:4)
看起来你已经使用了 visual blockwise selection ;粘贴时,不会创建新行,而是在现有行内插入内容(在光标位置)。 (这也解释了你的第二个问题,剩下的空行。)
如果要移动行,请务必使用 Shift + V 启动行选择;您会在底部的状态行中看到-- VISUAL LINE --
指示。在您的示例中,这将是(光标位于printf("First line...
部分的任何位置)Vjjd
。当然,如此少量的线条,更容易跳过视觉选择并使用计数:3dd
。
一旦你掌握了正确的基础知识(你是否尝试过vimtutor
),还要看一下优秀的内置:help
,或者网上过多的Vim教程,尤其是http://vimcasts.org/) ,有几种方法可以改进这个工作流程:文本对象,可以选择功能体或缩进线等的插件。
答案 1 :(得分:0)
如果光标位于printf("First line\n");
,我会选择代码块v{motion}
,然后:move
就在return 0;
行下方。
vjj
:m?ret<CR>
没有视觉选择:
d2j
?ret<CR>
p
仅限Ex命令:
:,+2m?ret<CR>
或
光标位于return 0;
:
:9,10m.
嗯,有一百万种方式......