1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-23 08:08:00 +01:00

add shell command completion for :!

This commit is contained in:
Doug Kearns
2008-10-20 14:38:22 +00:00
parent d7cc0b041e
commit 03ed0502c8
3 changed files with 38 additions and 6 deletions

1
NEWS
View File

@@ -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

View File

@@ -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");

View File

@@ -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 //////////////////////////////////////////