繁体   English   中英

如何在VIM中移动代码块

[英]How to move block of code in VIM

假设我有以下代码块:

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数字j会有所帮助,但是我想在visual选择中实现它。

我希望这不是完全愚蠢的问题,但我确实没有找到解决方法。 谢谢你的帮助。

看起来您已经使用了可视的逐块选择 粘贴时,不会创建新行,而是将内容插入(在光标位置处)现有行内。 (这也解释了您的第二个问题,其余的空行。)

如果要移动线 ,请确保从Shift + V开始逐行选择 ; 您会在底部的状态行中看到-- VISUAL LINE ---- VISUAL LINE --指示。 在你的榜样,这将是(把光标放在任何地方的printf("First line...部分) Vjjd当然,用的线,使得少量的,它更容易跳过直观的选择和使用计数: 3dd

超越

一旦掌握了基础知识(尝试过vimtutor ,还可以查看出色的内置:help或网络上过多的Vim教程,尤其是http://vimcasts.org/ ),可以通过多种方法进行改进在此工作流程上: 文本对象 ,可以选择函数体或缩进线的插件等。

将光标放在printf("First line\\n"); ,我将使用v{motion}选择代码块,然后:move:movereturn 0;之下return 0; 线。

vjj
:m?ret<CR>

没有视觉选择:

d2j
?ret<CR>
p

仅限于命令:

:,+2m?ret<CR>

要么

光标return 0;

:9,10m.

嗯,有一百万种方法……

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM