使用vi,我如何将CSS规则制作成一个衬里?

时间:2009-09-14 17:19:04

标签: css regex vim replace

示例不好:

#main {
      padding:0;
      margin: 10px auto;
}

示例好:

#main {padding:0;margin:10px auto;}

我有很多CSS规则占用太多行。我无法弄清楚要使用的:%s/命令。

7 个答案:

答案 0 :(得分:16)

这是一个单行:

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

\_.匹配任何字符,包括换行符,\{-}*的非贪婪版本,因此{\_.\{-}}匹配一对匹配的花括号之间的所有内容,包容性。

\=允许您替换vim表达式的结果,我们在此处使用{从'\n'中删除匹配文本中的所有换行submatch(0) { {1}}功能。

反向(将单行版本转换为多行版本)也可以作为一个版本完成:

substitute()

答案 1 :(得分:11)

如果您处于规则的开头或结尾,V%J会将其加入一行:

  • 转到开头(或收盘)大括号
  • 点击V进入可视模式
  • 点击%以匹配其他大括号,选择整个规则
  • 点击J加入行

答案 2 :(得分:4)

尝试这样的事情:

:%s/{\n/{/g
:%s/;\n/;/g
:%s/{\s+/{/g
:%s/;\s+/;/g

这会在打开大括号和分号('{'和';')后删除换行符,然后删除连接行之间的额外空格。

答案 3 :(得分:4)

如果您想更改文件,请转到rampion's solution

如果您不想(或不能)更改文件,您可以使用自定义折叠,因为它允许选择显示折叠文本的内容和方式。例如:

" {rtp}/fold/css-fold.vim
" [-- local settings --]               {{{1
setlocal foldexpr=CssFold(v:lnum)
setlocal foldtext=CssFoldText()

let b:width1 = 20
let b:width2 = 15

nnoremap <buffer> + :let b:width2+=1<cr><c-l>
nnoremap <buffer> - :let b:width2-=1<cr><c-l>

" [-- global definitions --]           {{{1
if exists('*CssFold')
  setlocal foldmethod=expr
  " finish
endif

function! CssFold(lnum)
  let cline = getline(a:lnum)
  if     cline =~ '{\s*$'
      return 'a1'
  elseif cline =~ '}\s*$'
      return 's1'
  else
      return '='
  endif
endfunction

function! s:Complete(txt, width)
  let length = strlen(a:txt)
  if length > a:width
      return a:txt
  endif
  return a:txt . repeat(' ', a:width - length)
endfunction

function! CssFoldText()
  let lnum = v:foldstart
  let txt = s:Complete(getline(lnum), b:width1)
  let lnum += 1
  while lnum < v:foldend
      let add = s:Complete(substitute(getline(lnum), '^\s*\(\S\+\)\s*:\s*\(.\{-}\)\s*;\s*$', '\1: \2;', ''), b:width2)
      if add !~ '^\s*$'
          let txt .= ' ' . add
      endif

      let lnum += 1
  endwhile
  return txt. '}'
endfunction

我将田地的分类作为练习。提示:获取列表中v:foldstart + 1和v:voldend之间的所有行,对列表进行排序,构建字符串,这就是全部。

答案 4 :(得分:4)

我不会直接回答这个问题,而是建议你重新考虑你的需求。我认为你的“坏”例子实际上是更好的例子。它更易读,更容易推理和修改。良好的缩进不仅非常重要,不仅适用于编程语言,还适用于CSS和HTML。

你提到CSS规则“占用太多行”。如果你担心文件大小,你应该考虑使用像YUI Compressor这样的CSS / JS minifier,而不是让代码的可读性降低。

答案 5 :(得分:1)

执行此转换的便捷方法是运行以下简短操作 命令。

:g/{/,/}/j

答案 6 :(得分:0)

转到文件的第一行,并使用命令gqG通过格式化程序运行整个文件。假设应该在整个文件中折叠非空行的运行。