Como tornar as linhas * sh mais curtas

7

Encontrei recentemente uma linha de zsh code

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

Isso não apenas queima meus olhos, está longe, muito acima do limite de 80 caracteres. Infelizmente, não vejo nenhuma maneira clara de encurtá-lo. Eu tenho muitas linhas como essa (feitas de substituições ridiculamente complicadas que não podem ser cortadas em pedaços). Qual é a maneira canônica de lidar com linhas como essas se eu quiser que elas sejam de < 80 caracteres.

    
por PythonNut 06.09.2014 / 19:13

2 respostas

2

Você pode quebrar linhas longas com escape de novas linhas , que é \ immediatelly seguido por uma nova linha:

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

AVISO

Embora você possa quebrar uma linha dessa maneira em quase todos os lugares, há exceções. Ele não funcionará dentro de um único texto entre aspas ou após o \ de uma seqüência de escape ( \n , \x40 , ...). Algumas outras construções de shell também podem quebrar: Se você tentar dividir entre ($PREFIX e :t) em seu exemplo, ele não funcionará corretamente.

    
por 08.09.2014 / 14:22
1

Você pode fazer algo como:

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)(?)*'
      }
  }
}}

As novas linhas delimitadas por caracteres de espaçamento são removidas antes de serem passadas para eval para interpretação.

    
por 09.09.2014 / 13:31

Tags