|
|
|
04-09-2016, 05:40 PM
|
#1
|
Human being with feelings
Join Date: Jun 2012
Posts: 2,173
|
Lua Question: Reading from REAPER.ini
Needed to get default layouts because ReaScript function returns "" when you call it on default tracks that have no layout applied. I used this. See any problems? Better way? I guess I'm stumped why I have to use f3-2. string.find(s,"\\n",f1,true) doesn't work.
Code:
function Fn_Get_Default_Layouts()
local f = io.open(reaper.get_ini_file(), "rb")
local s = f:read("*all")
f:close()
local f1,f2 = string.find(s,"layout_tcp=",1,true)
local f3 = string.find(s,"\n",f1,true)
local tcp_str = string.sub(s, f2+1, f3-2)
f1,f2 = string.find(s,"layout_mcp=",1,true)
f3 = string.find(s,"\n",f1,true)
local mcp_str = string.sub(s, f2+1, f3-2)
return tcp_str, mcp_str
end
|
|
|
04-10-2016, 02:52 AM
|
#2
|
Human being with feelings
Join Date: Jun 2012
Location: Spain
Posts: 7,239
|
if using SWS extensions, there is a function:
Code:
integer retval, string stringOut reaper.BR_Win32_GetPrivateProfileString(string sectionName, string keyName, string defaultString, string filePath)
BR] Equivalent to win32 API GetPrivateProfileString(). For example, you can use this to get values from REAPER.ini
|
|
|
04-10-2016, 12:16 PM
|
#3
|
Human being with feelings
Join Date: Jun 2012
Posts: 2,173
|
Doh! Should have control Fd ".ini" in there.
Thanks! It works, I think.
Code:
inipath = reaper.get_ini_file()
r1, tcp = reaper.BR_Win32_GetPrivateProfileString("reaper", "layout_tcp", "Error", inipath)
r2, mcp = reaper.BR_Win32_GetPrivateProfileString("reaper", "layout_mcp", "Error", inipath)
Any experience writing with the other one? I was thinking a script to get theme tweak color settings and apply them to a new version/update would save a lot of time. Scared, though.
Also...
"win32"
Does it work on mac?
|
|
|
04-10-2016, 02:19 PM
|
#4
|
Human being with feelings
Join Date: Jun 2012
Location: Spain
Posts: 7,239
|
create a backup of the ini file while testing, just in case. It should work perfectly to write too.
But since it says win32, I'm not sure if it is working in mac. I cannot afford a mac. Maybe someone else can confirm?
|
|
|
04-10-2016, 02:37 PM
|
#5
|
Human being with feelings
Join Date: May 2015
Location: Québec, Canada
Posts: 4,937
|
BR_Win32_GetPrivateProfileString works here on OS X.
|
|
|
04-10-2016, 07:19 PM
|
#6
|
Human being with feelings
Join Date: Jun 2012
Posts: 2,173
|
Thanks a million cfillion! hehe. I am going to use it in a script for Commala's theme thread and want it to be safe and good.
I couldn't resist trying to write new colors. (just for markers and regions as an experiment.) I guess it works, but looks like you have to restart Reaper to get it to take. Maybe it would be better to use copy paste? Maybe that's not even the best thing to do...
|
|
|
12-30-2017, 04:08 PM
|
#7
|
Human being with feelings
Join Date: Dec 2017
Posts: 152
|
FnA, how is your piece of code, "Fn_Get_Default_Layouts()" in the OP, licensed?
ps: sorry for the bump.. I tried sending you a pm, but it doesn't work for me
|
|
|
12-30-2017, 05:48 PM
|
#8
|
Human being with feelings
Join Date: Jun 2012
Posts: 2,173
|
Default?
I don't know much about such things. You can do what ever you like as far as I'm concerned...
I appreciate the question though. Funny about the PMs. Someone else has said they could not get through either, but others have been successful.
|
|
|
01-06-2018, 06:24 AM
|
#9
|
Human being with feelings
Join Date: Dec 2017
Posts: 152
|
Thank you. I've adapted your code to the following function. Successfully tested on linux.
Code:
-- @param String
-- @return String or nil
function bfut_FetchUserPreference(name)
local file = io.open(reaper.get_ini_file(),"rb")
local s = file:read("*all")
file:close()
local a,b = string.find(s,name.."=",1,true)
if a == nil then return nil end
local c = string.find(s,"\n",a,true)
return string.sub(s,b+1,c-1)
end
Crucially, it's c-1, instead of c-2 in the last line.
|
|
|
01-06-2018, 07:03 PM
|
#10
|
Human being with feelings
Join Date: Jun 2012
Posts: 2,173
|
Quote:
Originally Posted by tufb
Thank you. I've adapted your code to the following function. Successfully tested on linux.
Code:
-- @param String
-- @return String or nil
function bfut_FetchUserPreference(name)
local file = io.open(reaper.get_ini_file(),"rb")
local s = file:read("*all")
file:close()
local a,b = string.find(s,name.."=",1,true)
if a == nil then return nil end
local c = string.find(s,"\n",a,true)
return string.sub(s,b+1,c-1)
end
Crucially, it's c-1, instead of c-2 in the last line.
|
I know little of lua string handling. But what happens if you use -2 instead? Here, on Windows 7 x64 I get what appears to be the same thing, but there's an extra invisible something on the end, with -1. I saw something like that when I made the OP, but can't remember what really. Maybe the #str thing.
Code:
-- @param String
-- @return String or nil
function bfut_FetchUserPreference(name)
local file = io.open(reaper.get_ini_file(),"rb")
local s = file:read("*all")
file:close()
local a,b = string.find(s,name.."=",1,true)
if a == nil then return nil end
local c = string.find(s,"\n",a,true)
return string.sub(s,b+1,c-1)
end
-----------------------
str1 = bfut_FetchUserPreference("prefs_x")
str1len = #str1
str1q = string.format('%q', str1)
str2 = str1:gsub([[%c]],[[]])
str2len = #str2
str2q = string.format('%q', str2)
str3 = str1..str1..str1
reaper.MB(str3,"MB",0)
reaper.ShowConsoleMsg(str3)
I get:
"265"
4
""265\13""
"265"
3
""265""
265265265
in the IDE, for the first 7 things I added.
MB displays
265
265
265
Console shows 265265265
|
|
|
01-07-2018, 07:04 AM
|
#11
|
Human being with feelings
Join Date: Dec 2017
Posts: 152
|
Ach! That's the carriage return CR / line feed LF issue between Windows and Linux: https://en.wikipedia.org/wiki/Newline
EOL look like this:
linux/osx: \n
win: \r\n
In your script, CR is stripped from str2 by replacing all control characters. Incorporating this in the script as follows checks out on WINE (Win x64 version) and native Linux, for me. It's safer to specifically replace CR only. Also, gsub returns two values, so an additional line is needed.
Code:
-- @param name String
-- @return s String or nil
function bfut_FetchUserPreference(name)
local f = io.open(reaper.get_ini_file(),"rb")
local s = f:read("*all")
f:close()
local s1,s2 = string.find(s,name.."=",1,true)
if s1 == nil then return nil end
local s3 = string.find(s,"\n",s1,true)
s = s:sub(s2+1,s3-1):gsub("[\r]","")
return s
end
Last edited by tufb; 01-07-2018 at 05:36 PM.
|
|
|
01-07-2018, 07:07 PM
|
#12
|
Human being with feelings
Join Date: Jun 2012
Posts: 2,173
|
Well, I don't know how to thoroughly test it, but it seems to give numbers that match the string length, and file paths look ok.
|
|
|
01-13-2018, 02:41 PM
|
#13
|
Human being with feelings
Join Date: Dec 2017
Posts: 152
|
It's in use in one of my scripts, so I'll hear back in case of a mishap. Main purpose is really as fall-back option, to eliminate dependence on SWS.
I'll maintain this as a minimal example for string and number values on my GitHub. Now accepts keyname, section, and ini-path as parameters, thus may be used for all ini-formatted text files. Line comments, and trailing comments are ignored.
https://gist.github.com/bfut/3e738d9...91999d933ec407
Last edited by tufb; 10-17-2018 at 06:49 AM.
|
|
|
Thread Tools |
|
Display Modes |
Linear Mode
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -7. The time now is 03:11 PM.
|