zsh
最近1行のコードに出会いました。
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
...)の後には機能しません。他のいくつかのシェル構成も中断される可能性があります。($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
前に削除されます。