EmEditor (text editor) Forum Index
   Questions and Answers about Macros
     needs help on a macro to insert number row
Register To Post

Threaded | Newest First Previous Topic | Next Topic | Bottom
Poster Thread
zhouzh2
Posted on: 3/30/2010 11:18 am
Just can't stay away
Joined: 7/27/2008
From:
Posts: 89
needs help on a macro to insert number row
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 1<i<10 and n>10, or when 10<i<=99 and n<10 (however the latter will not always appear.) But I cannot find out why. Anyone please help me with that
zhouzh2
Posted on: 4/3/2010 3:34 am
Just can't stay away
Joined: 7/27/2008
From:
Posts: 89
Re: needs help on a macro to insert number row
no one interested?
ToadLoadin
Posted on: 4/5/2010 9:46 pm
Just can't stay away
Joined: 7/4/2008
From: China
Posts: 119
Re: needs help on a macro to insert number row
Hi zhouzh2,
If your "somethinghere" in every line is exactly the same:
Quote:


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.
zhouzh2
Posted on: 4/6/2010 8:13 am
Just can't stay away
Joined: 7/27/2008
From:
Posts: 89
Re: needs help on a macro to insert number row
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
ToadLoadin
Posted on: 4/21/2010 4:49 am
Just can't stay away
Joined: 7/4/2008
From: China
Posts: 119
Re: needs help on a macro to insert number row
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:
Quote:
when 1<i<10 and n>10, 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?
zhouzh2
Posted on: 4/22/2010 6:36 am
Just can't stay away
Joined: 7/27/2008
From:
Posts: 89
Re: needs help on a macro to insert number row
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? )
tonne
Posted on: 4/23/2010 8:58 am
Just popping in
Joined: 11/5/2009
From:
Posts: 4
Re: needs help on a macro to insert number row
Try
if (Math.abs(i) < Math.abs(n)) { //ascending
ToadLoadin
Posted on: 4/23/2010 5:49 pm
Just can't stay away
Joined: 7/4/2008
From: China
Posts: 119
Re: needs help on a macro to insert number row
Quote:

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

That works!~~ But...why that works?
tonne
Posted on: 4/24/2010 12:22 am
Just popping in
Joined: 11/5/2009
From:
Posts: 4
Re: needs help on a macro to insert number row
prompt returns a string; is "2" < "10" ?
ToadLoadin
Posted on: 4/24/2010 1:55 am
Just can't stay away
Joined: 7/4/2008
From: China
Posts: 119
Re: needs help on a macro to insert number row
Quote:
tonne wrote:
prompt returns a string; is "2" < "10" ?


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

Thank you!
Threaded | Newest First Previous Topic | Next Topic | Top


Register To Post
 
English čeština Deutsch español français italiano 日本語 한국어 Русский 简体中文 繁體中文