Как алфавитизировать CSS-файл в Vim - PullRequest
19 голосов
/ 16 июня 2010

Я получаю файл CSS:

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;
}

Я хочу В алфавитном порядке строк между {...}

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;
}

Я отображаю F7 , чтобы сделать это

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

Но мне нужно нажимать F7 снова и снова, чтобы закончить работу.
Если файл CSS большой, это отнимает много времени и легко скучает.
Я хочу получить cmds по трубопроводу. Так что я нажимаю F7 только один раз!
Любая идея? спасибо! * * 1023

Ответы [ 4 ]

40 голосов
/ 16 июня 2010
:g#\({\n\)\@<=#.,/}/sort

Пояснение:

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

Вы, конечно, можете сопоставить это с сочетанием клавиш или сделать из него команду:

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

" Or:

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

Тогда вы можете просто нажать F7 или запустить:

:SortCSSBraceContents
7 голосов
/ 16 июня 2010
nnoremap <S-F7> zRgg:while search("{$", 'W') \| .+1,/}$/-1sort \| endwhile<CR>

Вот что он делает:

  1. zR открывает все сгибы.
  2. gg перемещает курсор на первую строку.
  3. search("{$") ищет открывающую скобку в конце строки и перемещает курсор в найденную позицию.
  4. search(, 'W') предотвращает перенос search() на конец файла, поэтому он возвращает false после последнейнайденная позиция.
  5. .+1,/}$/-1 устанавливает диапазон «от одной строки после (+1) позиции курсора (.) до строки перед (-1) закрывающей скобкой в ​​конце строки(/}$/) ».
  6. sort сортирует, вы это знаете.
1 голос
/ 30 июня 2015

Для таблиц стилей SCSS:

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

Это ищет либо закрывающую фигурную скобку, либо другую открытую фигурную скобку и выбирает строку перед ней.

0 голосов
/ 20 марта 2017

Для отдельных файловых компонентов Vuejs, встроенного стиля и т. Д., Где требуется, чтобы команда выполнялась только внутри элемента:

:/<style>/,/<\/style>/:g#\({\n\)\@<=#.,/}/sort
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...