Wrap procedure comments

The most recent version of this code can be found in the compilation of text-editing code posted here.

#pragma TextEncoding = "UTF-8"
#pragma rtGlobals=3
#pragma IndependentModule = WrapText
#pragma version=1.01
 
// If your lengthy procedure comments often end up looking a bit like
// this, you
// may find this code snippet useful. To use, copy, wrapScrap(), paste.
 
menu "Edit"
    "Comment wrap clipboard/4", /Q, WrapText#wrapScrap()
    "Unwrap clipboard/5", /Q, WrapText#unwrapScrap()
end
 
function wrapScrap()    
    putscraptext commentWrap(getscraptext(), 72)    
end
 
function unwrapScrap()  
    putscraptext commentUnwrap(getscraptext())  
end
 
// returns string wrapped at V_wrap characters, commented,
// and indented to match indent at start of s_in.
function /T commentWrap(s_in, v_wrap)
    string s_in
    variable v_wrap 
    
    string s_out="", s_char=""
    
    s_in=replacestring("\t", s_in, "   ")
    
    // try to guess how far we want to indent comment
    variable indent=0
    for(indent=0;indent<25;indent+=1)
        if(!stringmatch(s_in[indent], " "))
            break
        endif
    endfor
    
    s_in=replacestring("//", s_in, " ")
    s_in=replacestring("\r", s_in, " ")
    
    // condense whitespace
    variable len
    do
        len=strlen(s_in)
        s_in=replacestring("  ", s_in, " ")
    while(strlen(s_in)!=len)
    
    variable i=0,j=0,k=0
    // i is character count in s_in
    // j is character count in current line of s_out
    do
        s_char=s_in[i]
        i+=1
        if(j==0)
            for(k=0;k<indent;k+=1,j+=1)
                s_out+=" "
            endfor  
            s_out+="// "
            j+=3
            if (!stringmatch(s_char, " "))
                s_out+=s_char
                j+=1
            endif   
        elseif (j>v_wrap)
            if(!stringmatch(s_char, " "))   
                do
                    j-=1
                    if (stringmatch(s_out[strlen(s_out)-(v_wrap+1-j)], " "))
                        break
                    endif
                while(j>indent+3)
                if(j>indent+3)
                    s_out=s_out[0,strlen(s_out)-(v_wrap+1-j)]
                    i-=(v_wrap+1-j)
                endif
            endif       
            s_out+="\r"
            j=0
        else
            s_out+=s_char
            j+=1
        endif
    while(i<len)
    s_out=replacestring("   ", s_out, "\t")
    
    return s_out    
end 
 
// returns unwrapped string with comment indicators removed
function /T commentUnwrap(s)
    string s
    
    s=replacestring("\t", s, "   ")
    s=replacestring("//", s, "")
    s=replacestring("\r\r", s, "<$$> ")
    s=replacestring("\r", s, " ")
    s=replacestring("<$$>", s, "\r\r")
    
    // condense whitespace
    variable len
    do
        len=strlen(s)
        s=replacestring("  ", s, " ")
    while(strlen(s)!=len)
    
    do
        len=strlen(s)
        s=replacestring("\r ", s, "\r")
    while(strlen(s)!=len)
    
    do
        s[0,0]=selectstring(stringmatch (s[0]," "), s[0], "")
    while(strlen(s) && stringmatch(s[0], " "))
    
    return s
end 
I don't suggest using /Q for the shortcut: on Macintosh that quits Igor!

--Jim Prouty
Software Engineer, WaveMetrics, Inc.
The /Q is a menu item flag - I call it the quiet flag - to prevent cluttering the history with •WrapText#wrapScrap().
DisplayHelpTopic  "Menu Definition Syntax" for details.
I should have pointed out that I did include a shortcut - command-4 - which should be edited to avoid conflict with other user-defined shortcuts.
I use this as an independent module so that it works regardless of whether procedure is compiled.
One use is for taking unwrapped text from outside of Igor and pasting as a comment.
Don't forget that there are also keyboard shortcuts for commenting and decommenting, but these won't wrap the text for you.

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More