X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=common%2Fcontent%2Fmappings.js;h=5a1d6b269452d6c5e6439560b404591cc375335a;hb=247daf849abc85f4cfb10fa358c62c8daf8db95b;hp=149f3fb86c170e264d2b03435e6e57e03b59b1f3;hpb=9044153cb63835e39b9de8ec4ade237c03e3888a;p=dactyl.git diff --git a/common/content/mappings.js b/common/content/mappings.js index 149f3fb..5a1d6b2 100644 --- a/common/content/mappings.js +++ b/common/content/mappings.js @@ -1,10 +1,10 @@ // Copyright (c) 2006-2008 by Martin Stubenschrott // Copyright (c) 2007-2011 by Doug Kearns -// Copyright (c) 2008-2011 by Kris Maglione +// Copyright (c) 2008-2014 Kris Maglione // // This work is licensed for reuse under an MIT license. Details are // given in the LICENSE.txt file included with this file. -/* use strict */ +"use strict"; /** @scope modules */ @@ -39,7 +39,7 @@ var Map = Class("Map", { Object.freeze(this.modes); if (info) { - if (Set.has(Map.types, info.type)) + if (hasOwnProperty(Map.types, info.type)) this.update(Map.types[info.type]); this.update(info); } @@ -48,9 +48,10 @@ var Map = Class("Map", { name: Class.Memoize(function () this.names[0]), /** @property {[string]} All of this mapping's names (key sequences). */ - names: Class.Memoize(function () this._keys.map(function (k) DOM.Event.canonicalKeys(k))), + names: Class.Memoize(function () this._keys.map(k => DOM.Event.canonicalKeys(k))), - get toStringParams() [this.modes.map(function (m) m.name), this.names.map(String.quote)], + get toStringParams() [this.modes.map(m => m.name), + this.names.map(String.quote)], get identifier() [this.modes[0].name, this.hive.prefix + this.names[0]].join("."), @@ -106,7 +107,7 @@ var Map = Class("Map", { */ hasName: function (name) this.keys.indexOf(name) >= 0, - get keys() array.flatten(this.names.map(mappings.closure.expand)), + get keys() array.flatten(this.names.map(mappings.bound.expand)), /** * Execute the action for this mapping. @@ -116,15 +117,14 @@ var Map = Class("Map", { execute: function (args) { if (!isObject(args)) // Backwards compatibility :( args = iter(["motion", "count", "arg", "command"]) - .map(function ([i, prop]) [prop, this[i]], arguments) + .map(([i, prop]) => [prop, this[i]], arguments) .toObject(); args = this.hive.makeArgs(this.hive.group.lastDocument, contexts.context, args); - let self = this; - function repeat() self.action(args) + let repeat = () => this.action(args); if (this.names[0] != ".") // FIXME: Kludge. mappings.repeat = repeat; @@ -171,10 +171,10 @@ var MapHive = Class("MapHive", Contexts.Hive, { * @param {[Modes.Mode]} modes The modes for which to return mappings. */ iterate: function (modes) { - let stacks = Array.concat(modes).map(this.closure.getStack); - return values(stacks.shift().sort(function (m1, m2) String.localeCompare(m1.name, m2.name)) - .filter(function (map) map.rhs && - stacks.every(function (stack) stack.some(function (m) m.rhs && m.rhs === map.rhs && m.name === map.name)))); + let stacks = Array.concat(modes).map(this.bound.getStack); + return values(stacks.shift().sort((m1, m2) => String.localeCompare(m1.name, m2.name)) + .filter((map) => map.rhs && + stacks.every(stack => stack.some(m => m.rhs && m.rhs === map.rhs && m.name === map.name)))); }, /** @@ -187,9 +187,7 @@ var MapHive = Class("MapHive", Contexts.Hive, { * @param {Object} extra An optional extra configuration hash. * @optional */ - add: function (modes, keys, description, action, extra) { - extra = extra || {}; - + add: function (modes, keys, description, action, extra={}) { modes = Array.concat(modes); if (!modes.every(util.identity)) throw TypeError(/*L*/"Invalid modes: " + modes); @@ -264,7 +262,7 @@ var MapHive = Class("MapHive", Contexts.Hive, { map.names.splice(j, 1); if (map.names.length == 0) // FIX ME. for (let [mode, stack] in Iterator(this.stacks)) - this.stacks[mode] = MapHive.Stack(stack.filter(function (m) m != map)); + this.stacks[mode] = MapHive.Stack(stack.filter(m => m != map)); return; } } @@ -353,20 +351,20 @@ var Mappings = Module("mappings", { get allHives() contexts.allGroups.mappings, - get userHives() this.allHives.filter(function (h) h !== this.builtin, this), + get userHives() this.allHives.filter(h => h !== this.builtin), - expandLeader: function expandLeader(keyString) keyString.replace(//i, function () options["mapleader"]), + expandLeader: deprecated("your brain", function expandLeader(keyString) keyString), prefixes: Class.Memoize(function () { - let list = Array.map("CASM", function (s) s + "-"); + let list = Array.map("CASM", s => s + "-"); - return iter(util.range(0, 1 << list.length)).map(function (mask) - list.filter(function (p, i) mask & (1 << i)).join("")).toArray().concat("*-"); + return iter(util.range(0, 1 << list.length)).map(mask => + list.filter((p, i) => mask & (1 << i)).join("")) + .toArray() + .concat("*-"); }), expand: function expand(keys) { - keys = keys.replace(//i, options["mapleader"]); - if (!/<\*-/.test(keys)) var res = keys; else @@ -374,7 +372,7 @@ var Mappings = Module("mappings", { if (/^<\*-/.test(key)) return ["<", this.prefixes, key.slice(3)]; return key; - }, this).flatten().array).map(function (k) DOM.Event.canonicalKeys(k)); + }, this).flatten().array).map(k => DOM.Event.canonicalKeys(k)); if (keys != arguments[0]) return [arguments[0]].concat(keys); @@ -382,10 +380,10 @@ var Mappings = Module("mappings", { }, iterate: function (mode) { - let seen = {}; + let seen = RealSet(); for (let hive in this.hives.iterValues()) for (let map in array(hive.getStack(mode)).iterValues()) - if (!Set.add(seen, map.name)) + if (!seen.add(map.name)) yield map; }, @@ -445,7 +443,8 @@ var Mappings = Module("mappings", { * @param {string} cmd The map name to match. * @returns {Map} */ - get: function get(mode, cmd) this.hives.map(function (h) h.get(mode, cmd)).compact()[0] || null, + get: function get(mode, cmd) this.hives.map(h => h.get(mode, cmd)) + .compact()[0] || null, /** * Returns a count of maps with names starting with but not equal to @@ -456,8 +455,8 @@ var Mappings = Module("mappings", { * @returns {[Map]} */ getCandidates: function (mode, prefix) - this.hives.map(function (h) h.getCandidates(mode, prefix)) - .reduce(function (a, b) a + b, 0), + this.hives.map(h => h.getCandidates(mode, prefix)) + .reduce((a, b) => (a + b), 0), /** * Lists all user-defined mappings matching *filter* for the specified @@ -468,48 +467,44 @@ var Mappings = Module("mappings", { * @param {[MapHive]} hives The map hives to list. @optional */ list: function (modes, filter, hives) { - let modeSign = modes.map(function (m) m.char || "").join("") - + modes.map(function (m) !m.char ? " " + m.name : "").join(""); + let modeSign = modes.map(m => m.char || "").join("") + + modes.map(m => !m.char ? " " + m.name : "").join(""); modeSign = modeSign.replace(/^ /, ""); - hives = (hives || mappings.userHives).map(function (h) [h, maps(h)]) - .filter(function ([h, m]) m.length); + hives = (hives || mappings.userHives).map(h => [h, maps(h)]) + .filter(([h, m]) => m.length); function maps(hive) { let maps = iter.toArray(hive.iterate(modes)); if (filter) - maps = maps.filter(function (m) m.names[0] === filter); + maps = maps.filter(m => m.names[0] === filter); return maps; } - let list = - - - - - - - { - template.map(hives, function ([hive, maps]) let (i = 0) - + - template.map(maps, function (map) - template.map(map.names, function (name) - - - - - - )) + - ) - } -
- {_("title.Mode")}{_("title.Command")}{_("title.Action")}
{!i++ ? hive.name : ""}{modeSign}{name}{map.rhs || map.action.toSource()}
; - - // TODO: Move this to an ItemList to show this automatically - if (list.*.length() === list.text().length() + 2) - dactyl.echomsg(_("map.none")); - else - commandline.commandOutput(list); + let list = ["table", {}, + ["tr", { highlight: "Title" }, + ["td", {}], + ["td", { style: "padding-right: 1em;" }, _("title.Mode")], + ["td", { style: "padding-right: 1em;" }, _("title.Command")], + ["td", { style: "padding-right: 1em;" }, _("title.Action")]], + ["col", { style: "min-width: 6em; padding-right: 1em;" }], + hives.map(([hive, maps]) => let (i = 0) [ + ["tr", { style: "height: .5ex;" }], + maps.map(map => + map.names.map(name => + ["tr", {}, + ["td", { highlight: "Title" }, !i++ ? hive.name : ""], + ["td", {}, modeSign], + ["td", {}, name], + ["td", {}, map.rhs || map.action.toSource()]])), + ["tr", { style: "height: .5ex;" }]])]; + + // E4X-FIXME + // // TODO: Move this to an ItemList to show this automatically + // if (list.*.length() === list.text().length() + 2) + // dactyl.echomsg(_("map.none")); + // else + commandline.commandOutput(list); } }, { }, { @@ -533,7 +528,7 @@ var Mappings = Module("mappings", { if (args[1] && !/^$/i.test(args[1]) && !args["-count"] && !args["-ex"] && !args["-javascript"] - && mapmodes.every(function (m) m.count)) + && mapmodes.every(m => m.count)) args[1] = "" + args[1]; let [lhs, rhs] = args; @@ -541,14 +536,14 @@ var Mappings = Module("mappings", { args["-builtin"] = true; if (!rhs) // list the mapping - mappings.list(mapmodes, mappings.expandLeader(lhs), hives); + mappings.list(mapmodes, lhs, hives); else { util.assert(args["-group"].modifiable, _("map.builtinImmutable")); args["-group"].add(mapmodes, [lhs], args["-description"], - contexts.bindMacro(args, "-keys", function (params) params), + contexts.bindMacro(args, "-keys", params => params), { arg: args["-arg"], count: args["-count"] || !(args["-ex"] || args["-javascript"]), @@ -578,7 +573,7 @@ var Mappings = Module("mappings", { options: [ { names: ["-arg", "-a"], - description: "Accept an argument after the requisite key press", + description: "Accept an argument after the requisite key press" }, { names: ["-builtin", "-b"], @@ -621,8 +616,8 @@ var Mappings = Module("mappings", { serialize: function () { return this.name != "map" ? [] : array(mappings.userHives) - .filter(function (h) h.persist) - .map(function (hive) [ + .filter(h => h.persist) + .map(hive => [ { command: "map", options: { @@ -643,10 +638,10 @@ var Mappings = Module("mappings", { } }; function userMappings(hive) { - let seen = {}; + let seen = RealSet(); for (let stack in values(hive.stacks)) for (let map in array.iterValues(stack)) - if (!Set.add(seen, map.id)) + if (!seen.add(map.id)) yield map; } @@ -659,7 +654,7 @@ var Mappings = Module("mappings", { commands.add([ch + "no[remap]"], "Map a key sequence without remapping keys" + modeDescription, function (args) { map(args, true); }, - update({}, opts)); + update({ deprecated: ":" + ch + "map -builtin" }, opts)); commands.add([ch + "unm[ap]"], "Remove a mapping" + modeDescription, @@ -718,9 +713,10 @@ var Mappings = Module("mappings", { } function uniqueModes(modes) { let chars = [k for ([k, v] in Iterator(modules.modes.modeChars)) - if (v.every(function (mode) modes.indexOf(mode) >= 0))]; - return array.uniq(modes.filter(function (m) chars.indexOf(m.char) < 0) - .map(function (m) m.name.toLowerCase()) + if (v.every(mode => modes.indexOf(mode) >= 0))]; + + return array.uniq(modes.filter(m => chars.indexOf(m.char) < 0) + .map(m => m.name.toLowerCase()) .concat(chars)); } @@ -753,35 +749,37 @@ var Mappings = Module("mappings", { if (!mainOnly) modes = modes[0].allBases; - let seen = {}; + let seen = RealSet(); // Bloody hell. --Kris for (let [i, mode] in Iterator(modes)) for (let hive in mappings.hives.iterValues()) for (let map in array.iterValues(hive.getStack(mode))) for (let name in values(map.names)) - if (!Set.add(seen, name)) { + if (!seen.add(name)) yield { name: name, columns: [ - i === 0 ? "" : {mode.name}, - hive == mappings.builtin ? "" : {hive.name} + i === 0 ? "" : ["span", { highlight: "Object", style: "padding-right: 1em;" }, + mode.name], + hive == mappings.builtin ? "" : ["span", { highlight: "Object", style: "padding-right: 1em;" }, + hive.name] ], __proto__: map }; - } }, format: { - description: function (map) (XML.ignoreWhitespace = false, XML.prettyPrinting = false, <> - {options.get("passkeys").has(map.name) - ? (passed by {template.helpLink("'passkeys'")}) - : <>} - {template.linkifyHelp(map.description + (map.rhs ? ": " + map.rhs : ""))} - ), - help: function (map) let (char = array.compact(map.modes.map(function (m) m.char))[0]) + description: function (map) [ + options.get("passkeys").has(map.name) + ? ["span", { highlight: "URLExtra" }, + "(", template.linkifyHelp(_("option.passkeys.passedBy")), ")"] + : [], + template.linkifyHelp(map.description + (map.rhs ? ": " + map.rhs : "")) + ], + help: function (map) let (char = array.compact(map.modes.map(m => m.char))[0]) char === "n" ? map.name : char ? char + "_" + map.name : "", headings: ["Command", "Mode", "Group", "Description"] } - } + }; dactyl.addUsageCommand({ __proto__: args, @@ -802,7 +800,7 @@ var Mappings = Module("mappings", { name: [mode.char + "listk[eys]", mode.char + "lk"], iterateIndex: function (args) let (self = this, prefix = /^[bCmn]$/.test(mode.char) ? "" : mode.char + "_", - haveTag = Set.has(help.tags)) + haveTag = k => hasOwnProperty(help.tags, k)) ({ helpTag: prefix + map.name, __proto__: map } for (map in self.iterate(args, true)) if (map.hive === mappings.builtin || haveTag(prefix + map.name))), @@ -814,10 +812,9 @@ var Mappings = Module("mappings", { }); }, completion: function initCompletion(dactyl, modules, window) { - completion.userMapping = function userMapping(context, modes_, hive) { - hive = hive || mappings.user; - modes_ = modes_ || [modes.NORMAL]; - context.keys = { text: function (m) m.names[0], description: function (m) m.description + ": " + m.action }; + completion.userMapping = function userMapping(context, modes_=[modes.NORMAL], hive=mappings.user) { + context.keys = { text: function (m) m.names[0], + description: function (m) m.description + ": " + m.action }; context.completions = hive.iterate(modes_); }; }, @@ -825,22 +822,15 @@ var Mappings = Module("mappings", { JavaScript.setCompleter([Mappings.prototype.get, MapHive.prototype.get], [ null, - function (context, obj, args) [[m.names, m.description] for (m in this.iterate(args[0]))] + function (context, obj, args) [[m.names, m.description] + for (m in this.iterate(args[0]))] ]); }, - options: function initOptions(dactyl, modules, window) { - options.add(["mapleader", "ml"], - "Define the replacement keys for the pseudo-key", - "string", "\\", { - setter: function (value) { - if (this.hasChanged) - for (let hive in values(mappings.allHives)) - for (let stack in values(hive.stacks)) - delete stack.states; - return value; - } - }); + mappings: function initMappings(dactyl, modules, window) { + mappings.add([modes.COMMAND], + ["\\"], "Emits pseudo-key", + function () { events.feedkeys(""); }); } }); -// vim: set fdm=marker sw=4 ts=4 et: +// vim: set fdm=marker sw=4 sts=4 ts=8 et: