Jump to content

Recommended Posts

When ever you hover your mouse over a native function, user defined function, or an AutoItObject method then you will see the calltip for that function. 

Click "Like This" if you found this useful!

To use this just place the following lua file in the "...AutoIt3SciTELUA" directory. 

MouseHoverCalltips.zip

downloads:216

After you have done that then open SciTE and click 'Options' --> 'Open Lua Startup Script' and paste this line after the other lines (may require administrative rights):

LoadLuaFile("MouseHoverCallTips.lua")

Updates and changes:

[09/25/2014] Rewritten using the official AutoItGoToDefinition.lua!  Now all function and object method calltips are presented!  Most exciting update yet!

Edit: forgot to mention that this only works for those who have the latest AutoIt3 beta installed.

Edit 2: Now works for functions marked Volatile.  Also works on first open.

Edit3: Non-Volatile functions work too now again.

Edit4: Should finally work now!

[06/10/2014]  Calltips for AutoItObject methods should be a lot less error prone and much faster!

Edit: Fixed an issue with AutoItObject methods.

08/06/2013: OK.  Fixed the unexpected bugs. Damned bugs.  Now you should be able to create your AutoItObjects and then hover over their method names and properties for calltips!  For instance $oObject.MyProperty.MyMethod()  Hover over MyProperty to see what is stored there and over MyMethod to see the calltip for that function.

08/05/2013: Now you can view the function calltips for your AutoItObject Com methods and also see the value stored in your AIO COM properties!  Also fixed some inconsistencies in the code and improved other aspects etc.

08/04/2013: Added AutoItObject COM Functions!   Here are a couple of files to test the latest update: Test Files.

03/18/2013: Function "table_contains" added.

03/17/2013: Untested bug fix as reported by Sunaj.

03/02/2013: Bug fix as reported by Sunaj where the function that extracted the name of an include from a line would not work if there was not a space after "#include".

11/04/2012: I fixed it again.

10/26/2012: I breath another sigh.

10/20/2012: Fixed a bug that caused SciTE to lockup when using CTRL+J to access a native function or ALT+I to access a native include. Also, fixed a bug where if a function name was mentioned in the description for another different function then the calltip for the different function was displayed.

10/13/2012: More efficient and less code.

10/11/2012: Now when you type a new include line that include is added to the list of includes to be searched for function definitions. Also, even more efficient.

10/10/2012: No new features but a few bugs have been squashed and some inefficiencies eliminated. So, one bug was that if you have an include in the main file but not in another file and you use a function from the include in the second file then it wouldn't show the calltip though the function is in scope. That works now. Also, when the include table was generated there were a lot of duplicate entries. No longer! Behold, for they are trimmed (mostly, it's still buggy). Anyhoo, enjoy!

10/07/2012: Now all of the include files in a project are searched for user defined functions!

10/01/2012: Pattern matching allowed for the elimination of several functions. Hopefully more efficient. Also, calltips found in the api files are loaded once at startup into a table. Also, added the same thing but for the list of includes. Also, calltips now self cancel when you move the mouse again because I forgot that I was asked to make it do that.

09/27/2012: Tried my hand at implementing a basic proof of concept for finding function definitions in extralocal au3 files as requested by >D4RKON3. Consider this a beta trial and please tell me your thoughts, problems, etc. One difference now is the calltip window doesn't disappear as soon as you move your mouse. You have to click the mouse first. Also, when you define your own function then a comment at the end of the definition will be displayed as a calltip. Example:

func my_function_name(const $my_parameter) ; This is a description of the function.

Will become:

my_function_name(const $my_parameter)
This is a description of the function.

Here are a set of au3 files to test the latest update:

09/23/2012: I implemented a very basic, rudimentary implementation of a feature requested by trancexx. She wanted calltips for functions which were defined in the currently edited file. Give it a try, it might work! YAY! Using OnUpdateUI eliminates the need to switch buffers on every new session. May not be the most elegant solution. =P

Update: Valik greatly simplified and made it robust. Thank you!

Update: Back in business!

Update: Ah yes, debug statements. I should probably start using more of those.

Edited by jaberwacky
Link to post
Share on other sites
  • Replies 109
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

When ever you hover your mouse over a native function, user defined function, or an AutoItObject method then you will see the calltip for that function.  Click "Like This" if you found this useful!

Good job, a really really really god job. I know it's not your duty to do what others say, but I have a feature request that may be even impossible, but worth hearing! For me, I usually keep my funct

Our chitchat reminded me of Sandra Bullock + Stallone film Demolition Man or something, when she says "Let's blow this guy!", and Stallone says "...away! Dammit away!" So, don't make me blow you.

Can you add a timer or something to make the tip go away after some time if mouse isn't over a function?

I think that's what the OnDwellEnd function is for.

Another thing I thought of though, I think there's a way to use the lexer to tell what kind of word you are hovering. You should restrict the calltips to words the lexer identifies as functions so you don't get random calltips from comments or strings, etc.

Link to post
Share on other sites

That is what onDwellEnd is for but it's either messed up or I am using it wrong (most likely). I'll look into the timer as an alternative.

I looked into that lexer and I can't make heads or tails of it. I kinda have an idea of what's going on. You find out what kind of word you're at in the file (variable, function, comment, etc) and then you give that information to the styler along with a start position which takes over from there.

Edited by LaCastiglione
Link to post
Share on other sites

Here's where the strangeness comes in: you have to switch buffers before it will work on first load.

That's the opposite of the initial behavior. (working on a file/buffer after a file open, but not after switching buffers).

Maybe you need to use both OnOpen() and OnSwitchFile().

"Straight_and_Crooked_Thinking" : A "classic guide to ferreting out untruths, half-truths, and other distortions of facts in political and social discussions."
"The Secrets of Quantum Physics" : New and excellent 2 part documentary on Quantum Physics by Jim Al-Khalili. (Dec 2014)

"Believing what you know ain't so" ...

Knock Knock ...
 

Link to post
Share on other sites

I tried this but nothing doing:

MouseHoverCallTips = EventClass:new(Common)



function MouseHoverCallTips:OnOpen(path)

    MouseHoverCallTips:initialize_mouse_dwell()

    return true

end



function MouseHoverCallTips:OnSwitchFile(path)

    MouseHoverCallTips:initialize_mouse_dwell()

    return true

end



function MouseHoverCallTips:initialize_mouse_dwell()

    local mousehover_calltips_dwelltime = tonumber(props["mousehover.calltips.dwelltime"])



    if (mousehover_calltips_dwelltime == nil) then

        mousehover_calltips_dwelltime = 700 -- default

    end



    scite.SendEditor(SCI_SETMOUSEDWELLTIME, mousehover_calltips_dwelltime)



    return true

end



function MouseHoverCallTips:OnDwellStart(position, word)

    if (word == "") then

        return nil

    end



    local directory = props["SciteDefaultHome"] .. "apiau3.api"



    local file = io.open(directory, "r")



    local parens_start

    local parens_end

    local char_start

    local char_end



    for line in file:lines() do

        if (string.find(line, word)) then

            -- filter out entries ending with ?4, ?3, ?2, & ?1

            for var = 1, 4 do

                char_start, char_end = string.find(line, '?' .. var)



                if (char_start ~= nil) then

                    file:close()

                    return nil

                end

            end



            parens_start, parens_end = string.find(line, "%)")

            if (parens_start ~= nil) then

                line = string.gsub(line, "%)", "%)n", 1)

            end



            file:close()



            scite.SendEditor(SCI_CALLTIPSHOW, position, line)



            return true

        end

    end



    file:close()



    return true

end



function MouseHoverCallTips:OnDwellEnd()

    scite.SendEditor(SCI_CALLTIPCANCEL)

    return true

end

Edited by LaCastiglione
Link to post
Share on other sites

I looked into that lexer and I can't make heads or tails of it. I kinda have an idea of what's going on. You find out what kind of word you're at in the file (variable, function, comment, etc) and then you give that information to the styler along with a start position which takes over from there.

You don't have to understand the lexer I think. Just read the style of the first character of your word with SCI_GETSTYLEAT

*GERMAN* [note: you are not allowed to remove author / modified info from my UDFs]My UDFs:[_SetImageBinaryToCtrl] [_TaskDialog] [AutoItObject] [Animated GIF (GDI+)] [ClipPut for Image] [FreeImage] [GDI32 UDFs] [GDIPlus Progressbar] [Hotkey-Selector] [Multiline Inputbox] [MySQL without ODBC] [RichEdit UDFs] [SpeechAPI Example] [WinHTTP]UDFs included in AutoIt: FTP_Ex (as FTPEx), _WinAPI_SetLayeredWindowAttributes

Link to post
Share on other sites

Just read the style of the first character of your word with SCI_GETSTYLEAT

Doh! I understand now. I do that from lua. Excellent. Thank you!

Edit: Ok, I did it and it works great! OP updated.

Edited by LaCastiglione
Link to post
Share on other sites

I tried this but nothing doing: ...

It should. (CQ: working for me.)

- OnOpen(): run's on every file that's loaded while scite is starting. And on files that are user loaded after the scite startup.

But note that OnSwitchFile() is also run on the active file/buffer if its not the last loaded file at scite startup. (and not on user loaded files/buffers ... until you switch buffers of course.)

PS: is OnDwellEnd() active? ... or not yet, as its never executed.on this side.

---

(I'm not sure what behavior's are scite4autoit related or native scites related.)

Edited by MvGulik

"Straight_and_Crooked_Thinking" : A "classic guide to ferreting out untruths, half-truths, and other distortions of facts in political and social discussions."
"The Secrets of Quantum Physics" : New and excellent 2 part documentary on Quantum Physics by Jim Al-Khalili. (Dec 2014)

"Believing what you know ain't so" ...

Knock Knock ...
 

Link to post
Share on other sites

AFAIK there is no OnDwellEnd(). OnDwellStart() is called with an empty string to signify that event according to the old documentation I read. If there is an event in later SciTE then the Events class isn't invoking it on inherited classes unless Jos caught it and added it.

Link to post
Share on other sites

Heh. You know something. I'm looking at the documentation again. I have no idea where I got onDwellEnd. Maybe my brain wished for something like that and tried to make it so.

Doh.

"OnDwellStart will receive the position of the mouse and the word under the mouse as arguments and the word will be empty when the mouse starts moving." So I updated the lua in the op.

Edited by LaCastiglione
Link to post
Share on other sites

Optional code suggestion:

-- 'if MouseHoverCallTips:IsAu3File(path) then', or 'if self:IsAu3File(path) then'.
-- Although I'm not sure if there is a significant/important differance between the two. (just to be clear)
function MouseHoverCallTips:IsAu3File(path)
    -- working, but I'm not sure if there is a better way.
    -- note: string.sub(props["au3"]), -4) ... assuming extention is 3 characters. (alt: ditch leading '*' character.)
    if (string.lower(string.sub(path, -4)) == string.lower(string.sub(props["au3"], -4))) then
        return true
    end
    return false
end

PS: Not sure if it matters. But just in case. There is no 'file:close()' after the "for line .." loop in OnDwellStart(). (for all I know the open file might be auto-closed on hitting EOF, or on exiting the function.)

"Straight_and_Crooked_Thinking" : A "classic guide to ferreting out untruths, half-truths, and other distortions of facts in political and social discussions."
"The Secrets of Quantum Physics" : New and excellent 2 part documentary on Quantum Physics by Jim Al-Khalili. (Dec 2014)

"Believing what you know ain't so" ...

Knock Knock ...
 

Link to post
Share on other sites

Roger ... Looks a little odd with those comments. ;)

Tried to see if there was a alternative way to get a hold of 'all' the API function definitions that are actively used by the current (local user) scite4autoit setup ... but no luck so far.

Anyone know if there is a other way than doing it the file:open way ?

Anyway ... extended the definition finder a bit to do it anyway. (added+changed functions only) (LC: use as you see fit.)

function MouseHoverCallTips:GetFuncDef(word, filespecList, delim)
    for filespec in string.gmatch(filespecList, "[^;]+") do
        local file = io.open(filespec, "r")
        if file ~= nil then
            local parens_start
            for line in file:lines() do
                if (string.find(line, word)) then
                    parens_start = string.find(line, "%)")
                    if (parens_start ~= nil) then
                        line = string.gsub(line, "%)(.)", "%)n%1") -- changed: was adding a trailing empty line in some cases.
                    end
                    file:close()
                    return line
                end
            end
            file:close()
        end
    end
end

function MouseHoverCallTips:OnDwellStart(position, word)
    if (word == "") then
        if (scite.SendEditor(SCI_CALLTIPACTIVE)) then
            scite.SendEditor(SCI_CALLTIPCANCEL)
        end
    end

    if (scite.SendEditor(SCI_GETSTYLEAT, position) == 4 or scite.SendEditor(SCI_GETSTYLEAT, position) == 15) then
        local funcdef = self:GetFuncDef(word, props["api.$(au3)"], ";")
        if funcdef ~= nil then
            scite.SendEditor(SCI_CALLTIPSHOW, position, funcdef)
        end
    end

    return true
end

"Straight_and_Crooked_Thinking" : A "classic guide to ferreting out untruths, half-truths, and other distortions of facts in political and social discussions."
"The Secrets of Quantum Physics" : New and excellent 2 part documentary on Quantum Physics by Jim Al-Khalili. (Dec 2014)

"Believing what you know ain't so" ...

Knock Knock ...
 

Link to post
Share on other sites

What's weird is that OnOpen is called when SciTE is opened and when I switch between buffers. So, I removed OnSwitchFile and restarted SciTE but calltips are still not displayed when I hover over a function even after switching buffers.

Edited by LaCastiglione
Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By BlueSkyMemory
      While Scite doesn't support high dpi, I open it in compatibility settings. But it brings another problem:My au3 app automatically enables high dpi, causing gui disorder.
      I've tried #AutoIt3Wrapper_Res_HiDpi=N but it doesn't work. I'd appreciate it if you could offer some help. Thanks.
    • By edubensa
      Hi! Can someone help me with this? I upgraded from SciTe Edit Lite to full version. Now every time I edit a script it opens on a new SciTe tab, but I want it opens on a new window like before the upgrade. Can someone help me with that? Thanks!!
    • By BugFix
      When posting scripts to platforms that use different tab settings (e.g. GitHub), they are ripped from their formatting.
      Thus, it is better to replace all tabs with spaces in the correct position before posting. I have created the following Lua script for this purpose. It replaces all tabs with the appropriate number of spaces in the document opened in SciTE. By default a tab width of 4 characters is used. But other values are also possible, details about this and the installation and usage are at the beginning of the script.
      -- TIME_STAMP 2022-05-01 11:28:55 v 0.1 --[[ == Installation == • Store the file to "YOUR-PATH/TabReplaceSciTE.lua" • New entry in your "SciTEUser.properties" (find a free command number, in example is "49" used, and a free shortcut) #49 Replace TAB with spaces command.name.49.*=Replace TAB with spaces command.49.*=dofile "YOUR-PATH/TabReplaceSciTE.lua" command.mode.49.*=subsystem:lua,savebefore:no command.shortcut.49.*=Ctrl+Alt+Shift+R • If your sources has different values for TAB width, you can modify the command call in this script (last line), "TabReplace_FileInSciTE(2)" or "TabReplace_FileInSciTE(8)". Or add a property to your "SciTEUser.properties" to have more flexibility: # The currently used tab.size, which is replaced by spaces # Without this property or with empty value "4" is used. tab.replace.width=2 Then change the last line in this script to: TabReplace_FileInSciTE(props['tab.replace.width']) == Usage == • Open any script. • Hit the shortcut. • In the opened document, all TAB will be replaced by the number of spaces corresponding to the TAB position in the line. ]] ---------------------------------------------------------------------------------------------------- --[[ in...: _line A line of text whose TAB are to be replaced by spaces. .....: _tabsize TAB size in number of characters. If it is omitted, 4 is used. out..: The line, with TAB replaced if necessary, and the number of replacements. ]] ---------------------------------------------------------------------------------------------------- TabReplace_Line = function(_line, _tabsize) if _line:find('^[\r\n]+$') then return _line, 0 end -- only a line break if _line == '' then return _line, 0 end -- only a empty string local posTab = _line:find('\t') if posTab == nil then return _line, 0 end -- no TAB included _tabsize = _tabsize or 4 -- default TAB width local tTab, s, sRep, iLen, sumLen = {}, ' ', '', 0, 0 while posTab ~= nil do -- calculation replacement string, taking into account characters to be inserted iLen = (_tabsize - ((posTab + sumLen -1) % _tabsize)) sumLen = sumLen + iLen -1 -- total length of the replacements sRep = s:rep(iLen) -- create replacement string table.insert(tTab, sRep) -- save to table posTab = _line:find('\t', posTab +1) -- find next TAB end local idx = 0 _line = _line:gsub('\t', function() idx = idx +1 return tTab[idx] end) return _line, idx end ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- --[[ Replaces all TAB in the file currently open in SciTE ]] ---------------------------------------------------------------------------------------------------- TabReplace_FileInSciTE = function(_tabsize) local caret = editor.CurrentPos local fvl = editor.FirstVisibleLine local content = '' if _tabsize == '' then _tabsize = nil end for i=0, editor.LineCount -1 do local line = editor:GetLine(i) line = line or '' line = TabReplace_Line(line, _tabsize) content = content..line end editor:BeginUndoAction() editor:ClearAll() editor:InsertText(0, content) editor:EndUndoAction() editor.CurrentPos = caret editor:SetSel(caret, caret) editor.FirstVisibleLine = fvl end ---------------------------------------------------------------------------------------------------- TabReplace_FileInSciTE(4) -- If required: Change the TAB size here  
      TabReplaceSciTE.lua
    • By mrider
      Greetings all,
      I went looking around for dark themes for SciTE and didn't have much luck.  No wish to necro-post, but I found this post -> A dark theme for SciTE but it seems as if things were ended at a single change for AutoIt where I was hoping for a comprehensive dark theme.  I currently have a dark desktop in Mint where xed, the terminal emulator, vim, and etcetera do an acceptable job of showing the dark theme.  Then I load SciTE and get blinded.  To resolve this, I'm currently working on creating a set of lang.properties files that use the Solarized themes (both light and dark).  The mechanism is simple enough: I wrote a small Perl program which parsed all the properties files and extracted all the distinct color values.  Then I assigned indexes to all the distinct colors, and wrote the colors themselves out to a separate properties file.  Next I parsed that and I used the formula for reducing the color palette to fewer colors as a baseline for generating the Solarized light theme - which turned out surprisingly less awful than I would have guessed.  Next I generated a color theme where all the colors are reversed for the Solarized dark theme.  The result is dark, but the individual source files I look at still need more help (Perl was particularly bad).  At this point, it is possible on my computer to switch to either the Solarized light or dark theme with one line of text in my user options file.
      Now I'm working my way through source-code cleaning up the result.  My first stop is completing Perl, but AutoIt is my next stop.  I'm happy to put the modified files out there for all to use (if you want them).
      I'm willing to do all the legwork for all the properties files.  The problem is that I'm only familiar with some of the languages that SciTE recognizes (for example - I wouldn't know Baan if it bit me on the butt).  I looked all around both the Solarized website and the Scintilla/SciTE website, and I can't find any reference files that can be used to test the colors.  Which means that any language I don't understand will get the colors chosen by the algorithm, which is admittedly fairly rough. 
       
      Which leads me to this post: What would be particularly useful would be code samples in different languages.  The more of the style numbers that are touched in that language the better.  I don't care if the code is "quality" code, I'm more interested in whether the code snip is properly colorized (for some values of "proper").  I understand that nobody is obligated to help me with "my project".  However, I promise that I will do my best with any code snips in any language and I will post the results here.  I'm using xed and vim as my templates, so my results will (mostly) resemble results there.
      I'll post my work here as time progresses, I'll probably have a working version for Perl and AutoIt in the next few days, and I'll do my best with other languages going forward.  As I say, I welcome code snips in any language that SciTE colorizes using a properties file.
       
      Edit1: Attached is the first Solarized Version.  I have only tested this in the default install of SciTE.  I'm certain there are going to be differences between the default install and the full version, but I don't yet know what those differences will be.  To use this:
      Detach the zip file. Drop the folder into your profile directory.  For example: C:\Users\mrider\Solarized . Open your local options file in SciTE (Options -> Open User Options File). Add the line "import Solarized\SolarDark" (without the quotes) to your file. You can turn the dark theme on and off with a comment character (#) at the beginning of the statement. Enable "Solar Light" theme similarly using "import Solarized\SolarLight". As I say, this doesn't work in the full version, so only use this if you are using the basic version.  I'll chase the full version next.
       
      Edit2: Attached is the second Solarized Version.  This works with the full install of SciTe, but so far I've only tested it with Autoit, Batch Files, and Perl.  I'll keep expanding the languages as I go.  To use this:
      Detach the zip file. I had to navigate to "C:\Program Files (x86)\AutoIt3\SciTE" and relax the file permissions to perform the next step. Drop the folder in the SciTE install directory (it doesn't seem to work in one's profile directory). Open your local options file in SciTE (Options -> Open User Options File) - note that this opens the user properties file inside the SciTE directory, not your profile. Add the line "import Solarized\SolarDark" (without the quotes) to your file. You can turn the dark theme on and off with a comment character (#) at the beginning of the statement. Enable "Solar Light" theme similarly using "import Solarized\SolarLight".  
      Solarized_AutoIt_SciTE_version_only.zip
      Solarized_SciTE_Full_Install.zip
    • By beautifulsoup
      Hi All,
      I'm not sure if its possible that I'm trying to achieve, I've looked into https://www.autoitscript.com/autoit3/scite/docs/SciTE4AutoIt3/AutoIt3Wrapper.html and such resources for help, but I cant really find the answer to my question.
      So upon compiling the script in SciTE, the exe file is given a Description under file Properties>Details. I understand, that  one can enter info manually there and it can even implement the version automatically with each compilation.
       
      What I'm trying to achieve is to somehow include the "@ScriptName" in the Details>File Description Field. But as I see no variable can be taken after "#" in this case.
       
      Do You think its achievable? (Win 10)
       
      Much obliged for taking time on reading this.
       
      Kind Regards,
      Brave


×
×
  • Create New...