Classifique todas as linhas

7

Quero classificar o seguinte com base em suas chaves

case IndexError:
    PyErr_SetString(PyExc_IndexError, exc.str.c_str());
    break;
case ValueError:
    PyErr_SetString(PyExc_ValueError, exc.str.c_str());
    break;
case RuntimeError:
    PyErr_SetString(PyExc_RuntimeError, exc.str.c_str());
    break;
case IOError:
    PyErr_SetString(PyExc_IOError, exc.str.c_str());
    break;

então se torna

case IOError:
    PyErr_SetString(PyExc_IOError, exc.str.c_str());
    break;
case IndexError:
    PyErr_SetString(PyExc_IndexError, exc.str.c_str());
    break;
case RuntimeError:
    PyErr_SetString(PyExc_RuntimeError, exc.str.c_str());
    break;
case ValueError:
    PyErr_SetString(PyExc_ValueError, exc.str.c_str());
    break;

Basicamente, estou apenas classificando as linhas

case IOError:
case IndexError:
case RuntimeError:
case ValueError:

O conteúdo das outras linhas (as que não começam com a case) não importa, mas quero que elas sejam classificadas com os casos.

Henricus V.
fonte
11
Uma solução secundária é que, como o conteúdo dos cases é semelhante, você pode regenerar tudo. Se os ordenados *Errors (de um enum? Talvez executado através sort(1)?), Então fazer uma macro que converte XErrorpara case XError: PyErr_SetString(PyExc_XError, exc.str.c_str()); break;e executá-lo para todos os valores de enumeração.
Shahbaz 01/07
Eu não usei isso sozinho, mas o vis.vim afirma fazer isso. (Leia a seção 4 no link.) Você pode fazer o download do vis.vim aqui.
J.

Respostas:

7

A maneira mais fácil: junte as linhas nos blocos lógicos antes de classificar.

Em detalhe:

  • marque as linhas
  • junte as linhas recuadas às linhas acima: :'<,'>s/\n /^A/
  • marque as linhas novamente: gv
  • classifique-os: :'<,'>sort
  • marque as linhas mais uma vez: gv
  • divida as linhas de volta e restaure o recuo: :'<,'>s/^A/\r /g

^Aacima é o caractere Ctrl-A(ASCII SOH). Pode ser qualquer caractere que não apareça nas linhas a serem classificadas, mas Ctrl-Ase encaixa na conta. Você pode inseri-lo como Ctrl-vCtrl-a.

Sato Katsura
fonte
2

Idéia: Vamos juntar o nnúmero de linhas em maiúsculas e minúsculas em uma única linha. Siga o processo para todos os casos. Em seguida, use a classificação para classificar os casos. Em seguida, recorte essas linhas e recue-as.

Passos:

1) Associe as nlinhas a seguir casedigitando isso. (no seu caso, n é 3)

:g/case / normal! 3gJ

2) Selecione todos os casos usando o modo visual. Pressione vot Vpara selecionar todos os casos. Pressione :. Aparecerá como :'<,'>. Digite a classificação.

:'<,'>sort

3) Coloque as linhas do caso embaixo. Selecione-os novamente pressionando gv.

:'<,'>s/\(;\|:\)    /&\r    /g

Isso divide as linhas do caso. Se as linhas não forem recuadas corretamente, você poderá alinhá-las selecionando gve depois ==.

Isso funciona para qualquer número de linhas, desde que você use as etapas personalizadas para sua finalidade.

SibiCoder
fonte