最近遇到了一行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
解释之前被删除。