示例不好:
#main {
padding:0;
margin: 10px auto;
}
示例好:
#main {padding:0;margin:10px auto;}
我有很多CSS规则占用太多行。我无法弄清楚要使用的:%s/
命令。
答案 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
通过格式化程序运行整个文件。假设应该在整个文件中折叠非空行的运行。