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
, ...) 뒤에는 작동하지 않습니다 . 일부 다른 쉘 구성도 중단될 수 있습니다. ($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
해석에 전달되기 전에 제거됩니다.