mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-23 18:02:27 +01:00
add completion to :command and :delcommand
This commit is contained in:
@@ -139,7 +139,7 @@ liberator.Commands = function () //{{{
|
|||||||
|
|
||||||
var exCommands = [];
|
var exCommands = [];
|
||||||
|
|
||||||
function getUserCommands(name)
|
function getMatchingUserCommands(name)
|
||||||
{
|
{
|
||||||
var matches = [];
|
var matches = [];
|
||||||
for (var i = 0; i < exCommands.length; i++)
|
for (var i = 0; i < exCommands.length; i++)
|
||||||
@@ -160,18 +160,6 @@ liberator.Commands = function () //{{{
|
|||||||
return matches;
|
return matches;
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeUserCommand(name)
|
|
||||||
{
|
|
||||||
for (var i = 0; i < exCommands.length; i++)
|
|
||||||
{
|
|
||||||
if (exCommands[i].isUserCommand && exCommands[i].name == name)
|
|
||||||
{
|
|
||||||
exCommands.splice(i, 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////}}}
|
/////////////////////////////////////////////////////////////////////////////}}}
|
||||||
////////////////////// PUBLIC SECTION //////////////////////////////////////////
|
////////////////////// PUBLIC SECTION //////////////////////////////////////////
|
||||||
/////////////////////////////////////////////////////////////////////////////{{{
|
/////////////////////////////////////////////////////////////////////////////{{{
|
||||||
@@ -244,7 +232,7 @@ liberator.Commands = function () //{{{
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
removeUserCommand(command.name);
|
this.removeUserCommand(command.name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -265,6 +253,30 @@ liberator.Commands = function () //{{{
|
|||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getUserCommand: function (name)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < exCommands.length; i++)
|
||||||
|
{
|
||||||
|
if (exCommands[i].isUserCommand && exCommands[i].hasName(name))
|
||||||
|
return exCommands[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
getUserCommands: function ()
|
||||||
|
{
|
||||||
|
var userCommands = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < exCommands.length; i++)
|
||||||
|
{
|
||||||
|
if (exCommands[i].isUserCommand)
|
||||||
|
userCommands.push(exCommands[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return userCommands;
|
||||||
|
},
|
||||||
|
|
||||||
// in '-quoted strings, only ' and \ itself are escaped
|
// in '-quoted strings, only ' and \ itself are escaped
|
||||||
// in "-quoted strings, also ", \n and \t are translated
|
// in "-quoted strings, also ", \n and \t are translated
|
||||||
// in non-quoted strings everything is taken literally apart from "\ " and "\\"
|
// in non-quoted strings everything is taken literally apart from "\ " and "\\"
|
||||||
@@ -287,7 +299,7 @@ liberator.Commands = function () //{{{
|
|||||||
// @param allowUnknownOptions: -foo won't result in an error, if -foo isn't
|
// @param allowUnknownOptions: -foo won't result in an error, if -foo isn't
|
||||||
// specified in "options"
|
// specified in "options"
|
||||||
// TODO: should it handle comments?
|
// TODO: should it handle comments?
|
||||||
parseArgs: function (str, options, argCount, allowUnknownOptions)
|
parseArgs: function (str, options, argCount, allowUnknownOptions) //{{{
|
||||||
{
|
{
|
||||||
// returns [count, parsed_argument]
|
// returns [count, parsed_argument]
|
||||||
function getNextArg(str)
|
function getNextArg(str)
|
||||||
@@ -585,7 +597,7 @@ liberator.Commands = function () //{{{
|
|||||||
}
|
}
|
||||||
|
|
||||||
return args;
|
return args;
|
||||||
},
|
}, //}}}
|
||||||
|
|
||||||
// return [null, null, null, null, heredoc_tag || false];
|
// return [null, null, null, null, heredoc_tag || false];
|
||||||
// [count, cmd, special, args] = match;
|
// [count, cmd, special, args] = match;
|
||||||
@@ -626,7 +638,20 @@ liberator.Commands = function () //{{{
|
|||||||
matches[3] = "";
|
matches[3] = "";
|
||||||
|
|
||||||
return matches;
|
return matches;
|
||||||
|
},
|
||||||
|
|
||||||
|
removeUserCommand: function (name)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < exCommands.length; i++)
|
||||||
|
{
|
||||||
|
if (exCommands[i].isUserCommand && exCommands[i].hasName(name))
|
||||||
|
{
|
||||||
|
exCommands.splice(i, 1);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////}}}
|
/////////////////////////////////////////////////////////////////////////////}}}
|
||||||
@@ -664,7 +689,7 @@ liberator.Commands = function () //{{{
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var cmdlist = getUserCommands(cmd);
|
var cmdlist = getMatchingUserCommands(cmd);
|
||||||
if (cmdlist.length > 0)
|
if (cmdlist.length > 0)
|
||||||
{
|
{
|
||||||
var str = ":" + liberator.util.escapeHTML(liberator.commandline.getCommand()) + "<br/>" +
|
var str = ":" + liberator.util.escapeHTML(liberator.commandline.getCommand()) + "<br/>" +
|
||||||
@@ -688,32 +713,47 @@ liberator.Commands = function () //{{{
|
|||||||
/*options: [[["-nargs"], OPTION_STRING, function (arg) { return /^(0|1|\*|\?|\+)$/.test(arg); }],
|
/*options: [[["-nargs"], OPTION_STRING, function (arg) { return /^(0|1|\*|\?|\+)$/.test(arg); }],
|
||||||
[["-bang"], OPTION_NOARG],
|
[["-bang"], OPTION_NOARG],
|
||||||
[["-bar"], OPTION_NOARG]] */
|
[["-bar"], OPTION_NOARG]] */
|
||||||
|
completer: function (filter)
|
||||||
|
{
|
||||||
|
return liberator.completion.userCommand(filter);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
commandManager.add(["comc[lear]"],
|
commandManager.add(["comc[lear]"],
|
||||||
"Delete all user-defined commands",
|
"Delete all user-defined commands",
|
||||||
function ()
|
function ()
|
||||||
{
|
{
|
||||||
var commands = getUserCommands();
|
liberator.commands.getUserCommands().forEach(function (cmd) {
|
||||||
for (var i = 0; i < commands.length; i++)
|
liberator.commands.removeUserCommand(cmd.name);
|
||||||
removeUserCommand(commands[i].name);
|
});
|
||||||
},
|
},
|
||||||
{ argCount: "0" });
|
{ argCount: "0" });
|
||||||
|
|
||||||
// TODO: complete with user-defined commands
|
|
||||||
commandManager.add(["delc[ommand]"],
|
commandManager.add(["delc[ommand]"],
|
||||||
"Delete the specified user-defined command",
|
"Delete the specified user-defined command",
|
||||||
function (args)
|
function (args)
|
||||||
{
|
{
|
||||||
// TODO: add getUserCommand, removeUserCommands, or similar, and make them 'public'?
|
var name = args.arguments[0];
|
||||||
var cmd = args.arguments[0];
|
var cmdlist = liberator.commands.getUserCommands();
|
||||||
var commands = getUserCommands(cmd);
|
|
||||||
if (commands.length == 1 && cmd == commands[0].name)
|
for (var i = 0; i < cmdlist.length; i++)
|
||||||
removeUserCommand(commands[0].name);
|
{
|
||||||
else
|
if (cmdlist[i].name == name)
|
||||||
liberator.echoerr("E184: No such user-defined command: " + cmd);
|
{
|
||||||
|
liberator.commands.removeUserCommand(name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
liberator.echoerr("E184: No such user-defined command: " + name);
|
||||||
},
|
},
|
||||||
{ argCount: "1" });
|
{
|
||||||
|
argCount: "1",
|
||||||
|
completer: function (filter)
|
||||||
|
{
|
||||||
|
return liberator.completion.userCommand(filter);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
//}}}
|
//}}}
|
||||||
|
|
||||||
|
|||||||
@@ -165,23 +165,6 @@ liberator.Completion = function () //{{{
|
|||||||
return buildLongestCommonSubstring(array, filter);
|
return buildLongestCommonSubstring(array, filter);
|
||||||
},
|
},
|
||||||
|
|
||||||
command: function (filter)
|
|
||||||
{
|
|
||||||
var completions = [];
|
|
||||||
|
|
||||||
if (!filter)
|
|
||||||
{
|
|
||||||
for (var command in liberator.commands)
|
|
||||||
completions.push([command.name, command.description]);
|
|
||||||
return [0, completions];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var command in liberator.commands)
|
|
||||||
completions.push([command.longNames, command.description]);
|
|
||||||
|
|
||||||
return [0, buildLongestStartingSubstring(completions, filter)];
|
|
||||||
},
|
|
||||||
|
|
||||||
// FIXME: items shouldn't be [[[a], b]], but [[a, b]] and only mapped if at all for bLCS --mst
|
// FIXME: items shouldn't be [[[a], b]], but [[a, b]] and only mapped if at all for bLCS --mst
|
||||||
buffer: function (filter)
|
buffer: function (filter)
|
||||||
{
|
{
|
||||||
@@ -219,6 +202,58 @@ liberator.Completion = function () //{{{
|
|||||||
return [0, buildLongestCommonSubstring(items, filter)];
|
return [0, buildLongestCommonSubstring(items, filter)];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
command: function (filter)
|
||||||
|
{
|
||||||
|
var completions = [];
|
||||||
|
|
||||||
|
if (!filter)
|
||||||
|
{
|
||||||
|
for (var command in liberator.commands)
|
||||||
|
completions.push([command.name, command.description]);
|
||||||
|
return [0, completions];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var command in liberator.commands)
|
||||||
|
completions.push([command.longNames, command.description]);
|
||||||
|
|
||||||
|
return [0, buildLongestStartingSubstring(completions, filter)];
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: support file:// and \ or / path separators on both platforms
|
||||||
|
// if "tail" is true, only return names without any directory components
|
||||||
|
file: function (filter, tail)
|
||||||
|
{
|
||||||
|
var dir = "", compl = "";
|
||||||
|
var matches = filter.match(/^(.*[\/\\])?(.*?)$/);
|
||||||
|
if (matches)
|
||||||
|
{
|
||||||
|
dir = matches[1] || ""; // "" is expanded inside readDirectory to the current dir
|
||||||
|
compl = matches[2] || "";
|
||||||
|
}
|
||||||
|
|
||||||
|
var files = [], mapped = [];
|
||||||
|
try
|
||||||
|
{
|
||||||
|
files = liberator.io.readDirectory(dir);
|
||||||
|
mapped = files.map(function (file) {
|
||||||
|
return [tail ? file.leafName : (dir + file.leafName), file.isDirectory() ? "Directory" : "File"];
|
||||||
|
}).sort(function (a, b) {
|
||||||
|
return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0;
|
||||||
|
}).sort(function (a, b) {
|
||||||
|
return a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (e)
|
||||||
|
{
|
||||||
|
return [0, []];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tail)
|
||||||
|
return [dir.length, buildLongestStartingSubstring(mapped, compl)];
|
||||||
|
else
|
||||||
|
return [0, buildLongestStartingSubstring(mapped, filter)];
|
||||||
|
},
|
||||||
|
|
||||||
javascript: function (str)
|
javascript: function (str)
|
||||||
{
|
{
|
||||||
var matches = str.match(/^(.*?)(\s*\.\s*)?(\w*)$/);
|
var matches = str.match(/^(.*?)(\s*\.\s*)?(\w*)$/);
|
||||||
@@ -297,41 +332,6 @@ liberator.Completion = function () //{{{
|
|||||||
return [offset, buildLongestStartingSubstring(completions, filter)];
|
return [offset, buildLongestStartingSubstring(completions, filter)];
|
||||||
},
|
},
|
||||||
|
|
||||||
// TODO: support file:// and \ or / path separators on both platforms
|
|
||||||
// if "tail" is true, only return names without any directory components
|
|
||||||
file: function (filter, tail)
|
|
||||||
{
|
|
||||||
var dir = "", compl = "";
|
|
||||||
var matches = filter.match(/^(.*[\/\\])?(.*?)$/);
|
|
||||||
if (matches)
|
|
||||||
{
|
|
||||||
dir = matches[1] || ""; // "" is expanded inside readDirectory to the current dir
|
|
||||||
compl = matches[2] || "";
|
|
||||||
}
|
|
||||||
|
|
||||||
var files = [], mapped = [];
|
|
||||||
try
|
|
||||||
{
|
|
||||||
files = liberator.io.readDirectory(dir);
|
|
||||||
mapped = files.map(function (file) {
|
|
||||||
return [tail ? file.leafName : (dir + file.leafName), file.isDirectory() ? "Directory" : "File"];
|
|
||||||
}).sort(function (a, b) {
|
|
||||||
return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0;
|
|
||||||
}).sort(function (a, b) {
|
|
||||||
return a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (e)
|
|
||||||
{
|
|
||||||
return [0, []];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tail)
|
|
||||||
return [dir.length, buildLongestStartingSubstring(mapped, compl)];
|
|
||||||
else
|
|
||||||
return [0, buildLongestStartingSubstring(mapped, filter)];
|
|
||||||
},
|
|
||||||
|
|
||||||
macro: function (filter)
|
macro: function (filter)
|
||||||
{
|
{
|
||||||
var macros = [];
|
var macros = [];
|
||||||
@@ -400,6 +400,17 @@ liberator.Completion = function () //{{{
|
|||||||
return [0, completions];
|
return [0, completions];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
stylesheet: function (filter)
|
||||||
|
{
|
||||||
|
var stylesheets = getAllStyleSheets(window.content);
|
||||||
|
|
||||||
|
stylesheets = liberator.buffer.alternateStyleSheets.map(function (stylesheet) {
|
||||||
|
return [stylesheet.title, stylesheet.href || "inline"];
|
||||||
|
});
|
||||||
|
|
||||||
|
return [0, this.filter(stylesheets, filter)];
|
||||||
|
},
|
||||||
|
|
||||||
// filter a list of urls
|
// filter a list of urls
|
||||||
//
|
//
|
||||||
// may consist of search engines, filenames, bookmarks and history,
|
// may consist of search engines, filenames, bookmarks and history,
|
||||||
@@ -462,15 +473,11 @@ liberator.Completion = function () //{{{
|
|||||||
return [start, completions.concat(urlCompletionCache)];
|
return [start, completions.concat(urlCompletionCache)];
|
||||||
},
|
},
|
||||||
|
|
||||||
stylesheet: function (filter)
|
userCommand: function (filter)
|
||||||
{
|
{
|
||||||
var stylesheets = getAllStyleSheets(window.content);
|
var commands = liberator.commands.getUserCommands();
|
||||||
|
commands = commands.map(function (command) { return [command.name, ""]; });
|
||||||
stylesheets = liberator.buffer.alternateStyleSheets.map(function (stylesheet) {
|
return [0, this.filter(commands, filter)];
|
||||||
return [stylesheet.title, stylesheet.href || "inline"];
|
|
||||||
});
|
|
||||||
|
|
||||||
return [0, this.filter(stylesheets, filter)];
|
|
||||||
},
|
},
|
||||||
|
|
||||||
userMapping: function (filter, modes)
|
userMapping: function (filter, modes)
|
||||||
|
|||||||
Reference in New Issue
Block a user