Anas Posted December 18, 2016 Posted December 18, 2016 Hi, Is it possible to make Scite fold functions within regions?
Developers Jos Posted December 18, 2016 Developers Posted December 18, 2016 Doesn't it do that already? Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
mLipok Posted December 18, 2016 Posted December 18, 2016 (edited) Try this following 2 steps: CTRL+LEFTMOUSEBUTTON on the "-" sign (folding sign on the left - near to #Region statement) and now ALT+LEFTMOUSEBUTTON on the same "+" folding sign. Edited December 18, 2016 by mLipok Signature beginning:* Please remember: "AutoIt"..... * Wondering who uses AutoIt and what it can be used for ? * Forum Rules ** ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Code * for other useful stuff click the following button: Spoiler Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API * ErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 * My contribution to others projects or UDF based on others projects: * _sql.au3 UDF * POP3.au3 UDF * RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF * SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane * Useful links: * Forum Rules * Forum etiquette * Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * Wiki: * Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX IE Related: * How to use IE.au3 UDF with AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskScheduler * IE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related: * How to get reference to PDF object embeded in IE * IE on Windows 11 * I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions * EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *I also encourage you to check awesome @trancexx code: * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuff * OnHungApp handler * Avoid "AutoIt Error" message box in unknown errors * HTML editor * winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/ "Homo sum; humani nil a me alienum puto" - Publius Terentius Afer"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming" , be and \\//_. Anticipating Errors : "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty." Signature last update: 2023-04-24
Anas Posted December 18, 2016 Author Posted December 18, 2016 @Jos It folds the regions but not the functions within them. #Region Already gets folded Func DoesNotFold() EndFunc #EndRegion @mLipok I'm looking for a way to have it fold all functions within all regions by default, like "fold.on.open=1" also, this will fold everything within the region, including the IF/While/For ...
Developers Jos Posted December 18, 2016 Developers Posted December 18, 2016 (edited) Folds fine for me: Don't think there is an option to fold one level lower on opening though. maybe a lua function could do that for you. Jos Edited December 18, 2016 by Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
Anas Posted December 18, 2016 Author Posted December 18, 2016 Now that I've re-read my OP, I realised I didn't specify that I want to do it using "View>Toggle all folds" and " fold.on.open=1"
Developers Jos Posted December 18, 2016 Developers Posted December 18, 2016 In case you or somenbody is interested in a LUA function for this: Add this code to file %localappdata%\AutoIt v3\SciTE\PersonalTools.lua: function PersonalTools:ToggleFoldLevel(x) if editor.Lexer == SCLEX_AU3 then -- clear output pane when debugging --~ output:ClearAll() fldonlev=tonumber(x) --~ print("### Fold toggle fold level ", fldonlev) local savlinlev1=-1 local fldinlev1=0 for a = 0, editor.LineCount-1, 1 do --~ print("--",a+1, editor.FoldLevel[a],editor.FoldParent[a],savlinlev1,fldinlev1) -- outside of a fold again if editor.FoldParent[a+1] < savlinlev1 then --~ print("End of fold block") savlinlev1=editor.FoldParent[a+1] fldinlev1=fldinlev1-1 elseif editor.FoldParent[a+1] > savlinlev1 then --~ print("Start of fold block") savlinlev1=editor.FoldParent[a+1] if fldonlev == fldinlev1 then --~ print("! Toggle fold for line ", a+1) editor:ToggleFold(a) end fldinlev1=fldinlev1+1 end end end end Add these lines to your Sciteuser.properties: the number behind the func is the level to toggle the fold for. #x lua test func command.name.41.$(au3)=ToggleFoldLevel command.mode.41.$(au3)=subsystem:lua,savebefore:no command.shortcut.41.$(au3)=Ctrl+Shift+F command.41.$(au3)=InvokeTool PersonalTools.ToggleFoldLevel 2 The shortcut Ctrl+Shift+f should now do a toggle fold for only the level 2 folds. Jos mLipok 1 SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
mLipok Posted December 18, 2016 Posted December 18, 2016 Very good solutions @Jos, Thanks. But as I remember long time ago I was thiniking about something like that but I would prefer little diferent behavior. So I dig in your code and in Scintilla Documentation and after 20 minute of learning I change a little: editor:FoldChildren(a, 2) -- editor:ToggleFold(a) here is complete changed lua script: function PersonalTools:ToggleFoldLevel(x) if editor.Lexer == SCLEX_AU3 then -- clear output pane when debugging --~ output:ClearAll() fldonlev=tonumber(x) --~ print("### Fold toggle fold level ", fldonlev) local savlinlev1=-1 local fldinlev1=0 for a = 0, editor.LineCount-1, 1 do --~ print("--",a+1, editor.FoldLevel[a],editor.FoldParent[a],savlinlev1,fldinlev1) -- outside of a fold again if editor.FoldParent[a+1] < savlinlev1 then --~ print("End of fold block") savlinlev1=editor.FoldParent[a+1] fldinlev1=fldinlev1-1 elseif editor.FoldParent[a+1] > savlinlev1 then --~ print("Start of fold block") savlinlev1=editor.FoldParent[a+1] if fldonlev == fldinlev1 then --~ print("! Toggle fold for line ", a+1) editor:FoldChildren(a, 2) -- editor:ToggleFold(a) end fldinlev1=fldinlev1+1 end end end end Try with this testing script and you will see the difference _Example1() #Region - 1 Func _Example1() If True Then ; Check here For $i = 1 To 2 _Example2() For $x = 1 To 2 _Example2() Next Next EndIf If False Then ; test2 ; test2 EndIf EndFunc ;==>_Example1 #EndRegion - 1 #Region - 2 Func _Example2() If True Then ; test1 ; test1 EndIf If False Then ; test2 ; test2 EndIf EndFunc ;==>_Example2 #EndRegion - 2 Just after using CTRL+SHIFT+F then try to unfold this line: If True Then ; Check here Cheers. mLipok Signature beginning:* Please remember: "AutoIt"..... * Wondering who uses AutoIt and what it can be used for ? * Forum Rules ** ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Code * for other useful stuff click the following button: Spoiler Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API * ErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 * My contribution to others projects or UDF based on others projects: * _sql.au3 UDF * POP3.au3 UDF * RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF * SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane * Useful links: * Forum Rules * Forum etiquette * Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * Wiki: * Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX IE Related: * How to use IE.au3 UDF with AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskScheduler * IE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related: * How to get reference to PDF object embeded in IE * IE on Windows 11 * I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions * EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *I also encourage you to check awesome @trancexx code: * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuff * OnHungApp handler * Avoid "AutoIt Error" message box in unknown errors * HTML editor * winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/ "Homo sum; humani nil a me alienum puto" - Publius Terentius Afer"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming" , be and \\//_. Anticipating Errors : "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty." Signature last update: 2023-04-24
Anas Posted December 19, 2016 Author Posted December 19, 2016 (edited) Thanks Jos, this is very handy. I use this LUA script to make Scite fold all first-levels throughout the script, and second-levels only in regions: function PersonalTools:ToggleFoldLevel() if editor.Lexer == SCLEX_AU3 then local InRgn = false for i = 0, editor.LineCount - 1 do local FoldLVL = editor.FoldLevel[i] local STR = editor:GetLine(i) if not InRgn and FoldLVL == 67183616 and string.starts(STR, "#Region") then InRgn = true elseif InRgn and FoldLVL == 67109889 and string.starts(STR, "#EndRegion") then InRgn = false end if FoldLVL == 1024 and (i+1) < editor.LineCount then print(i+1) print(FoldLVL) print(STR) print(InRgn) print("============") end if FoldLVL == 67183616 or (InRgn and FoldLVL == 67249153) then editor:FoldLine(i,0) end end end end function string.starts(String, Start) local success, value = pcall(string.sub,String,1,string.len(Start)) if success and value == Start then return true end return false end But I've a problem with it, after some lines (69 in this example), editor.FoldLevel it's stops returning the correct Fold-level value and just returns 1024: expandcollapse popupGlobal $T Func Func1() If $T Then Else EndIf EndFunc #Region 1 Func FuncInRegion1() If $T Then Else EndIf EndFunc #EndRegion Func Func2() If $T Then Else EndIf EndFunc Func Func3() If $T Then Else EndIf EndFunc Func Func4() If $T Then Else EndIf EndFunc Func Func5() If $T Then Else EndIf EndFunc Func Func6() If $T Then Else EndIf EndFunc Func Func7() If $T Then Else EndIf EndFunc Func Func8() If $T Then Else EndIf EndFunc If I use "View>Toggle all folds", it starts to work as expected. Edit: As a workaround, I reset fold.on.open=1 and renamed the func to OnOpen to call it at launch. Why is the output cleared when the function is called? even if I don't print anything. Edited December 19, 2016 by Anas
Developers Jos Posted December 19, 2016 Developers Posted December 19, 2016 @Anas, This version of my LUA script extracts just the Level number from the FoldLevel returned value and has your Region logic in it as well (a little modified to coupe with mixed case). Explanation can be found in the script and let me know when you have questions: expandcollapse popupfunction string.starts(String, Start) if String == nil then return false end String=string.lower(String) Start=string.lower(Start) local success, value = pcall(string.sub,String,1,string.len(Start)) if success and value == Start then return true end return false end function PersonalTools:ToggleFoldLevel(x) -- set to true when debugging --~ debug=true debug=false -- clear output pane when debugging if debug then output:ClearAll()end -- fldonlev=tonumber(x) if debug then print("### Fold toggle fold level ", fldonlev) end if debug then print("--","Line", "FoldLevel","FParent","fld+InR", "InRgn", "flp", "fl", "fln") end -- local vars local InRgn=0 -- loop through lines, starts at 0 for first line for a = 0, editor.LineCount-1, 1 do local STR = editor:GetLine(a) -- Explanation how editor.FoldLevel value is build up. we need the last 2 characters --~ enu FoldLevel=SC_FOLDLEVEL --~ val SC_FOLDLEVELBASE=0x400 --~ val SC_FOLDLEVELWHITEFLAG=0x1000 --~ val SC_FOLDLEVELHEADERFLAG=0x2000 --~ val SC_FOLDLEVELBOXHEADERFLAG=0x4000 --~ val SC_FOLDLEVELBOXFOOTERFLAG=0x8000 --~ val SC_FOLDLEVELCONTRACTED=0x10000 --~ val SC_FOLDLEVELUNINDENT=0x20000 --~ val SC_FOLDLEVELNUMBERMASK=0x0FFF (I only use the last 2 characters for level calculation -- get foldlevel previous line ( the "or 0" is to avoid a nil error) local foldlevp=tonumber(string.sub(string.format("%x",editor.FoldLevel[a-1]),6),16) or 0 -- get foldlevel current line local foldlev=tonumber(string.sub(string.format("%x",editor.FoldLevel[a]),6),16) or 0 -- get foldlevel next line local foldlevn=tonumber(string.sub(string.format("%x",editor.FoldLevel[a+1]),6),16) or 0 -- -- check for first level #Region and #EndRegion statements if foldlev==0 and string.starts(STR, "#Region") then InRgn = 1 if debug then print("+ Inside region")end elseif foldlev==1 and string.starts(STR, "#EndRegion") then InRgn = 0 if debug then print("- Outside region") end end if debug then print("--",a+1, editor.FoldLevel[a],editor.FoldParent[a],fldonlev + InRgn, InRgn, foldlevp, foldlev, foldlevn,STR) end -- -- check for lower fold level (Not used anymore in the logic) if foldlev < foldlevp then if debug then print("End of fold block") end end -- -- check for higher fold level if foldlevn > foldlev then if debug then print("Start of fold block") end -- check if toggle fold is needed for this level if fldonlev + InRgn == foldlevn then if debug then print("! Toggle fold for line ", a+1) end editor:ToggleFold(a) end end end end Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
Anas Posted December 19, 2016 Author Posted December 19, 2016 (edited) Hello Jos, Thank you for taking the time, but it seems that your example have the same "editor.FoldLevel" problem as well, at least for me: Start of fold block -- 65 67240962 63 1 0 1 2 2 -- 66 67175426 63 1 0 2 2 1 EndIf -- 67 67109889 60 1 0 2 1 0 EndFunc End of fold block -- 68 67109888 -1 1 0 1 0 0 End of fold block -- 69 1024 -1 1 0 0 0 0 Func Func8() -- 70 1024 -1 1 0 0 0 0 If $T Then -- 71 1024 -1 1 0 0 0 0 -- 72 1024 -1 1 0 0 0 0 Else -- 73 1024 -1 1 0 0 0 0 -- 74 1024 -1 1 0 0 0 0 EndIf -- 75 1024 -1 1 0 0 0 0 EndFunc -- 76 1024 -1 1 0 0 0 0 nil I found this old bug report that might explain it better. BTW, since "fold.on.open=1" fixes it, this bug doesn't matter to me anymore. But I'd like to stop Scite/Lua from clearing the output when the function is called. Is this possible? Edited December 19, 2016 by Anas
Developers Jos Posted December 19, 2016 Developers Posted December 19, 2016 (edited) I used you script to test and don't see the same values for FoldLevel. Start of fold block -- 65 67240962 63 1 0 1 2 2 -- 66 67175426 63 1 0 2 2 1 EndIf -- 67 67109889 60 1 0 2 1 0 EndFunc End of fold block -- 68 67109888 -1 1 0 1 0 0 End of fold block -- 69 67183616 -1 1 0 0 0 1 Func Func8() Start of fold block ! Toggle fold for line 69 -- 70 67249153 68 1 0 0 1 2 If $T Then Start of fold block -- 71 67240962 69 1 0 1 2 1 -- 72 67249153 68 1 0 2 1 2 Else End of fold block Start of fold block -- 73 67240962 71 1 0 1 2 2 -- 74 67175426 71 1 0 2 2 1 EndIf -- 75 67109889 68 1 0 2 1 0 EndFunc End of fold block -- 76 1024 -1 1 0 1 0 0 nil End of fold block Which version of SciTE are you using and do the actual folding indicators look correct for those lines in SciTE? Not sure whether there is an option to avoid clearing the OutputPane when using a LUA function... need a little research for that. Jos Edited December 19, 2016 by Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
Anas Posted December 19, 2016 Author Posted December 19, 2016 (edited) I had SciTE v.3.6.2.0, and updated to v.3.6.6.0 and still get the same results. No, the function is not folded in SciTE nor does the indicator look like it does. Did you have "fold.on.open" enabled when you tested? Edited December 19, 2016 by Anas
Developers Jos Posted December 19, 2016 Developers Posted December 19, 2016 Strange... Just now, Anas said: No, the function is not folded in SciTE. I meant whether you see the Folding marks for the lines that return 1024: Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
Anas Posted December 19, 2016 Author Posted December 19, 2016 1 minute ago, Jos said: I meant whether you see the Folding marks for the lines that return 1024: I Edit my previous post. I thought reinstalling SciTE would've solved it. Did you have "fold.on.open" enabled when you tested?
Developers Jos Posted December 19, 2016 Developers Posted December 19, 2016 11 minutes ago, Anas said: Did you have "fold.on.open" enabled when you tested? No, but tried that as well as well and don't see the behavior see and it still works as expected. Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now