Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: Manuela am Donnerstag, 11. Januar 2018, 19:46

Titel: Automatisches Include aller Dateien eines Ordners Sortierreihenfolge ändern wie?
Beitrag von: Manuela am Donnerstag, 11. Januar 2018, 19:46
Hi,

dieser Code fügt automatisch alle Dateien eines Unterordners als \include ein:

\version "2.19.80"

loadFiles =
#(define-void-function (dir-name) (string?)
   (let ((dir (opendir dir-name)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "ly" entry)
           (ly:parser-include-string
            (string-append
             "\\include \"" dir-name "/" entry "\""))))
     (closedir dir)))


Es scheint, dass die Reihenfolge umgedreht wird. Wie muss ich den Code ändern, damit die alphabetische Reihenfolge erhalten bleibt?

Vermutlich nur eine Scheme-Anweisung, leider habe ich schon länger nichts mehr in Scheme gemacht.
Titel: Antw:Automatisches Include aller Dateien eines Ordners Sortierreihenfolge ändern wie?
Beitrag von: Be-3 am Donnerstag, 11. Januar 2018, 21:34
Hallo Manuela,

die umgedrehte Reihenfolge liegt an ly:parser-include-string: der String wird quasi immer hinter die aktuelle "Cursorposition" geschrieben, so daß die eigentliche Reihenfolge genau umgekehrt ist, als man denken würde.

Als schnelle Lösung habe ich die Verzeichnis-Einträge zuerst in der Liste files gesammelt (schon gleich rückwärts) und erst am Ende und nach dem closedir die Einträge per ly:parser-include-string an den Parser übergeben.


\version "2.19.80"

loadFiles =
#(define-void-function (dir-name) (string?)
   (let ((dir (opendir dir-name))
         (files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "ly" entry)
           (set! files (append (list entry) files))))
     (closedir dir)
     (for-each (lambda (entry)
                 (ly:parser-include-string
                  (string-append
                   "\\include \"" dir-name "/" entry "\"")))
       files)))



Viele Grüße
Torsten
Titel: Antw:Automatisches Include aller Dateien eines Ordners Sortierreihenfolge ändern wie?
Beitrag von: Manuela am Donnerstag, 11. Januar 2018, 21:48
Danke für die rasche Antwort!  :)
Titel: Antw:Automatisches Include aller Dateien eines Ordners Sortierreihenfolge ändern wie?
Beitrag von: Manuela am Montag, 7. Januar 2019, 05:19
Ich habe den Scheme-Code ein wenig adaptiert, sodass alle Dateien, die im Namen den Text "foo" und "bar" enthalten, nicht inkludiert werden. Für den Fall, dass man bestimmte Dateien ausschließen will.

loadFiles =
#(define-void-function (dir-name) (string?)
   (let ((dir (opendir dir-name))
         (files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (and (string-suffix? "ly" entry) (not (string-match "foo" entry)) (not (string-match "bar" entry)))
           (set! files (append (list entry) files))))
     (closedir dir)
     (for-each (lambda (entry)
                 (ly:parser-include-string
                  (string-append
                   "\\include \"" dir-name "/" entry "\"")))
       files)))

\loadFiles "...Unterverzeichnisname..."