在vim中执行小型重构的最佳方法

时间:2011-09-15 12:39:08

标签: vim

我有以下代码:

if some_cond && another
  foo_bar
end

我希望将其更改为:

foo_bar if some_cond && another

正确的做法是什么?

4 个答案:

答案 0 :(得分:5)

我会使用以下正常模式命令序列

ddjVpkJ<<

或这个Ex命令链 1

:m+|-j|<|+d

这里我假设在重构之前光标位于if - 行 (不一定在该行的开头)。


1 首先,if - 行被:move +向下移动一行 命令。 :move命令切割给定范围的行(即 当前行(如果未指定)并将其粘贴到由该地址所寻址的行下方 只有这个命令的参数。 +地址是.+1的快捷方式 引用下一行的符号(见:help {address})。第二,行 这是条件语句的主体加入刚刚移动 if - 线。 :join命令将给定范围的行连接成一行 线。 -范围是-1地址的缩写形式,指的是:help :range 光标上方的行(参见shiftwidth)。第三,新加入的线是 使用:<命令向左移动了一个end。最后,剩下的 + - 地址被删除,其地址称为:delete范围 通过{{1}}命令。

答案 1 :(得分:2)

我看到很少(可能是非最佳的)解决方案:

  1. 光标位于第一行的第一个字符中:

    • D - 删除if条件,但将光标留在同一位置(不要删除行)
    • J - 加入当前的下一行
    • A&lt; Space&gt; &lt; ESC&gt; - 追加空格并退出到普通模式
    • p - 粘贴if条件
    • 然后使用 jdd
    • 删除剩余的结尾
  2. 将游标放在第一行的第一个字符中,如前所述:

    • j - 转到下一行
    • dd - 删除此行
    • k - 回到if条件
    • P - 在实际行之前粘贴删除行,光标应该放到粘贴行
    • J - 加入当前的下一行
    • == &lt;&lt; - unindent current line
    • 然后使用 jdd
    • 删除剩余的结尾
  3. 另一种解决方案:

    • j - 转到第二行
    • J D - 与下一行连接,删除已加入的内容
    • dd - 删除当前行
    • k - 步骤前一行
    • P J &lt;&lt; - 粘贴,加入和取消搭建
  4. 这可能不是最佳选择,但是我不假思索地这样做,因为大部分命令都在我的肌肉记忆中(你不会想到如何在你周围移动,如何在大部分时间内猛拉/删除和粘贴,以及加入线也有助于记住)。

    如果您在配置中启用virtualedit,而不是 A&lt; Space&gt; &lt; Esc&gt; 你可以 $&lt; Space&gt; ,但我发现 $ A 更接近 Ctrl - [(它与ESC相似)。

    作为建议:如果你使用一些大写字母命令,如果可能的话尝试链接它们,所以你只需按住Shift然后执行一些命令,而不是混合上下字母命令并按下两个键一次(上面的字母是2键按下,一个是Shift)。一旦我发现组合有助于在控制台Ctrl + cpj中重新启动服务器,它会按Ctrl + c,Ctrl + p(上一个命令)和Ctrl + j(Enter键)按住Ctrl键。从那时起,我尝试在Vim中找到类似于节省时间的组合,主要是使用Shift,因为在Vim中没有使用Ctrl。

答案 2 :(得分:2)

另一种方式:

ddpkJjdd
  • ddp 交换两行
  • kJ 向上移动并加入行
  • == 重新缩进该行
  • jdd 向下移动并删除最后一行

答案 3 :(得分:1)

可能有30种方法可以做到这一点。

这是一个,假设您从正常模式中的单词end的末尾开始:

d d (删除最后一行)
a D (删除并复制foo_bar到缓冲区a
d d (现在删除 - 空行2)
a P (在插入符号之前从缓冲区a粘贴)
a 空格 Esc (插入空格并返回正常模式)

同样,“正确”很少适用于Vim,因为有很多方法可以完成某些事情。这是一个很小的变化,即使重新输入foo_bar也是合理的。