Viewing 10 posts - 1 through 10 (of 10 total)
  • Author
    Posts
  • #8240
    zhouzh2
    Participant

    I wrote this for inserting number row. both in this kind:

    a=1
    b=2
    c=3
    ..

    and:

    a = 1  somethinghere
    b = 2 somethinghere
    c = 3 somethinghere
    ..

    It is supposed to work from number 0 to 99 or 99 to 0.

    /*insertNumbers.jsee*/
    /*Insert numbers in a row*/

    var i = prompt("Please enter the start number (not larger than 99)", 0);
    var n = prompt("Please enter the end number (not larger than 99)", 1); //promote

    if ((i == "")|| (n == "")){Quit();};
    if ((i > 99)|| (i < 0) || (n > 99)||(n < 0)) {alert("Error!"); Quit();}; //errors

    cfg = document.Config;
    var userVSsetting = cfg.General.VirtualSpace;
    cfg.General.VirtualSpace = 'true';
    cfg.Save(); //enable VirtualSpace so that when inserting at '^a=nb=n...' will run normally.

    status = "Inserting - Please Wait...";

    if (i < n) {
    n++;
    while (i < 10){
    document.selection.Text=i;
    document.selection.LineDown(false,1);
    document.selection.CharLeft(false,1);
    i++;
    if (i == n) {insertEnd();};
    };
    while (i <= 99){
    document.selection.Text=i;
    document.selection.LineDown(false,1);
    document.selection.CharLeft(false,1);
    document.selection.CharLeft(false,1);
    i++;
    if (i == n) {insertEnd();};
    };
    }; //ascending

    else {
    n--;
    while (i >= 10){
    document.selection.Text=i;
    document.selection.LineDown(false,1);
    document.selection.CharLeft(false,1);
    document.selection.CharLeft(false,1);
    i--;
    if (i == n) {insertEnd();};
    };
    while (i < 10){
    document.selection.Text=i;
    document.selection.LineDown(false,1);
    document.selection.CharLeft(false,1);
    i--;
    if (i == n) {insertEnd();};
    };
    }; //descending

    function insertEnd(){
    cfg.General.VirtualSpace = userVSsetting;
    cfg.Save();
    status = "Inserting Completed";
    Quit();
    };

    However, this macro will be trapped in a loop under a certain situation, i.e. when 110, or when 10

    #8269
    zhouzh2
    Participant

    no one interested?:-(

    #8304
    ToadLoadin
    Member

    Hi zhouzh2,
    If your “somethinghere” in every line is exactly the same:


    a=1
    b=2
    c=3
    ..

    and:


    a = 1 somethinghere
    b = 2 somethinghere
    c = 3 somethinghere
    ..

    perhaps you could use “Insert Number Sequence” plugin, the Simplified Chinese version is here.

    #8307
    zhouzh2
    Participant

    Thanks ToadLoadin :-)
    I know there is such a plug-in.
    However, a 32bit plug-in will not work on a 64bit Emeditor.
    Furthermore, I would prefer a macro if the macro can do what I want, since it saves hardware recourse.
    “somethinghere” is not what I want to insert. This is just one of the situation when inserting numbers. Under the above two situation a macro should behave accoradingly to insert numbers correctly. To surpass this I temporarily enables the VirtualSpace and restores it when finished.
    The problem here is when entering a start number greater than 2, the macro will stack in a infinite loop, but I can’t find out why…from I point of view, this macro should run correctly :-?

    #8390
    ToadLoadin
    Member

    Hi zhouzh2,

    I modified your macro to this:

    cfg = document.Config;
    var userVSsetting = cfg.General.VirtualSpace;
    cfg.General.VirtualSpace = 'true';
    cfg.Save(); //enable VirtualSpace so that when inserting at '^a=nb=n...' will run normally.

    var i = prompt("Please enter the start number (not larger than 99)", 0);
    var n = prompt("Please enter the end number (not larger than 99)", 1); //promote

    if ((i == "")|| (n == "")){Quit();};
    if ((i > 99)|| (i < 0) || (n > 99)||(n < 0)) {alert("Error!"); Quit();}; //errors

    // Get current cursor position
    var iCol = document.selection.GetActivePointX(eePosLogicalA);
    var iLine = document.selection.GetActivePointY(eePosLogical);
    // Caculate the number of lines
    var nLines = Math.abs(i-n)+1;

    status = "Inserting - Please Wait...";

    for (var j=0; j < nLines; j++) {
    document.selection.SetActivePoint(eePosLogicalA, iCol, iLine+j);
    if (i < n) { //ascending
    document.selection.Text = i;
    i++;
    } else { //descending
    document.selection.Text = i;
    i--;
    }
    }

    cfg.General.VirtualSpace = userVSsetting;
    cfg.Save();
    status = "Inserting Completed";
    Quit();

    And observed an interesting issue, as you noticed:

    when 1<i10, or when 10<i<=99 and n<10

    The first number inserted will be the biggest one, I guess that’s why your macro fall into a infinite loop, but I can not figure out why this happens, perhaps a bug? 8-)

    #8395
    zhouzh2
    Participant

    Hi ToadLoadin,
    Thanks a lot for your help. Your macro is a lot elegant than my silly one :-)
    Yeah I agree with you that this is strange and might be a bug, not so sure though.
    Any other JavaScript expert please come to our rescue :-?
    (Yutaka? 8-) )

    #8401
    tonne
    Participant

    Try
    if (Math.abs(i) < Math.abs(n)) { //ascending

    #8402
    ToadLoadin
    Member

    tonne wrote:
    Try
    if (Math.abs(i) < Math.abs(n)) { //ascending

    That works!~~ :-) But…why that works? :-(

    #8403
    tonne
    Participant

    prompt returns a string; is “2” < "10" ?

    #8404
    ToadLoadin
    Member

    tonne wrote:
    prompt returns a string; is “2” < "10" ?

    OIC, it’s a string comparison instead of integer one.

    Thank you! :-D

Viewing 10 posts - 1 through 10 (of 10 total)
  • You must be logged in to reply to this topic.