Vim:我将如何以递归方式运行":sort"花括号之间的一切?

时间:2015-08-01 16:42:44

标签: css vim

我是网络开发人员,我经常要编写CSS:

我总是按字母顺序对样式进行排序,以便:

.sorted_product_mens_color_list li, .sorted_product_womens_color_list li {
    margin: 0 5px 0 5px;
    padding: 5px;
    border: 2px solid black;
}

变成:

.sorted_product_mens_color_list li, .sorted_product_womens_color_list li {
    border: 2px solid black;
    margin: 0 5px 0 5px;
    padding: 5px;
}

然而,这是重复的,我想通过编写一个在VIM中执行此操作的脚本来自动化它。

我如何1)在所有大括号内的文件循环中运行:sort或 2)在目录中的所有CSS文件中运行它? (任何一个)

2 个答案:

答案 0 :(得分:9)

@Edmund的请求,我会添加一个答案,以进一步解释:g/{/+,/}/-sort:g命令的语法是

:{range}g/pattern/{ex command(s)}

要考虑的初始范围是空白的,默认搜索整个文件。模式为{,用于搜索左大括号。

:g/{/{ex command(s)}

该命令是余数。在这种情况下,该ex命令是+,/}/-sort。这会分解为可选范围(" +,/}/-"),然后是在该范围内执行的命令(sort)。该范围从当前行开始(由" :g"命令找到)并前进一个(+,它与+1同义,因为默认值为1)线。那么" ,"将范围的开始与范围的结尾分开。为了找到范围的第二行,我们向前搜索下一个右括号(" /}/")然后返回一行(" -&# 34;,再次等同于" -1")。现在我们已经从我们找到的左大括号后面的行中定义了范围,通过右大括号之前的行#34;,我们在该范围内执行sort ex命令

答案 1 :(得分:8)

对于单个文件,您可以这样做:

:g/{/normal! f{viB:sort^M

这是做什么的:

  • :g/{/:对于包含{
  • 的每一行
  • normal!:进入正常模式(!只是跳过命令中的映射)
  • f{:找到(首先,但这不应该是css(?)中的问题){
  • viB:在大括号
  • 之间进入可视模式
  • :sort:嗯...对视觉选择进行排序
  • ^M:按回车键(这是一个字符,请使用<C-v><CR>键入)

对于您可以执行的多个文件:

# From you shell
# In zsh you would use 'vim **/*.css' to open all the css files in nested directories
# Not sure about your shell
$> vim *.css     # open css files in the current directory
" In vim
:argdo g/{/normal! f{viB:sort^M:update^M

:update:write相同,但如果未修改缓冲区则不会触发写入。