diff options
Diffstat (limited to 'localkeymode.js')
-rw-r--r-- | localkeymode.js | 72 |
1 files changed, 36 insertions, 36 deletions
diff --git a/localkeymode.js b/localkeymode.js index 3ab2ccb..55a7b66 100644 --- a/localkeymode.js +++ b/localkeymode.js @@ -64,16 +64,16 @@ liberator.plugins.LocalKeyMode = (function() { var _isEnable; var _isBindLocalKey = false; - + var _enableTabs = []; var _names; var feedKeys = liberator.modules ? liberator.modules.events.feedkeys : liberator.events.feedkeys; // utility function - function cloneMap(org) { + function cloneMap(org, key) { return new Map( - org.modes, org.names, org.description, org.action, + org.modes, key ? key : org.names, org.description, org.action, {flags:org.flags, rhs:org.rhs, noremap:org.noremap } ); } @@ -102,7 +102,12 @@ liberator.plugins.LocalKeyMode = (function() { // ステータスバーにアイコンを生成 setupStatusBar: function() { var self = this; - var panel = document.createElement('statusbarpanel'); + var panel = document.getElementById('localkeymode-status'); + if (panel) { + let parent = panel.parentNode; + parent.removeChild(panel); + } + panel = document.createElement('statusbarpanel'); panel.setAttribute('id', 'localkeymode-status'); panel.setAttribute('class', 'statusbarpanel-iconic'); panel.setAttribute('src', self.isEnable ? ENABLE_ICON : DISABLE_ICON); @@ -111,17 +116,13 @@ liberator.plugins.LocalKeyMode = (function() { panel, document.getElementById('security-button').nextSibling); return panel; }, - get isEnable() { - return _isEnable; - }, + get isEnable() _isEnable, set isEnable(value) { this.panel.setAttribute('src', value ? ENABLE_ICON : DISABLE_ICON); _isEnable = value; this.loadKeyMap(); }, - get isBinding() { - return _isBindLocalKey; - }, + get isBinding() _isBindLocalKey, set isBinding(value) { this.panel.setAttribute('src', value ? BINDING_ICON : this.isEnable ? ENABLE_ICON : DISABLE_ICON ); @@ -133,14 +134,17 @@ liberator.plugins.LocalKeyMode = (function() { var list = liberator.globalVariables.localKeyMappings; if (!list) return; var self = this; + // キーマップの生成 list.forEach( function( items ) { if ( !(items instanceof Array) || items.length < 2 || !(items[1] instanceof Array) ) return; self.addLocalKeyMap( items[0], items[1] ); } ); + // 補完用アイテムの抽出 this.completeNames = this.keymapnames.map( function(m) { m = (m+'').replace(/[\/\\]+/g, ''); return [m+'', 'maps for [' + m + ']']; } ); + autocommands.add('LocationChange', '.*', 'js liberator.plugins.LocalKeyMode.loadKeyMap();'); }, // ローカルキーマップの生成 addLocalKeyMap: function( uri, items ) { @@ -149,28 +153,24 @@ liberator.plugins.LocalKeyMode = (function() { var delkeys = []; if (!(uri instanceof RegExp) ) uri = new RegExp(uri.replace(/(?=[^-0-9A-Za-z_@])/g, '\\')); - for (let i=0; i<items.length; i++) { - var item = items[i]; - if (item.length < 1 || !item[0]) continue; - if (item.length < 2) { - delkeys = delkeys.concat( item[0].split(' ') ); - continue; - } - var key = item[0] instanceof Array ? item[0] : [ item[0] ]; - var command = item[1]; - var extra = item[2] ? item[2]:new Object(); - if (!extra || !extra.rhs) extra.rhs = (item[1]+'').replace(rhsRegExp, ' '); - - if (typeof command != 'function') { - let commandName = command; - if (command.charAt(0) == ':') - command = extra.noremap ? function () commandline.open("", commandName, modes.EX) - : function () liberator.execute(commandName); - else - command = function () feedKeys(command, extra.noremap, true); + items.forEach( function( [key, command, extra] ){ + if (!key) return; + else if (!command) delkeys = delkeys.concat( key.split(' ')); + else { + key = key instanceof Array ? key : [key]; + extra = extra ? extra : new Object(); + if (!extra || !extra.rhs) extra.rhs = (command+'').replace(rhsRegExp, ' '); + if (typeof command != 'function'){ + let cmdName = command; + if (command.charAt(0) == ':') + command = extra.noremap ? function () commandline.open("", cmdName, modex.EX) + : function () liberator.execute(cmdName); + else + command = function () feedKeys( command, extra.noremap, true); + } + keymaps.push( new Map([modes.NORMAL], key, 'localkeymap', command, extra) ); } - keymaps.push(new Map([modes.NORMAL], key, 'localkeymap', command, extra) ); - } + }); this.keymapnames.push( uri ); this.localkeymaps.push( { keys:keymaps, removekeys:delkeys } ); }, @@ -196,14 +196,14 @@ liberator.plugins.LocalKeyMode = (function() { var self = this; keymaps.removekeys.forEach( function( key ) { var org = mappings.get( modes.NORMAL, key); - if (org) self.storekeymaps.push( cloneMap(org) ); + if (org) self.storekeymaps.push( cloneMap(org, [key]) ); self.helpstring += key+' -> [Delete KeyMap]\n'; mappings.remove( modes.NORMAL, key); } ); keymaps.keys.forEach( function( m ) { m.names.forEach( function( key ) { var org = mappings.get(modes.NORMAL, key); - if (org) self.storekeymaps.push( cloneMap(org) ); + if (org) self.storekeymaps.push( cloneMap(org, [key]) ); else self.delkeychars.push( key ); } ); mappings.addUserMap([modes.NORMAL], m.names, m.description, m.action, @@ -224,8 +224,9 @@ liberator.plugins.LocalKeyMode = (function() { }, // ローカルキーマップセット処理 loadKeyMap: function() { + var self = this; // 暫定処置 - if (liberator.plugins.feedKey && liberator.plugins.feedKey.origMap.length >0) return; + //if (liberator.plugins.feedKey && liberator.plugins.feedKey.origMap.length >0) return; this.helpstring = ''; if (this.isBinding) this.restoreKeyMap(); if (!this.isEnable) { @@ -258,6 +259,7 @@ liberator.plugins.LocalKeyMode = (function() { // 割り当てていたローカルキーの削除処理 restoreKeyMap: function() { if (this.isBinding) { + var msg = ""; for (; 0 < this.storekeymaps.length; ) { let m = this.storekeymaps.shift(); mappings.addUserMap([modes.NORMAL], m.names, m.description, m.action, @@ -323,5 +325,3 @@ liberator.plugins.LocalKeyMode = (function() { return new LocalKeyMode(); })(); - -autocommands.add('LocationChange', '.*', 'js liberator.plugins.LocalKeyMode.loadKeyMap();'); |