AutoHotkey Homepage AutoHotkey Community
Let's help each other out
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

PSPad Label Helper - display a list of labels found in PSPad
Goto page 1, 2, 3  Next
 
Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions
View previous topic :: View next topic  
Author Message
evl



Joined: 24 Aug 2005
Posts: 1237

PostPosted: Mon Feb 20, 2006 12:22 am    Post subject: PSPad Label Helper - display a list of labels found in PSPad Reply with quote

This script somewhat makes up for the lack of code-folding in PSPad and adds a few extras - very handy for large scripts which are a pain to navigate.

It's rather like an index for labels and/or functions, hotkeys and directives. You also filter the results (e.g. to find only those labels that contain "gui").

Download:
http://file.autohotkey.net/evl/PSPad_Helper/PSPad%20Helper.ahk


Last edited by evl on Sat Mar 25, 2006 12:14 am; edited 13 times in total
Back to top
View user's profile Send private message
robiandi
Guest





PostPosted: Mon Feb 20, 2006 12:18 pm    Post subject: Reply with quote

I like to indent my labels, therefore I changed
Code:
    If Text%A_Index% contains :
      {
      Colon_Position := InStr(Text%A_Index%, ":")
      StringLeft, Text%A_Index%, Text%A_Index%, %Colon_Position%
      If Text%A_Index% not contains %A_Space%
        {
        StringLen, Text_Length, Text%A_Index%
        If Text_Length !=2 ; avoid junk entries
           LV_Add("", A_Index, Text%A_Index%)
        }
      }
by
Code:
    If Text%A_Index% contains :
     IfNotInString Text%A_Index%, =                 
      IfNotInString Text%A_Index%, contains       
      {
      Colon_Position := InStr(Text%A_Index%, ":")
      StringLeft, Text%A_Index%, Text%A_Index%, %Colon_Position%
        StringLen, Text_Length, Text%A_Index%
        If Text_Length !=2 ; avoid junk entries
           LV_Add("", A_Index, Text%A_Index%)
      }
Back to top
evl



Joined: 24 Aug 2005
Posts: 1237

PostPosted: Mon Feb 20, 2006 6:02 pm    Post subject: Reply with quote

Glad you managed to follow my code and fix it Laughing

Where you filter:
Code:

     IfNotInString Text%A_Index%, =                 
      IfNotInString Text%A_Index%, contains       


I figure "=" filters out ":=" but what is "contains" supposed to filter? EDIT: Never mind, I saw what it was for, when checking if a variable "contains :" Rolling Eyes

I'll be uploading a new version shortly with a few other little improvements.
Back to top
View user's profile Send private message
robiandi
Guest





PostPosted: Mon Feb 20, 2006 6:43 pm    Post subject: Reply with quote

It is because otherwise you would get a line like
Quote:
If Text%A_Index% contains :

in your list.

It is awkward, one has to replace it by the condition that
just the place before ":" must not be %A_SPACE%"
Back to top
kiu



Joined: 18 Dec 2005
Posts: 234
Location: Italy - Galatro(RC)

PostPosted: Mon Feb 20, 2006 8:13 pm    Post subject: Reply with quote

very usefull script.
Bugs:
retrieves line like these:
1) ; performs an eligible action:
that is a comment
2) Menu, MyContextMenu, Add,Roots,:drive
that is a submenu
3) Gui, 2:Add
that is a gui instruction
that are not labels
I think you could correct it simply by controlling if in the line there are words like ";" Menu" or "Gui" (maybe not only this, I didn't look at the code for now)

Anyway very good script Wink
_________________
____________________
______________________
kiu - www.romeosa.com
Back to top
View user's profile Send private message Visit poster's website
evl



Joined: 24 Aug 2005
Posts: 1237

PostPosted: Mon Feb 20, 2006 8:19 pm    Post subject: Reply with quote

I think I found a generic way to filter pretty well, just trying to get it to work right at the moment (read: I can't program Laughing )

Also I was thinking about having a choice of what things to display perhaps, but not sure if there are enough useful ones to make it worthwhile (that can be uniquely identified in a straightforward way):
- functions
- find which guis have been used
- possibly variables
Back to top
View user's profile Send private message
evl



Joined: 24 Aug 2005
Posts: 1237

PostPosted: Mon Feb 20, 2006 10:12 pm    Post subject: Reply with quote

Updated the first post with improved code:
- Should now only find labels (checks if there is a break in A_Space's before the colon - i.e. more than 1 word)
- Changed hotkey to Win+Q (1-handed hotkey for easier use)
- Hotkey hides/shows Gui. Gui closes on selection.
- Tweaked positioning of Gui.

I haven't tried to exclude anything that's commented out. I'm not sure if this would be a good or bad thing since you might still want to find the label. Maybe I'll make it an option if I can.

Further (realistic) suggestions welcome Laughing
Back to top
View user's profile Send private message
kiu



Joined: 18 Dec 2005
Posts: 234
Location: Italy - Galatro(RC)

PostPosted: Mon Feb 20, 2006 10:34 pm    Post subject: Reply with quote

this script is very good, but I've that window and more items are not labels


_________________
____________________
______________________
kiu - www.romeosa.com
Back to top
View user's profile Send private message Visit poster's website
evl



Joined: 24 Aug 2005
Posts: 1237

PostPosted: Mon Feb 20, 2006 11:23 pm    Post subject: Reply with quote

Fixed it in the 1st post. Forgot that some people leave out the commas in gui and menu commands (not sure what those weird symbols were, but they only appeared to be in non-label entries anyhow).
Back to top
View user's profile Send private message
toralf



Joined: 31 Jan 2005
Posts: 3910
Location: Bremen, Germany

PostPosted: Tue Feb 21, 2006 6:12 am    Post subject: Reply with quote

Thank you for this wonderful idea.

I played with your code. I was able to simplify it in a lot of cases and I think I made it more robust to find labels. It now also finds functions.

Code:
/*
PSPad Label Helper
==================
by evl  www.autohotkey.com/forum/viewtopic.php?t=&p=48986#48986
mod by toralf

Hotkey = F12
  Shows/hides a listview of all labels in the active PSPad window.
    - Double-click the label name to go to the line in PSPad.
*/

#Persistent
#SingleInstance force
Return

#IfWinActive, ahk_class TfPSPad 
F12:: GoSub, PSPad_Labels_Gui

PSPad_Labels_Gui:
  WinGet, PSPadWindowID, ID, A  ;remember PSPadWindow to get back to it
  Gui, Destroy                  ;destroy old instances
  Fill_ListView()               ;use a function to avoid left-over variables
Return

Fill_ListView() {
    global LsvListOfLabel
   
    ;try # times to get Text from PSPad
    NumberOfTrys = 20
    Loop, {
        SetTitleMatchMode, Slow
        VarSetCapacity(Text, 1000000)
        WinGetText, Text, A
     
        ; trim off junk from the start of the text
        StringTrimLeft, Text, Text, InStr(Text, "ToolBarProject") 
        StringTrimLeft, Text, Text, InStr(Text, "`n")
        StringTrimLeft, Text, Text, InStr(Text, "`n")
        StringTrimLeft, Text, Text, InStr(Text, "`n")
     
        ;loop thought Text to find Labels
        ListOfLabels =
        NumberOfLabels = 0
        Loop, Parse, Text, `n ; filter results and add to listview
          {
            Line := A_LoopField     ;remove spaces
            If Line contains :,(    ;it may be a subroutine or function
              {
                Label := CheckForLabel(Line)   ;check if it is a valid label
                If Label {                     ;if it is, store it
                    NumberOfLabels++
                    ListOfIDs%NumberOfLabels%    := A_Index
                    ListOfLabels%NumberOfLabels% := Label
                  }
              }
          }
        ;more then one should be found, since there is an entry "C:", that is below the line count of PSPad
        If (NumberOfLabels > 1 )   
            Break
        Else If (A_index = NumberOfTrys){
            MsgBox, 4160, Failed to get Text, Script failed %NumberOfTrys% times to get text from PSPad.
            Return
          }
      }
    NumberOfLabels --   ;remove last entry "C:", since it is below the line count of PSPad
   
    ;create GUI
    Gui, +AlwaysOnTop +ToolWindow
    Gui, Margin, 2, 2
    Gui, Add, ListView, r%NumberOfLabels% w200 Count%NumberOfLabels% vLsvListOfLabel gLsvListOfLabel, Line|Label
    Loop, %NumberOfLabels%
        LV_Add("", ListOfIDs%A_Index%, ListOfLabels%A_Index%)
    LV_ModifyCol(1, "AutoHdr Integer")
    LV_ModifyCol(2)
 
    ;get GUI ID of still hidden GUI
    DetectHiddenWindows, On
    Gui, +LastFound
    Gui_ID := WinExist()
 
    ;get width of Columns and adjust width of ListView control
    SendMessage, 0x1000+29, 0, 0, SysListView321, ahk_id %Gui_ID% ; LVM_GETCOLUMNWIDTH is 0x1000+29
      Width_Column_1 := ErrorLevel
    SendMessage, 0x1000+29, 1, 0, SysListView321, ahk_id %Gui_ID% ; LVM_GETCOLUMNWIDTH is 0x1000+29
      Width_Column_2 := ErrorLevel
    NewWidth := Width_Column_1 + Width_Column_2 + 4
    GuiControl, Move, LsvListOfLabel, w%NewWidth%

    ;calculate position on right screen edge and show gui
    PosX := A_ScreenWidth - NewWidth - 10
    Gui, Show, AutoSize x%PosX% NoActivate, PSPad Labels
  }

CheckForLabel(Line){
    ;find out, if Label is a function or subroutine
    PosColon := InStr(Line, ":")
    PosDoubleColon := InStr(Line, "::")
    PosBraket := InStr(Line, "(")
    If (PosColon > 1 AND PosDoubleColon = PosColon)   ;its a hotkey
        Return
    Else If (PosColon > 1 AND (PosColon < PosBraket OR PosBraket = 0)){
        IsFunction := False
        Pos = %PosColon%
      }
    Else IF (PosBraket > 1 AND (PosBraket < PosColon OR PosColon = 0)){
        IsFunction := True
        Pos = %PosBraket%
      }
    Else             ;this should never happen, but is fail-save
        Return

    ;get the label
    StringLeft, Label, Line, % Pos - 1
   
    ;it is an If statement "If("
    If (Label = "If")
        Return

    ;check each char in Label if it is allowed
    Loop, Parse, Label
        If ( A_LoopField <> "_" )
            If A_LoopField is not Alnum
                Return
    ;add postfix   
    If Label {
        If IsFunction
            Return Label "()"
        Else
            Return Label ":"
      }
  }

LsvListOfLabel:
  If (A_GuiEvent = "DoubleClick") {
       LV_GetText(Row_Number, A_EventInfo)  ; Get the row's first-column text.
       Gui, Destroy
       WinActivate, ahk_id %PSPadWindowID%
       Send, ^g%Row_Number%{Enter}
    }
Return

GuiClose:  ; Indicate that the script should exit automatically when the window is closed.
GuiEscape:
    Gui, Destroy
Return

_________________
Ciao
toralf
Back to top
View user's profile Send private message Send e-mail Visit poster's website
robiandi
Guest





PostPosted: Tue Feb 21, 2006 8:40 am    Post subject: Reply with quote

@toralf:

but in your version you cann't indent the labels.

To obtain this you must omit in the function CheckForLabel(Line) the part
Code:
    Loop, Parse, Label
        If ( A_LoopField <> "_" )
            If A_LoopField is not Alnum
                Return

But now at the very beginning of this function you have to put some conditions as for example
Code:
IfInString line,:= 
         return
Back to top
robiandi
Guest





PostPosted: Tue Feb 21, 2006 9:35 am    Post subject: Reply with quote

robiandi wrote:
But now at the very beginning of this function you have to put some conditions as for example
Code:
IfInString line,:= 
         return

It is surely not as easy as here presented but in my example it just worked.
Back to top
toralf



Joined: 31 Jan 2005
Posts: 3910
Location: Bremen, Germany

PostPosted: Tue Feb 21, 2006 2:36 pm    Post subject: Reply with quote

robiandi wrote:
but in your version you cann't indent the labels.
Dear robiandi,
Could you please clarify what you want to indent?
Are your labels indented in the code, or do you want to have the lables indented in the ListView?

In the furture I will extend the code to also show hotkeys and directives.
With 4 checkboxes one can limit the list.

A limitation currently exist e.g. if a function is somewhere called without a return value, it will be in the list. I will extend the code, that at least the AHK internal function will not show up.
_________________
Ciao
toralf
Back to top
View user's profile Send private message Send e-mail Visit poster's website
kiu



Joined: 18 Dec 2005
Posts: 234
Location: Italy - Galatro(RC)

PostPosted: Tue Feb 21, 2006 4:09 pm    Post subject: Reply with quote

For toralf:
with your code, at the end of the list I get some items like these

Line Label
245 E:
247 C:
259 C:

and my source code is only 242 lines lenght.
Sometimes I get only these items and not the real labels.
_________________
____________________
______________________
kiu - www.romeosa.com
Back to top
View user's profile Send private message Visit poster's website
robiandi
Guest





PostPosted: Tue Feb 21, 2006 4:27 pm    Post subject: Reply with quote

@toralf:

Quote:
Dear robiandi,
Could you please clarify what you want to indent?
Are your labels indented in the code, or do you want to have the lables indented in the ListView?

They are indented in the code, that means instead of for example
Code:
#p::
...
here comes the ahk-code
I prefer
Code:
            #p::
...
here comes the ahk-code


The same way I would like to indent the head of the functions.
Back to top
Display posts from previous:   
Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You can post new topics in this forum
You can reply to topics in this forum


Powered by phpBB © 2001, 2005 phpBB Group