Delall: Delete Visible Lines from a Selective Display

Thursday, September 18, 2008 0 comments

Here are 3 more Slickedit macros I've been using regularly for several years. Actually, the first one is more of a test macro than it is useful. The other two are stalwarts.

The 3 macros are:

  1. count_hidden_lines(): show count of hidden lines
  2. dat(): delete all visible lines in the selective display, without deleting any hidden lines
  3. delall(): delete all lines containing the specified search string
Have fun. Let me know if you find any significant problems or have comments.

dh
// count_hidden_lines

_command count_hidden_lines()
{
NoflinesShown0=((p_Noflines)-p_Nofhidden);
message( NoflinesShown0' visible (selected) lines, p_Noflines= 'p_Noflines'; p_Nofhidden = 'p_Nofhidden);
}


// dat(): delete all visible lines in selective display
// Example: to remove all lines containing "Bookmark this site",
// execute 'all /bookmark this site/' and then execute 'dat.'
// The 'dat' command will delete all of the visible lines and leave the
// rest untouched.

_command dat() name_info(','VSARG2_REQUIRES_EDITORCTL)
{
// get line counts for verification and be sure a selective display is active
NoflinesShown0=((p_Noflines)-p_Nofhidden);
if (NoflinesShown0==p_Noflines) {
_message_box("Error: be sure selective display is active before running ''dat''");
return(0);
}
old_line_cou=p_Noflines;
// make sure nothing is marked--we don't want to delete invisible lines
if (select_active()) {
_message_box('Error: Deselect the marked block');
return(0);
} else {
bottom();
while (p_line>=1) {
hid=_lineflags() & (HIDDEN_LF);
if (hid!=HIDDEN_LF) {
// probably also need to exclude or prompt for

// deletion of pbm "minus" lines. A pbm minus
// line is a hidden line that has been expanded
status=_delete_line();
} else {
cursor_up();
}
}
}
NoflinesShown1=((p_Noflines)-p_Nofhidden);
message(old_line_cou'-'old_line_cou-p_Noflines' lines deleted; 'p_Noflines' remain');
if (p_Noflines!=(old_line_cou-NoflinesShown0)) {
_message_box('Error: Number of lines deleted does not match original number of visible lines');
}
show_all();
}


// delall(): Delete all lines containing the specified search string.
//
Locates lines containing matches and then runs 'dat' to delete
// all matching lines in one step.

// Example: "delall /^Subtotal$/r"
// Delall is a timesaver ... and easily reversible, thanks to Undo.
// You can use any arguments
to 'delall' that you can use with the
// ordinary 'search', 'find', 'all', 'more', or 'less'
commands,
// including those luscious regular expressions we love so much.


_command d,delall(...) name_info(','VSARG2_REQUIRES_EDITORCTLVSARG2_READ_ONLY)
{
_str searchstr=arg(1);
_str delim;
_str sstring;
_str opts;
// strip delimiters
parse searchstr with delim +1 sstring(delim)opts
save_pos(p);
all(sstring,'i':+opts);
dat();
show_all();
restore_pos(p);
}

Show Longest Line and Lines > or < Specified Column Number

Tuesday, September 9, 2008 1 comments

I guess you could say I write alot of "utility" macros. Short and sweet, but they get the job done. Here are three that come in handy once in a rare while.

// Find longest line in buffer; display line number and length
// It would be good if the macro took you to the longest line.
// I tried a couple of things that didn't work.
// Maybe you can provide the missing code.
_command longest_line() name_info(','READ_ONLY_ARG2)
{
save_pos(p);
top();up();max=0;
while (!down()) {
get_line(line);
len=length(line);
if (len > max) {
max=len;
max_linenum=p_line;
}
}
message('Longest line is ' max_linenum ' with ' max ' bytes');
restore_pos(p);
}

// The following two macros could be modified to display 'greater
// than or equal to" or "less than or equal to" the specified
// column number, if that is more to your liking.

// Show only lines exceeding the column number you specify.
// This command currently provides a selective display, but doesn't
// show the usual "+" and "-" marks that you expect in a
// selective display, to enable you to
expand and compress the lines.
// Usage: show_lines_over 128. This will display only lines longer than 128 columns
_command show_lines_over(...) name_info(','VSARG2_REQUIRES_EDITORCTLVSARG2_READ_ONLY)
{
typeless maxlength=arg(1);
if (arg(1)=='' arg(1)<=0) {
message('Error: a column number argument is required');
stop;
}
top();up();
for (;;) {
status=down();
get_line(line);
if (length(line)<=maxlength) {
_lineflags(HIDDEN_LF,HIDDEN_LF);
}
if (status) {
break;
}
}
}

// show lines shorter than specified column length; hide lines longer than that length
_command show_lines_under(...) name_info(','VSARG2_REQUIRES_EDITORCTLVSARG2_READ_ONLY)
{
typeless minlength=arg(1);
if (arg(1)=='' arg(1)<=0) {
message('Error: a column number argument is required');
stop;
}
top();up();
for (;;) {
status=down();
get_line(line);
if (length(line)>minlength) {
_lineflags(HIDDEN_LF,HIDDEN_LF);
}
if (status) {
break;
}
}
}
dh

Show Selective Display Line Statistics

Sunday, September 7, 2008 0 comments

This discussion involves the commands "all", "allnot", "more", and "less". For the sake of conciseness, I'll call these four commands "the selective display commands", even though I know they aren't the only selective display commands. Additionally, this article assumes you're issuing these commands from the Slickedit command line and that you're using Slickedit 2008 or a comparable Slickedit version.

To show selective display statistics on the message line each time you run one of the four selective display commands, you need to insert 8 lines into your seldisp.e file (make a backup copy first). After you've done this, each time you run one of the four commands cited, the Slickedit message line will tell you:

  • the number of lines matched (lines displayed)
  • the number of lines not matched (lines hidden)
  • the total number of lines in the file
Here's how to do it. I'll use the "all" command as the example. Later you can insert the same 8 lines into the "allnot" and "more" source at the same point in the code as you did with "all". ("Less" doesn't need to be edited because it calls on "allnot" to create a selective display.)

Open seldisp.e from your macros folder and locate the start of the "all" command.

_command void all(...)

Scroll down to the following text near the end of the "all" command:

set_find_next_msg("Find", old_search_string, new_search_options);
restore_pos(p);
//return(status)


Insert the 8 new lines below, between the end of the 3 lines I just cited above and the last brace in the "all" command. The result will look something like:

/* these are the existing lines at the end of the "all" code */

set_find_next_msg("Find", old_search_string, new_search_options);
restore_pos(p);
//return(status)

<-------- insert new code here
}

/* after inserting the 8 new lines */

set_find_next_msg("Find", old_search_string, new_search_options);
restore_pos(p);
//return(status)


/* start of 8 new lines to insert */
// start selective display line statistics, added by [you] on [date/time]
If(p_Nofhidden==0)
{ // "String not found" message will be displayed
} else {
int NoflinesShown=0;
NoflinesShown=(p_Noflines) - p_Nofhidden);
message('Displaying ' NoflinesShown' of 'p_Noflines' lines | 'p_Nofhidden' hidden lines');
}
/* end of 8 new lines to insert */

} // final brace in the existing "all" code

Now if you run the command "all /banks/" on the following sample text, two lines will be displayed and five will be hidden, as is usual.

Sample text:
atlantic regional auto dealer financing aviation b-piece buyers
bad credit balance transfer bank mergers banks in sba programs banks
intl trade issuing credit cards offering lines of credit boats
book distributorships banks book publishing borrowing money for real
estate

Execute "all /banks/" on the sample text.

The resulting selective display is:
+ bad credit balance transfer bank mergers banks in sba programs banks
+ book distributorships banks book publishing borrowing money for real

The plus signs are Slickedit's way of telling us that the lines that didn't contain a match for "banks" are hidden or "folded up" into the lines that did match the text.

Now the message line will read:

Displaying 2 of 5 lines | 3 hidden lines

After you modify the original seldisp.e code and you see these stats a few times, you might find them helpful, especially in large files. You can customize the wording and appearance any way you want. For example, you could add a little more code to get the following result:

Selective Display Statistics: Now displaying 3 instances of "banks" in 2 of 5 lines; 3 lines are hidden

Clearly this is a long message and would be more appropriate if displayed in a message box.

By the way, I have two keys mapped to "show_all" and "toggle selective display" (i.e., expand and collapse visible and hidden lines), respectively. I use them constantly. I added the same 8 lines of code to "show_all" and "toggle selective display". After executing "show_all", the message line reads "All lines displayed". This helps me monitor my file size, search terms and contents continuously.

I hope this helps someone.

NOTE: You'll probably lose the changes to seldisp.e each time you install an update to the editor. You'll then need to re-insert the 8 lines of new code each time seldisp.e is updated. To avoid this, you can keep a modified copy of seldisp.e handy and replace the updated one with the modified version containing the 8 added lines. I keep copies of my modified versions of Slickedit modules in a directory called "dh-modified".

Before swapping the files, be sure to diff them so that you don't lose any important changes in the update to seldisp.e. Another way to avoid losing your modifications is to incorporate the code for "all" etc. into your vusrmacs.e file.

As always, I'm not a professional developer and my code might be a hack. Your mileage might vary. Please feel free to share ideas, bugs, suggestions, corrections, etc.

dh

GlossyBlue Blogger by Black Quanta. Theme & Icons by N.Design Studio
Entries RSS Comments RSS