Wie man * sh Linien kürzer macht

7

Ich bin kürzlich auf eine zshCodezeile gestoßen

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

Dies verbrennt nicht nur meine Augäpfel, es liegt auch weit über der 80-Zeichen-Grenze. Leider sehe ich keinen klaren Weg, um es zu verkürzen. Ich habe viele Zeilen wie diese (aus lächerlich komplizierten Substitutionen, die nicht in Stücke geschnitten werden können). Was ist die kanonische Art, mit solchen Zeilen umzugehen, wenn ich möchte, dass sie <80 Zeichen lang sind?

PythonNut
quelle
2
Du machst \\nüberall.
Mikesserv
1
Der kanonische Weg besteht darin, Zeilen zu schreiben, die länger als 80 Zeichen sind.
Gilles 'SO - hör auf böse zu sein'

Antworten:

2

Sie können lange Zeilen durch maskierte Zeilenumbrüche unterbrechen , \gefolgt von einer neuen Zeile:

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

WARNUNG

Während Sie auf diese Weise fast überall eine Linie brechen können, gibt es Ausnahmen. Es wird nicht innerhalb eines einzigen zitierten Textes oder nach der Arbeit \einer Escape - Sequenz ( \n, \x40, ...). Einige andere Shell-Konstrukte können ebenfalls beschädigt werden: Wenn Sie versuchen, zwischen ($PREFIXund :t)in Ihrem Beispiel zu brechen , funktioniert dies nicht richtig.

Adaephon
quelle
Und wenn Sie Einrückungen verwenden, funktioniert dies in einigen Situationen möglicherweise nicht genau so, wie Sie es erwarten.
Ein CVn
@ MichaelKjörling Das stimmt. Einrückungen sind im Wesentlichen nur eine Reihe von Leerzeichen. Sie können also nur an Stellen einrücken, an denen Sie in der einzeiligen Version des Codes die gleiche Anzahl von Leerzeichen schreiben können: zwischen Wörtern (wie von der Shell erkannt)
Adaephon
1

Sie könnten so etwas tun wie:

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

Die Zeilenumbrüche, die von Abstandszeichen umgeben sind, werden entfernt, bevor sie evalzur Interpretation übergeben werden.

Stéphane Chazelas
quelle
Vielen Dank, dies könnte nützlich sein, hat aber zwei Mängel: 1. Es ist langsamer (verwendet einen Unterprozess) und 2. Es bricht Substitutionen, die tatsächlich Leerzeichen verwenden (wie ${param/ /)
PythonNut
@ PythonNut, guter Punkt. In der Bearbeitung finden Sie eine Alternative, die diese adressiert.
Stéphane Chazelas