On Mac OS X, you can easily read and write to the preference .plist files using the 'defaults' command. I didn't find anything on parsing the results in Tcl, so I quickly wrote up a script to parse an array of filenames like you'd use to store a "Recent Files" list.
set domain "recentfilestext"
set key "recentfiles"
catch {exec defaults write $domain $key -array patch.pd another.pd "file with spaces.txt" "file, with,commas.pd" oneword.txt anotherpatch.pd}
if {![catch {exec -- defaults read $domain $key} arr]} {
puts "arr $arr"
set filelist $arr
regsub -all -- {",\s+"} $filelist {" "} filelist
regsub -all -- {\n} $filelist {} filelist
regsub -all -- {^\(} $filelist {} filelist
regsub -all -- {\)$} $filelist {} filelist
puts "filelist: $filelist"
foreach file $filelist {
puts "file: $file"
}
}Or something more like a library:
#!/usr/bin/tclsh
proc defaults_delete {domain key} {
if {[catch {exec defaults delete $domain $key} errorMsg]} {
puts stderr $errorMsg
}
}
proc defaults_write {domain key value} {
if {[catch {exec defaults write $domain $key $value} errorMsg]} {
puts stderr $errorMsg
}
}
proc defaults_write_array_add {domain key arrayElement} {
if {[regexp -- {[\(\)\{\}]} $arrayElement match]} {
set arrayElement '$arrayElement'
}
if {[catch {exec defaults write $domain $key -array-add "$arrayElement"} errorMsg]} {
puts stderr "ERROR: defaults_write_array_add $domain $key: $errorMsg"
}
}
proc defaults_read {domain key} {
if {![catch {exec -- defaults read $domain $key} arr]} {
set filelist $arr
regsub -all -- {",\s+"} $filelist {" "} filelist
regsub -all -- {\n} $filelist {} filelist
regsub -all -- {^\(} $filelist {} filelist
regsub -all -- {\)$} $filelist {} filelist
regsub -all -- {^\s+} $filelist {} filelist
regsub -all -- {\s+$} $filelist {} filelist
return $filelist
}
}
proc create_test_data {domain key} {
set filenames {patch.pd another.pd "file with spaces.txt" "file, with,commas.pd" \
oneword.txt anotherpatch.pd "file with (parens).mov"}
foreach filename $filenames {
defaults_write_array_add $domain $key $filename
}
}
set domain "testy"
defaults_delete $domain recentfiles
defaults_read $domain recentfiles
create_test_data $domain recentfiles
defaults_write $domain singlekey "single value"
puts "singlekey = [defaults_read $domain singlekey]"
puts "recentfiles = [defaults_read $domain recentfiles]"
foreach filename [defaults_read $domain recentfiles] {
puts "\tfile: $filename"
}