如何在VIM中移动代码块

时间:2014-04-02 10:12:21

标签: select vim block move

假设我有以下代码块:

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。

中实现它

我希望这不是完全愚蠢的问题,但我真的没有办法做到这一点。谢谢你的帮助。

2 个答案:

答案 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.

嗯,有一百万种方式......