如何使 *sh 行更短

如何使 *sh 行更短

最近遇到了一行zsh代码

ls_colors_parsed=${${(@s.:.)LS_COLORS}/(#m)\**=[0-9;]#/${${MATCH/(#m)[0-9;]##/$MATCH=$MATCH=04;$MATCH}/\*/'=(#b)($PREFIX:t)(?)*'}}

这不仅让我眼花缭乱,而且远远超过了 80 个字符的限制。不幸的是,我没有看到任何明确的方法来缩短它。我有很多这样的行(由极其复杂的替换组成,无法分割)。如果我希望它们的长度小于 80 个字符,那么处理此类行的规范方法是什么?

答案1

您可以通过以下方式打破长行转义换行符\紧接着是一个换行符:

ls_colors_parsed=${${(@s.:.)LS_COLORS}/(#m)\**=[0-\
9;]#/${${MATCH/(#m)[0-9;]##/$MATCH=$MATCH=04;$MATC\
H}/\*/'=(#b)($PREFIX:t)(?)*'}}

警告

虽然几乎在任何地方都可以用这种方式换行,但也有例外。它不适用于单引号文本内或\转义序列 ( \n, \x40, ...) 之后。其他一些 shell 结构也可能会中断:如果您在示例中将try to break 放在($PREFIX和之间,它将无法正常工作。:t)

答案2

你可以这样做:

setopt extendedglob
alias 'verbose{{=read -rd "" -u9 _code 9<<-"}}";\
  eval "${_code//[[:space:]]#$'\''\n'\''[[:space:]]#}"'

verbose{{
  ls_colors_parsed=${
    ${(@s.:.)LS_COLORS}
      /(#m)\**=[0-9;]#
      /${
          ${MATCH
            /(#m)[0-9;]##
            /$MATCH=$MATCH=04;$MATCH
          }
            /\*
            /'=(#b)($PREFIX:t)(?)*'
      }
  }
}}

被空格字符包围的换行符在传递给eval解释之前被删除。

相关内容