mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-23 05:57:58 +01:00
add shell command completion for :!
This commit is contained in:
1
NEWS
1
NEWS
@@ -11,6 +11,7 @@
|
|||||||
special versions for the old behavior
|
special versions for the old behavior
|
||||||
* IMPORTANT: renamed Startup and Quit autocmd events to VimperatorEnter and
|
* IMPORTANT: renamed Startup and Quit autocmd events to VimperatorEnter and
|
||||||
VimperatorLeave respectively
|
VimperatorLeave respectively
|
||||||
|
* add shell command completion for :!
|
||||||
* add :map <silent> to prevent a mapping from being echoed
|
* add :map <silent> to prevent a mapping from being echoed
|
||||||
* add guioptions=nN to number tabs
|
* add guioptions=nN to number tabs
|
||||||
* add :loadplugins command
|
* add :loadplugins command
|
||||||
|
|||||||
@@ -886,7 +886,7 @@ function Completion() //{{{
|
|||||||
var command = commands.get(cmd);
|
var command = commands.get(cmd);
|
||||||
if (command && command.completer)
|
if (command && command.completer)
|
||||||
{
|
{
|
||||||
matches = str.match(/^:*\d*\w+[\s!]\s*/);
|
matches = str.match(/^:*\d*(?:\w+[\s!]|!)\s*/);
|
||||||
exLength = matches ? matches[0].length : 0;
|
exLength = matches ? matches[0].length : 0;
|
||||||
[start, completions] = command.completer.call(this, args, special);
|
[start, completions] = command.completer.call(this, args, special);
|
||||||
}
|
}
|
||||||
@@ -1073,6 +1073,34 @@ function Completion() //{{{
|
|||||||
return [0, completions];
|
return [0, completions];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
shellCommand: function shellCommand(filter)
|
||||||
|
{
|
||||||
|
let generate = function ()
|
||||||
|
{
|
||||||
|
const environmentService = Components.classes["@mozilla.org/process/environment;1"]
|
||||||
|
.getService(Components.interfaces.nsIEnvironment);
|
||||||
|
|
||||||
|
let dirNames = environmentService.get("PATH").split(RegExp(WINDOWS ? ";" : ":"));
|
||||||
|
let commands = [];
|
||||||
|
|
||||||
|
for (let [,dirName] in Iterator(dirNames))
|
||||||
|
{
|
||||||
|
let dir = io.getFile(dirName);
|
||||||
|
if (dir.exists() && dir.isDirectory())
|
||||||
|
{
|
||||||
|
io.readDirectory(dir).forEach(function (file) {
|
||||||
|
if (file.isFile() && file.isExecutable())
|
||||||
|
commands.push([file.leafName, dir.path]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [0, this.cached("shell-command", filter, generate, "filter")];
|
||||||
|
},
|
||||||
|
|
||||||
sidebar: function sidebar(filter)
|
sidebar: function sidebar(filter)
|
||||||
{
|
{
|
||||||
let menu = document.getElementById("viewSidebarMenu");
|
let menu = document.getElementById("viewSidebarMenu");
|
||||||
|
|||||||
@@ -363,18 +363,21 @@ function IO() //{{{
|
|||||||
if (special)
|
if (special)
|
||||||
args = "!" + (args || "");
|
args = "!" + (args || "");
|
||||||
|
|
||||||
// TODO: better escaping of ! to also substitute \\! correctly
|
// TODO: Hmmm, actually Vim doesn't handle multiple backslashes and documents it - desirable?
|
||||||
args = args.replace(/(^|[^\\])!/g, "$1" + lastRunCommand);
|
args = args.replace(/((?:^|[^\\])(?:\\\\)*)!/g, function(m, n) n != null ? n + lastRunCommand : m)
|
||||||
lastRunCommand = args;
|
lastRunCommand = args;
|
||||||
|
|
||||||
var output = io.system(args);
|
let output = io.system(args);
|
||||||
var command = ":" + util.escapeHTML(commandline.getCommand()) + "<br/>";
|
let command = ":" + util.escapeHTML(commandline.getCommand()) + "<br/>";
|
||||||
|
|
||||||
liberator.echo(command + util.escapeHTML(output));
|
liberator.echo(command + util.escapeHTML(output));
|
||||||
|
|
||||||
autocommands.trigger("ShellCmdPost", {});
|
autocommands.trigger("ShellCmdPost", {});
|
||||||
},
|
},
|
||||||
{ bang: true });
|
{
|
||||||
|
bang: true,
|
||||||
|
completer: function (filter) completion.shellCommand(filter)
|
||||||
|
});
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////}}}
|
/////////////////////////////////////////////////////////////////////////////}}}
|
||||||
////////////////////// PUBLIC SECTION //////////////////////////////////////////
|
////////////////////// PUBLIC SECTION //////////////////////////////////////////
|
||||||
|
|||||||
Reference in New Issue
Block a user