根据案例标签对案例代码块进行排序

时间:2014-07-10 08:06:35

标签: vim

如何根据案例标签对每个案例(作为大型案例构造的一部分)关联的代码块进行排序?

我想要的是改造 -

switch(val)
{
    case C_LABEL:
        /* do something */
        break;

    case A_LABEL:
        /* do something else*/
        break;

    case B_LABEL:
        /* do something really different */
        break;

    default:
        printf("'val' not recognized");
}

进入 -

switch(val)
{
    case A_LABEL:
        /* do something else */
        break;

    case B_LABEL:
        /* do something really different */
        break;

    case C_LABEL:
        /* do something */
        break;

    default:
        printf("'val' not recognized");
}

4 个答案:

答案 0 :(得分:4)

  1. 将每个箱子变成一个班轮:

    :fromline,tolineg/case/.,/break/s/\n/§
    
  2. 对它们进行排序:

    :fromline,tolinesort
    
  3. 重新格式化:

    :fromline,tolines/§/\r/g
    
  4. 注意:

    • 可视模式可以是定义这些命令范围的实用方法。
    • 如果你必须经常这样做,你可以制作一个宏。

答案 1 :(得分:2)

我的AdvancedSorters plugin简化了@ romainl答案中列出的步骤:

:/^switch/+2,/default:/-1 SortRangesByHeader /case /

初始范围限制了对case部分的行的排序。插件中的:SortRangesByHeader命令根据case语句定义范围,并对其进行排序。

答案 2 :(得分:1)

有一些外界的帮助:

:command! -range SortCases execute "<line1>,<line2>!ruby -e 'puts STDIN.read.split(/(?<=\\n)(?=[\\x20\\x09]*(?:case|default)\\b)/).sort'"

然后你可以vi{:SortCases<CR>做你需要做的事。

答案 3 :(得分:1)

我用以下命令编写了一个插件来执行此操作:

:SortBlockBy case

检查出来 https://github.com/chiedo/vim-sort-blocks-by