代码之家  ›  专栏  ›  技术社区  ›  bigpotato

Vim:如何递归地对大括号之间的所有内容运行“:sort”?

  •  3
  • bigpotato  · 技术社区  · 9 年前

    我是一名网络开发人员,经常需要编写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中编写脚本来实现自动化。

    我该怎么跑 :sort 在所有大括号内的文件内的循环中,或 2) 在目录中的所有CSS文件中运行它?(任意一个)

    2 回复  |  直到 9 年前
        1
  •  9
  •   Community kfsone    7 年前

    @Edmund ,我会补充一个答案来解释 :g/{/+,/}/-sort 进一步的这个 :g 命令的语法为

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

    要考虑的初始范围为空,默认为搜索整个文件。模式是 { 其搜索开口撑杆。

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

    命令是余数。在这种情况下,ex命令是 +,/}/-sort 。这细分为可选范围(“ +,/}/- “)后跟命令( sort )在该范围内执行。该范围从当前行开始(由“ :克 “命令”)并前进一步( + 这将是同义词 +1 因为默认值是1)行。然后,“ , 将范围的开始和结束分开。要查找范围的第二行,我们向前搜索下一个右大括号( /}/ “),然后返回一行(” - “,同样等同于” -1 “)。现在我们已经将范围定义为“从找到的左大括号后面的行到右大括号前面的行”,我们执行 分类 在那个范围内执行命令。

        2
  •  8
  •   Marth    9 年前

    对于单个文件,您可以执行以下操作:

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

    它的作用:

    • :g/{/ :对于包含 {
    • normal! :进入正常模式( ! 只需跳过命令中的映射)
    • f{ :查找(首先,但这在css(?)中应该不是问题) {
    • viB :在大括号之间输入视觉模式
    • :sort :嗯…对视觉选择进行排序
    • ^M :按enter键(这是一个字符,请使用 <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 ,但如果缓冲区未被修改,则不会触发写入。