ref: 688ebf8ecf9d1b5de07930f19987d592cf4daab1
parent: 3c12de48c887a96f448830c9ac32af729caf5abc
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Nov 27 13:05:09 EST 2017
Smarter window switching. Prefer exact matches over end matches over partial matches.
--- a/main.myr
+++ b/main.myr
@@ -645,46 +645,55 @@
}
const chanswitch = {irc, args- var idx, srvidx
- var ch, srv
+ /* full, end, internal */
+ var matches = [(-1, -1), (-1, -1), (-1, -1)]
+ var srv
if args.len != 1
status(irc, irc.self, "invalid arguments: {j= }", args)else
- srvidx = -1
- idx = -1
irc.chandirty = true
irc.cmddirty = true
- match std.strfind(irc.self.name, args[0])
- | `std.None: /* ok */
- | `std.Some i: idx = i
+ match matchrank(irc.self.name, args[0])
+ | `std.None: /* ok */
+ | `std.Some rank: matches[rank] = (0, -1)
;;
for var i = 0; i < irc.srv.len; i++
srv = irc.srv[i]
for var j = 0; j < srv.chan.len; j++
- ch = srv.chan[j]
- match std.strfind(ch.name, args[0])
- | `std.None: /* ok */
- | `std.Some n:
- if idx != -1
- status(irc, irc.self, "ambiguous channel name {}", args[0])- -> void
- else
- srvidx = i
- idx = j
- ;;
+ match matchrank(srv.chan[j].name, args[0])
+ | `std.None: /* ok */
+ | `std.Some rank:
+ matches[rank] = (j, i)
;;
;;
;;
- if idx != -1
- if idx == -1 || srvidx == -1
- irc.focus = -1
- else
- irc.focus = srvidx
- irc.srv[srvidx].focus = idx
- irc.srv[srvidx].chan[idx].stale = false
- irc.srv[srvidx].chan[idx].flagged = false
+
+ for (chanidx, srvidx) : matches[:]
+ if chanidx < 0
+ continue
;;
+ irc.focus = srvidx
+ if srvidx >= 0
+ irc.srv[srvidx].focus = chanidx
+ irc.srv[srvidx].chan[chanidx].stale = false
+ irc.srv[srvidx].chan[chanidx].flagged = false
+ ;;
+ break
+ ;;
+ ;;
+}
+
+const matchrank = {str, name+ match std.strfind(str, name)
+ | `std.None:
+ -> `std.None
+ | `std.Some idx:
+ match (idx, idx + name.len == str.len)
+ | (0, true): -> `std.Some 0
+ | (_, true): -> `std.Some 1
+ | (0, false): -> `std.Some 1
+ | (_, _): -> `std.Some 2
;;
;;
}
--
⑨