*sh 行を短くする方法

*sh 行を短くする方法

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前に削除されます。

関連情報