Using Vim, how can I make CSS rules into one liners?

If you are at the beginning or end of the rule, V%J will join it into a single line:

  • Go to the opening (or closing) brace
  • Hit V to enter visual mode
  • Hit % to match the other brace, selecting the whole rule
  • Hit J to join the lines

Here's a one-liner:

:%s/{\_.\{-}}/\=substitute(submatch(0), '\n', '', 'g')/

\_. matches any character, including a newline, and \{-} is the non-greedy version of *, so {\_.\{-}} matches everything between a matching pair of curly braces, inclusive.

The \= allows you to substitute the result of a vim expression, which we here use to strip out all the newlines '\n' from the matched text (in submatch(0)) using the substitute() function.

The inverse (converting the one-line version to multi-line) can also be done as a one liner:

:%s/{\_.\{-}}/\=substitute(submatch(0), '[{;]', '\0\r', 'g')/