highlighting all occurrences of the same piece of text

Mike MacGillis Mike.MacGillis at arc.com
Tue Aug 15 13:37:23 CEST 2006


Thanks for that Tony.
Cheers
Mike

-----Original Message-----
From: discuss-bounces at nedit.org [mailto:discuss-bounces at nedit.org]On
Behalf Of Tony Balinski
Sent: 15 August 2006 11:49
To: General NEdit discussion list
Subject: RE: highlighting all occurrences of the same piece of text


Quoting Mike MacGillis <Mike.MacGillis at arc.com>:

> Hi Eric,
> if you could send that macro to me when you have a chance that would be
> great.
> Cheers
> Mike
>
Here's a macro that'll do it:
------------------------------------------------------------------------
# pick up search string
sel = get_selection("any")
if (sel != "")
  {
  pat = string_dialog("Enter search pattern\n" \
                      "(default is '" sel "')", \
                      "OK", "Cancel")
  if (pat == "")
    pat = sel
  }
else
  {
  pat = string_dialog("Enter search pattern", "OK", "Cancel")
  }
if (sel == "" || $string_dialog_button != 1)
  return

# choose search type
ty[1] = "literal"
ty[2] = "case"
ty[3] = "word"
ty[4] = "caseWord"
ty[5] = "regex"
ty[6] = "regexNoCase"

ind = dialog("Search for\n\n    '" pat "'\n\n" \
             "as the following pattern type", \
             ty[1], ty[2], ty[3], ty[4], ty[5], ty[6], "Cancel")
if (!(ind in ty))
  return

srchtype = ty[ind]

# delete old result rangeset(s) for re-creation
sets = rangeset_get_by_name("Find all")
if (sets[] != 0)
  rangeset_destroy(sets)

# (re)create a rangeset for results
# - this will be the "top-most" rangeset
rs = rangeset_create()
if (rs == 0)
  return dialog("Could not create a rangeset for Find All search", \
                "Dismiss")

rangeset_set_name(rs, "Find all")
rangeset_set_color(rs, "#80FFC0")   # greenish

# now do the search and assemble results
res = ""
num = 0
end = 0
for (pos = search(pat, 0, srchtype); \
     pos >= 0; \
     pos = search(pat, end, srchtype))
  {
  ++num
  end = $search_end
  rangeset_add(rs, pos, end)
  bol = max(search("\n", pos, "case", "backward") + 1, 0)
  eol = min(search("\n", pos, "case", "forward"), $text_length)
  # add to res a representatoin of the (first) line of the found pattern
  if (eol > end)
    res = res num ": " get_range(bol, pos) \
                  "[[" get_range(pos, end) \
                  "]]" get_range(end, eol) "\n"
  else
    res = res num ": " get_range(bol, pos) \
                  "[[" get_range(pos, eol) "...\n"
  }

if (num == 0)
  return dialog("No occurrences of " srchtype " pattern\n\n" \
                "    '" pat "'\n\nfound", "Dismiss")

# found all, have results - now go there
line = list_dialog("Found "num" occurrences of " srchtype " pattern\n\n" \
                   "    '" pat "'\n\nGo to which one?", \
                   res, "OK", "Select", "Cancel")
btn = $list_dialog_button
if (line == "" || !(btn == 1 || btn == 2))
  return
num = replace_in_string(line, ":.*", "", "regex") + 0
range = rangeset_range(rs, num)
if (range[])
  {
  set_cursor_pos(range["start"])
  if (btn == 2)
    select(range["start"], range["end"])
  }
------------------------------------------------------------------------
Paste that code into the macro dialog (Preferences> Default Settings>
Customize Menus> Macro Menu...), give it a name (eg Find All), an
Accelerator if you want it attached to some control key, and that's it!

(This doesn't do the continuous highlighting that TK's patch does, but
it should be good in most circumstances - adapt it as you see fit.)

Tony
-- 
NEdit Discuss mailing list - Discuss at nedit.org
http://www.nedit.org/mailman/listinfo/discuss 
Unless otherwise expressly stated, this message does not create or vary any contractual relationship between you and ARC International.  The contents of this e-mail may be confidential and if you have received it in error, please delete it from your system, destroy any hard copies and telephone the above number.  Incoming emails to ARC may be subject to monitoring other than by the addressee. EL 


More information about the Discuss mailing list