2010-06-16 7 views
19

je reçois un fichier CSS:Comment alphabétiser un fichier CSS dans vim

div#header h1 { 
    z-index: 101; 
    color: #000; 
    position: relative; 
    line-height: 24px; 
    margin-right: 48px; 
    border-bottom: 1px solid #dedede; 
    font-size: 18px; 
} 

div#header h2 { 
    z-index: 101; 
    color: #000; 
    position: relative; 
    line-height: 24px; 
    margin-right: 48px; 
    border-bottom: 1px solid #dedede; 
    font-size: 18px; 
} 

Je veux alphabétiser lignes entre la {...}

div#header h1 { 
    border-bottom: 1px solid #dedede; 
    color: #000; 
    font-size: 18px; 
    line-height: 24px; 
    margin-right: 48px; 
    position: relative; 
    z-index: 101; 
} 

div#header h2 { 
    border-bottom: 1px solid #dedede; 
    color: #000; 
    font-size: 18px; 
    line-height: 24px; 
    margin-right: 48px; 
    position: relative; 
    z-index: 101; 
} 

I Plan F7 pour ce faire

nmap <F7> /{/+1<CR>vi{:sort<CR> 

Mais je dois appuyer sur F7 encore et encore pour faire le travail.
Si le fichier CSS est grand, il est facile de s'ennuyer & prend du temps.
Je veux que les cmds soient canalisées. Pour cela, je n'appuie qu'une fois sur F7!
Une idée? Merci!

+0

Comment est-ce exactement hors sujet, plus près? –

+0

il est vraiment cool que cela soit possible, mais cela a le potentiel de causer beaucoup de nouveaux bogues liés à CSS avec des attributs qui ont été définis dans un ordre spécifique – travis

Répondre

40
:g#\({\n\)\@<=#.,/}/sort 

Explication:

g  " Work over the whole file running .,/}/sort on each line that matches 
     " the pattern \({\n\)\@<= 
#...#... " Delimiters: first bit is search pattern, second bit is what 
     " to do on each matching line 
\(  " Grouping, containing: 
    {\n " Open brace followed by new line 
\)  " End of grouping 
\@<=  " Negative look-behind, so match after the new-line, but make sure that 
     " the match point is preceded by an open brace and a new-line 

.,/}/ " From this line to the next closing brace... 
sort  " Sort the lines 

Vous pouvez de la carte bien sûr à un raccourci clavier ou en faire une commande:

:nmap <F7> :g#\({\n\)\@<=#.,/}/sort<CR> 

" Or: 

:command! SortCSSBraceContents :g#\({\n\)\@<=#.,/}/sort 

Ensuite, vous pouvez simplement frapper F7 ou exécuter:

:SortCSSBraceContents 
+3

ouf! c'est super!! –

+0

Le seul hic, c'est que si je lance ceci dans un dicton, un fichier HTML avec CSS et Javascript, il essaie aussi de trier tous mes objets JS. –

+1

Avez-vous des idées sur la façon de trier les valeurs -webkit- et -moz- à proximité, mais toujours avant leurs homologues inter-navigateurs? J'utilise la fonction "sort {pattern}" pour ignorer le truc - * - lors du tri, mais ne commande pas alors le -moz/-webkit/(real) comme je le ferais: sort/\ s * \ (- \ a * - \\ | \) / –

7
nnoremap <S-F7> zRgg:while search("{$", 'W') \| .+1,/}$/-1sort \| endwhile<CR> 

C'est ce qu'il fait:

  1. zR ouvre tous les plis.
  2. gg déplace le curseur sur la première ligne.
  3. search("{$") recherche l'accolade ouvrante à la fin de la ligne et déplace le curseur jusqu'à la position trouvée.
  4. search(, 'W') empêche search() d'envelopper sur la fin du fichier, de sorte qu'il retournera faux après la dernière position trouvée.
  5. .+1,/}$/-1 définit la plage de «d'une ligne après (+1) la position du curseur (.) vers la ligne avant (-1) l'accolade de fermeture à la fin de la ligne (/}$/)».
  6. sort sortes, vous le savez.
1

Pour SCSS stylesheets:

:g#\({\n\)\@<=#.,/\.*[{}]\@=/-1 sort

Cela ressemble soit pour une accolade fermante ou une autre accolade ouverte et sélectionne la ligne devant lui.

0

Pour les composants seul fichier Vuejs, le style en ligne, etc - où vous avez besoin pour exécuter la commande uniquement dans l'élément:

:/<style>/,/<\/style>/:g#\({\n\)\@<=#.,/}/sort 
Questions connexes