Hi there fellow coders, and since this is my first post:

       JAN, THANK YOU FOR YOUR AWESOME EDITOR!
   
The thing that kept me from switching over to PSPad permanently 
was its lack of an auto reindentation thingie, so today I sat down 
to write it and it came out surprisingly small.

Some notes (Read before using !!!):

  1. Due to limitations of the PSPad scripting mechanism, when 
reindenting selected text, the first line in the selection will 
not be reindented. Sorry, nothing I can do about it.

  2. Indentation of selected text should be used with care, that 
is, try to indent whole blocks and if possible whole functions. 
Trying to make it indent something in a middle of a switch
section for example will make it go absolutely crazy.

  3. The script wasn't thoroughly tested! (though it did manage to 
reindent itself :-) ) And what little testing I did was on K&R 
style files, as that's the style I use. In any case I'm not 
responsible for any mishap's...blah blah blah...

  4. Please report bugs (other than the ones I've already 
mentioned).

  5. Enjoy.

p.s.

    Jan, any chance you can fix it so we can map shortcut keys to scripts?


var tabsize=2;
var keywords = ["{","}",";","if","else","for","while","case
","default","/*","*/"];
var lines;
var line;
var ln=1;
var li=0;
var ret;
var commentmode=false;
var ignorenext=false;
var donetab=false;

function CIndent() {
  var code;
  var select;
  var ed = newEditor();
  ed.assignActiveEditor();
  if(ed.selText()=='') {
    code = ed.Text();
    select= false;
  } else {
    select= true;
    code = ed.selText();
  }

  lines=code.split("\n");
  li=0;
  var tab=0;
  if (select) {
    ln=1;
    tab=lines[1].length-lines[1].replace(/^\s*/gi,"").length;
    ret=lines[0];
  } else {
    ln=0;
    ret="";
  }

  rec(tab,true,false);
  ret=ret.substr(0,ret.length-1);

  if (select)
    ed.selText(ret);
  else
    ed.text(ret);
}

function rec(tab,brace,casemode) {
  do {
    if (!li) {
      lines[ln]=lines[ln].replace(/^\s*/gi,"");
      line=lines[ln].replace(/\t/gi,"
").replace(/\/\/.*$/gi,"").replace(/\s*$/gi,"");
      line=line.replace(/".*"/gi,"").replace(/'.*'/gi,"");
    }

    while(li<line.length && ln<lines.length) {
      var match;
      var matchi=Infinity;
      var k=0;
      if(commentmode)
        k=9;
      for (;k<keywords.length;k++) {
        ki=line.indexOf(keywords[k],li);
        if(ki!=-1 && ki<matchi) {
          match=k;
          matchi=ki;
        }
      }
      if (matchi<Infinity) {
        li=matchi+1;
        switch(match) {
          case 0:
            if (ignorenext==true) {
              brace=true;
              ignorenext=false;
              break;
            }
            if (!donetab) {
              for (var j=0;j<tab;j++)
              ret+=" ";
              donetab=true;
            }
            rec(tab+tabsize,true,false);
            break;
          case 1:
            if (casemode)
              li--;
            return;
            break;
          case 2:
            ignorenext=false;
            if (!brace) {
              if (!donetab) {
                for (var j=0;j<tab;j++)
                ret+=" ";
                donetab=true;
              }
              return;
            }
            break;
          case 3:
          case 4:
          case 5:
          case 6:
            if (!ignorenext) {
              if (!donetab) {
                for (var j=0;j<tab;j++)
                ret+=" ";
                donetab=true;
              }
              ignorenext=true;
              rec(tab+tabsize,false,false);
            }
            break;
          case 7:
          case 8:
            if (casemode) {
              li--;
              return donetab;
            } else {
              if (!donetab) {
                for (var j=0;j<tab;j++)
                ret+=" ";
                donetab=true;
              }
              rec(tab+tabsize,true,true);
            }
            break;
          case 9:
            commentmode=true;
            break;
          case 10:
            commentmode=false;
            break;
          default:
        }
      } else
        break;
    }

    if (!donetab)
      for (var j=0;j<tab;j++)
    ret+=" ";
    ret+=lines[ln]+"\n";
    donetab=false;
    ln++;
    li=0;
  } while (ln<lines.length);
}

function Init(){
  addMenuItem("C Reindent (K&R/1TBS)", "", "CIndent");
}



-- 
<http://forum.pspad.com/read.php?2,35711,35711>
PSPad freeware editor http://www.pspad.com

Odpovedet emailem