Vim:我怎么会递归地运行":排序"花括号之间的所有东西?

big*_*ato 3 css vim

我是一名Web开发人员,我经常要编写CSS:

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

.sorted_product_mens_color_list li, .sorted_product_womens_color_list li {
    margin: 0 5px 0 5px;
    padding: 5px;
    border: 2px solid black;
}
Run Code Online (Sandbox Code Playgroud)

变成:

.sorted_product_mens_color_list li, .sorted_product_womens_color_list li {
    border: 2px solid black;
    margin: 0 5px 0 5px;
    padding: 5px;
}
Run Code Online (Sandbox Code Playgroud)

但是,这是重复的,我想通过编写在VIM中执行此操作的脚本来自动化它.

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

Gum*_*nos 9

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

:{range}g/pattern/{ex command(s)}
Run Code Online (Sandbox Code Playgroud)

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

:g/{/{ex command(s)}
Run Code Online (Sandbox Code Playgroud)

该命令是余数.在这种情况下,该ex命令是+,/}/-sort.这会分解为可选范围(" +,/}/-"),后跟命令(sort)以在该范围上执行.该范围从当前行开始(由" :g"命令找到)并向前移动一行(+这将是+1默认值为1的同义词)行.然后" ,"将范围的开始与范围的结束分开.为了找到范围的第二行,我们向前搜索下一个右括号(" /}/"),然后返回一行(" -",再次等同于" -1").现在我们已经将范围定义为"从我们找到的开口支撑之后的线,通过关闭支撑之前的线",sort 该范围的前命令.


Mar*_*rth 8

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

:g/{/normal! f{viB:sort^M
Run Code Online (Sandbox Code Playgroud)

这是做什么的:

  • :g/{/ :对于包含a的每一行 {
  • 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
Run Code Online (Sandbox Code Playgroud)
" In vim
:argdo g/{/normal! f{viB:sort^M:update^M
Run Code Online (Sandbox Code Playgroud)

:update是相同的:write,除了如果没有修改缓冲区它不会触发写入.

  • 为此,我更喜欢在整个过程中使用`ex`命令:`:g/{/ +,/}/ - sort`这对我来说似乎更简单.找到带有"{"的行,在下一行("+")开始一个范围,通过前一行(" - ")下一行"}",对它们进行排序. (3认同)