From c0f552ebd08084ef2c3acd6ef2f14ee021be3d4b Mon Sep 17 00:00:00 2001
From: anekos
Date: Wed, 6 Apr 2011 04:25:58 +0900
Subject: -modes オプションを追加
---
feedSomeKeys_3.js | 91 +++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 72 insertions(+), 19 deletions(-)
(limited to 'feedSomeKeys_3.js')
diff --git a/feedSomeKeys_3.js b/feedSomeKeys_3.js
index 1709acd..42f837e 100644
--- a/feedSomeKeys_3.js
+++ b/feedSomeKeys_3.js
@@ -34,7 +34,7 @@ THE POSSIBILITY OF SUCH DAMAGE.
// INFO {{{
let INFO = <>
-
Define one mapping. @@ -60,7 +60,7 @@ let INFO = <>
Two or more mappings are defined at once. @@ -75,7 +75,7 @@ let INFO = <>
Remove the mappings matched with
Remove the mappings. @@ -123,6 +123,10 @@ let INFO = <>
"v..." values use virtual key code.
The event is generated in the order of writing of each key.
The default value of this option is "keypress".
++ List of mapping modes. (Default is NORMAL mode) +
If you input directly these commands in vimperator commandline, remove the ":lazy".
@@ -136,7 +140,7 @@ let INFO = <>
:lazy fmaps -u='http://code.google.com/p/vimperator-labs/issues/detail' u
- マッピングを一つ定義します。 @@ -162,7 +166,7 @@ let INFO = <>
一度に複数のマッピングを定義できます。 @@ -177,7 +181,7 @@ let INFO = <>
マッピングを削除します。 @@ -225,6 +229,10 @@ let INFO = <> キーイベントを送るべきフレームの番号。 番号は、補完を参考にしてください。
++ マップするモードのリスト (デフォルトは、NORMALモード) +
コマンドラインで直接に入力するときは、":lazy" を除いてください。
@@ -384,11 +392,26 @@ let INFO = <>
let xpathValidator =
makeTryValidator(function (expr) document.evaluate(expr, document, null, null, null))
+ function fromModeString (s){
+ for (let [, {name, mask, char}] in Iterator(modes._modeMap))
+ if (s === name || s === char)
+ return mask;
+ }
+
+ function fromModeStrings (ss, def) {
+ if (def && (!ss || ss.length < 1))
+ return [modes.NORMAL];
+ return ss.map(fromModeString).filter(function (it) (typeof it === 'number'));
+ }
+
+ function modeStringsValidator (ss)
+ (!ss || (fromModeStrings(ss).length === ss.length));
+
function makeListValidator (list)
function (values)
(values && !values.some(function (value) !list.some(function (event) event === value)));
- function findMappings ({all, filter, urls, ignoreUrls, not, result}) {
+ function findMappings ({all, filter, urls, ignoreUrls, not, result, modes: targetModes}) {
function match (map) {
let r = (
map.feedSomeKeys &&
@@ -410,12 +433,23 @@ let INFO = <>
if (urls)
urls = RegExp(urls);
- return mappings._user[modes.NORMAL].filter(match);
+ // FIXME 同じオブジェクトがダブって返るかも(あるいはそれで良い?)
+ let result = [];
+ for (let [, m] in Iterator(targetModes || [modes.NORMAL]))
+ result = result.concat(mappings._user[m].filter(match));
+
+ return result;
}
function unmap (condition) {
+ condition = Object.create(condition);
+ let ms = condition.modes || [modes.NORMAL];
condition.not = true;
- mappings._user[modes.NORMAL] = findMappings(condition);
+ condition.modes = undefined;
+ for (let [, m] in Iterator(ms)) {
+ condition.modes = [m];
+ mappings._user[m] = findMappings(condition);
+ }
}
function list (condition) {
@@ -483,6 +517,11 @@ let INFO = <>
];
}
+ const ModeStringsCompleter = [
+ [name, disp + ' mode' + (char ? ' (alias: ' + char + ')' : '')]
+ for ([n, {name, char, disp, extended}] in Iterator(modes._modeMap))
+ if (!extended && /^\D+$/(n))
+ ];
'fmap fmaps'.split(/\s+/).forEach(function (cmd) {
@@ -491,6 +530,7 @@ let INFO = <>
function action (multi) {
return function (args) {
let prefix = args['-prefix'] || '';
+ let ms = fromModeStrings(args['-modes']);
function add ([lhs, rhs]) {
if (!lhs)
@@ -498,7 +538,7 @@ let INFO = <>
rhs = rhs || lhs;
mappings.addUserMap(
- [modes.NORMAL],
+ ms,
[prefix + lhs],
args['description'] || 'by feedSomeKeys_3.js',
function () {
@@ -540,7 +580,8 @@ let INFO = <>
list({
filter: prefix + args.literalArg.trim(),
urls: args['-urls'],
- ignoreUrls: !args['-urls']
+ ignoreUrls: !args['-urls'],
+ modes: ms
});
} else {
add([lhs, rhs]);
@@ -556,6 +597,7 @@ let INFO = <>
{
literal: 0,
options: [
+ [['-modes', '-m'], commands.OPTION_LIST, modeStringsValidator, ModeStringsCompleter],
[['-urls', '-u'], commands.OPTION_STRING, regexpValidator, urlCompleter({currentURL: true})],
[['-desc', '-description', '-d'], commands.OPTION_STRING],
[['-frame', '-f'], commands.OPTION_INT, null, frameCompleter],
@@ -581,12 +623,13 @@ let INFO = <>
['fmapc'],
'Clear fmappings',
function (args) {
+ let ms = fromModeStrings(args['-modes']);
if (args.bang) {
- unmap({ignoreUrls: true});
+ unmap({ignoreUrls: true, modes: ms});
liberator.log('All fmappings were removed.');
} else {
let result = {};
- unmap({urls: args.literalArg, result: result});
+ unmap({urls: args.literalArg, result: result, modes: ms});
liberator.echo(result.matched ? 'Some fmappings were removed.' : 'Not found specifed fmappings.');
}
},
@@ -596,7 +639,10 @@ let INFO = <>
completer: function (context) {
context.title = ['URL Pattern'];
context.completions = urlCompleter({})(context);
- }
+ },
+ options: [
+ [['-modes', '-m'], commands.OPTION_LIST],
+ ]
},
true
);
@@ -611,12 +657,19 @@ let INFO = <>
return liberator.echoerr('E471: Argument required');
let result = {};
- unmap({filter: name, urls: urls, ignoreUrls: args['-ignoreurls'], result: result});
+ unmap({
+ filter: name,
+ urls: urls,
+ ignoreUrls: args['-ignoreurls'],
+ result: result,
+ modes: fromModeStrings(args['-modes'])
+ });
liberator.echo(result.matched ? 'Some fmappings were removed.' : 'Not found specifed fmappings.');
},
{
literal: 0,
options: [
+ [['-modes', '-m'], commands.OPTION_LIST]
[['-urls', '-u'], commands.OPTION_STRING, regexpValidator, urlCompleter({})],
[['-ignoreurls', '-iu'], commands.OPTION_NOARG]
],
--
cgit v1.2.3