代码之家  ›  专栏  ›  技术社区  ›  J. Polfer

在等号周围交换文本

  •  10
  • J. Polfer  · 技术社区  · 15 年前

    在vi/vim中,是否有一种简单的方法可以围绕等号翻转代码?

    我想把这个转过来:

    value._1 = return_val.delta_clear_flags;
    value._2._1 = return_val.delta_inactive_time_ts.tv_sec;
    value._2._2 = return_val.delta_inactive_time_ts.tv_nsec;
    value._3    = return_val.delta_inactive_distance_km;
    (...)
    

    进入这个:

    return_val.delta_clear_flags = value._1;
    return_val.delta_inactive_time_ts.tv_sec = value._2._1;
    return_val.delta_inactive_time_ts.tv_nsec = value._2._2;
    return_val.delta_inactive_distance_km = value._3;
    (...)
    

    在文件的很多行上。

    我知道这看起来有点微不足道,但我在过去编写代码时遇到了很多情况,我以前需要这样做,而且我从来没有一个好的想法/方法可以做到这一点,不需要在vim中输入很多东西,或者写一个awk脚本。我想这是可能的通过一个一行在六。

    一句话的解释是非常受欢迎的,当我选择我接受的答案时会受到高度重视。:)

    4 回复  |  直到 6 年前
        1
  •  25
  •   CrashCodes    6 年前

    像这样:

    :%s/\([^=]*\)\s\+=\s\+\([^;]*\)/\2 = \1
    

    如果您的代码比示例中所示的代码更复杂,那么可能需要稍微处理一下。

    编辑:解释

    我们使用 s/ 找到 / 代替 康芒德这个 找到 部分让我们明白:

    1. 由除等号以外的任何符号组成的最长可能字符串,表示为 [^=]*
    2. …后跟一个或多个空格, \s\+ (额外的 \ 在前面 + 是个怪人)
    3. ……然后 = 还有任意数量的空格, =\s\+
    4. …后跟最长的非分号字符字符串, [^;]*

    然后我们放入几个捕获括号来保存构建替换字符串所需的内容,这就是 \( 东西 \) 句法

    最后,我们使用捕获的字符串 代替 部分 S/ 找到 / 代替 命令:那是 \1 \2 .

        2
  •  12
  •   wxs    15 年前

    为了兴趣起见,以下是我如何将其作为录制的宏执行的:

    qq0"+df=xA<BACKSPACE> = <ESC>"+pxi;<ESC>jq
    

    peforming在第一行设置“q”宏以执行所需的操作。然后,在随后的每一行中,您可以通过键入以下内容来执行宏:

    @q
    

    或者,假设您要将宏应用于以下10行:

    10@q
    

    我总是发现宏对于像这样的快速切换比计算regex更容易,因为它们本质上是我将如何手工操作的扩展。

    编辑 :dan olson在他的评论中指出,如果要将宏应用于一系列行,例如行6-100,则可以输入以下内容。我不知道是否有更简洁的语法不需要“.*”模式匹配。

    :6,100g/.*/normal @q
    

    宏的解释

    • QQ
      • 开始在寄存器Q中录制
      • 转到行首
    • “+ df=
      • 最多删除“=”,并将文本放入“+”寄存器
    • X
      • 删除多余空间
      • 转到行尾并进入插入模式
    • <BACKSPACE> = <ESC>
      • 删除分号,插入等号和空格
    • “+P
      • 将先前复制的测试插入寄存器“+”
    • 十一; <ESC & GT;
      • 重新插入尾随分号
    • J
      • 移到下一行,准备重新应用宏
    • Q
      • 停止录制
        3
  •  4
  •   user80168    15 年前
    :%s/^\s*\(.\{-}\)\s*=\s*\(.\{-}\)\s*;\s*$/\2 = \1;/
    

    应该工作得很好。

        4
  •  0
  •   Kit    6 年前
    :%s/\([^ =]*\)\s*=\s*\([^;]*\);/\2 = \1;/