Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet 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
-
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)
-
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).
-
Hallo miteinander
danke für die Antworte :-)
Die Lösung von Fugenkomponist gibt mir folgenden Fehler:
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
-
Yep, für 2.18.2 verwende:
#(define-void-function (parser location dir-name) (string?)
...
Gruß,
Harm
-
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.
-
Hallo miteinander
es läuft immer noch nicht:
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
-
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 ;)
-
Es läuft super, danke vielmals!
Lieber Gruss
Eugenio