Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: iugin am Dienstag, 4. Oktober 2016, 09:46

Titel: Automatisch \include aus Ordner
Beitrag von: iugin am Dienstag, 4. Oktober 2016, 09:46
Hallo miteinander

ich bin sicher, die Lösung ist schon irgendwie im Forum, ich finde sie aber nicht :-)
Ich möchte eine Funktion, welche alle ly-Dateien in einem Ordner liest, und in Dokument einfügt.
Ok, ist sicher nicht klar so...
Also: ich habe ein Ordner, nennen wir es Ordner. Drin sind 3 Files: Music.ly, Song.ly, Trallala.ly.
Ich möchte ein Befehl haben wie z.B.:
\version "2.18.2"
\loadFiles "Ordner"
und Lilypond sieht das:
\version "2.18.2"
\include "Ordner/Music.ly"
\include "Ordner/Song.ly"
\include "Ordner/Trallala.ly
In Google habe ich etwas gesucht wie "Scheme list files directory" oder so, aber bin nicht wirklich findig geworden... :(

Einen lieben Gruss und danke

Eugenio
Titel: Re: Automatisch \include aus Ordner
Beitrag von: Manuela am Dienstag, 4. Oktober 2016, 10:52
Lösung habe ich keine, aber zwei Links, die vll. weiterhelfen

 Including a file only once (http://lsr.di.unimi.it/LSR/Item?id=657)
conditional include  (http://lilypond.1069038.n5.nabble.com/conditional-include-td140471.html)

Hier habe ich das gefunden (https://www.gnu.org/software/guile/manual/html_node/File-System.html)

Here is an example showing how to display all the entries in a directory:

(define dir (opendir "/usr/lib"))
(do ((entry (readdir dir) (readdir dir)))
    ((eof-object? entry))
  (display entry)(newline))
(closedir dir)
Titel: Re: Automatisch \include aus Ordner
Beitrag von: fugenkomponist am Dienstag, 4. Oktober 2016, 12:10
Auf Manuelas letzter Idee aufbauend:
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)))
Das bindet alles ein, was auf "ly" endet, also .ly- und .ily-Dateien, aber auch Verzeichnisse mit solchen Namen (die sollten also lieber nicht existieren).
Titel: Re: Automatisch \include aus Ordner
Beitrag von: iugin am Mittwoch, 5. Oktober 2016, 11:13
Hallo miteinander

danke für die Antworte :-)
Die Lösung von Fugenkomponist gibt mir folgenden Fehler:
Zitat
Analysieren.../usr/local/lilypond/usr/share/lilypond/current/scm/ly-syntax-constructors.scm:56:23: In expression (apply (ly:music-function-extract fun) parser ...):
/usr/local/lilypond/usr/share/lilypond/current/scm/ly-syntax-constructors.scm:56:23: Wrong number of arguments to #<procedure #f (dir-name)>
Wurde mit dem Return-Code 1 beendet.
Ist die Scheme-Funktion vielleicht für eine andere Version als Lilypond 2.18.2 gedacht?

Lieber Gruss

Eugenio
Titel: Re: Automatisch \include aus Ordner
Beitrag von: harm6 am Mittwoch, 5. Oktober 2016, 11:42
Yep, für 2.18.2 verwende:

#(define-void-function (parser location dir-name) (string?)
...


Gruß,
  Harm
Titel: Re: Automatisch \include aus Ordner
Beitrag von: fugenkomponist am Mittwoch, 5. Oktober 2016, 12:17
Oh, sorry, gleich zwei Fehler meinerseits (1. du hast ne Version angegeben und ich hab sie nicht beachtet, 2. ich hab meine Version nicht angegeben).

Es wär wirklich schön, wenn die 2.20 bald käme.
Titel: Re: Automatisch \include aus Ordner
Beitrag von: iugin am Mittwoch, 5. Oktober 2016, 12:56
Hallo miteinander

es läuft immer noch nicht:
Zitat
Analysieren.../Dokumente/Lilypond/Li_Einsingen/Einsingen.ly:15:12: In procedure ly:parser-include-string in expression (ly:parser-include-string (string-append "\\include \"" dir-name ...)):
/Dokumente/Lilypond/Li_Einsingen/Einsingen.ly:15:12: Wrong number of arguments to #<primitive-procedure ly:parser-include-string>
Wurde mit dem Return-Code 1 beendet.

:)

Lieber Gruss und danke

Eugenio
Titel: Re: Automatisch \include aus Ordner
Beitrag von: fugenkomponist am Mittwoch, 5. Oktober 2016, 12:59
Sorry, ly:parser-include-string braucht dann natürlich auch diesen parser als Argument, da hab ich nicht dran gedacht:\version "2.18.2"

loadFiles =
#(define-void-function (parser location 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
            parser
            (string-append
             "\\include \"" dir-name "/" entry "\""))))
     (closedir dir)))
Das sollte jetzt gehen, ist mit 2.18.2 getestet ;)
Titel: Re: Automatisch \include aus Ordner
Beitrag von: iugin am Mittwoch, 5. Oktober 2016, 19:08
Es läuft super, danke vielmals!

Lieber Gruss

Eugenio