mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-23 23:32:26 +01:00
fixed the indentation and and command line completion
This commit is contained in:
@@ -61,26 +61,26 @@ function multiliner(line, prev_match, heredoc)
|
|||||||
*/
|
*/
|
||||||
function CommandLine ()
|
function CommandLine ()
|
||||||
{
|
{
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
////////////////////// PRIVATE SECTION /////////////////////////////////////////
|
////////////////////// PRIVATE SECTION /////////////////////////////////////////
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
const UNINITIALIZED = -2; // notifies us, if we need to start history/tab-completion from the beginning
|
const UNINITIALIZED = -2; // notifies us, if we need to start history/tab-completion from the beginning
|
||||||
const HISTORY_SIZE = 500;
|
const HISTORY_SIZE = 500;
|
||||||
|
|
||||||
var completionlist = new CompletionList();
|
var completionlist = new CompletionList();
|
||||||
var completions = new Array();
|
var completions = new Array();
|
||||||
|
|
||||||
var history = new Array();
|
var history = new Array();
|
||||||
var history_index = UNINITIALIZED;
|
var history_index = UNINITIALIZED;
|
||||||
var history_start = "";
|
var history_start = "";
|
||||||
|
|
||||||
// for the example command "open sometext| othertext" (| is the cursor pos)
|
// for the example command "open sometext| othertext" (| is the cursor pos)
|
||||||
var completion_start_index = 0; // will be 5 because we want to complete arguments for the :open command
|
var completion_start_index = 0; // will be 5 because we want to complete arguments for the :open command
|
||||||
var completion_prefix = "" // will be: "open sometext"
|
var completion_prefix = "" // will be: "open sometext"
|
||||||
var completion_postfix = ""; // will be: " othertext"
|
var completion_postfix = ""; // will be: " othertext"
|
||||||
|
|
||||||
var wild_index = 0; // keep track how often we press <Tab> in a row
|
var wild_index = 0; // keep track how often we press <Tab> in a row
|
||||||
var completion_index = UNINITIALIZED;
|
var completion_index = UNINITIALIZED;
|
||||||
|
|
||||||
// The prompt for the current command, for example : or /. Can be blank
|
// The prompt for the current command, for example : or /. Can be blank
|
||||||
var prompt_widget = document.getElementById('new-vim-commandbar-prompt');
|
var prompt_widget = document.getElementById('new-vim-commandbar-prompt');
|
||||||
@@ -88,341 +88,333 @@ function CommandLine ()
|
|||||||
var command_widget = document.getElementById('new-vim-commandbar');
|
var command_widget = document.getElementById('new-vim-commandbar');
|
||||||
|
|
||||||
function setNormalStyle()
|
function setNormalStyle()
|
||||||
{
|
{
|
||||||
command_widget.inputField.setAttribute("style","font-family: monospace;");
|
command_widget.inputField.setAttribute("style","font-family: monospace;");
|
||||||
}
|
}
|
||||||
function setErrorStyle()
|
function setErrorStyle()
|
||||||
{
|
{
|
||||||
command_widget.inputField.setAttribute("style", "font-family: monospace; color:white; background-color:red; font-weight: bold");
|
command_widget.inputField.setAttribute("style", "font-family: monospace; color:white; background-color:red; font-weight: bold");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets the prompt - for example, : or /
|
// Sets the prompt - for example, : or /
|
||||||
function setPrompt(prompt)
|
function setPrompt(prompt)
|
||||||
{
|
{
|
||||||
if (typeof(prompt) != "string")
|
if (typeof(prompt) != "string")
|
||||||
prompt = "";
|
prompt = "";
|
||||||
|
|
||||||
prompt_widget.value = prompt;
|
prompt_widget.value = prompt;
|
||||||
if (prompt)
|
if (prompt)
|
||||||
{
|
{
|
||||||
// Initially (in the xul) the prompt is 'collapsed', this makes
|
// Initially (in the xul) the prompt is 'collapsed', this makes
|
||||||
// sure it's visible, then we toggle the display which works better
|
// sure it's visible, then we toggle the display which works better
|
||||||
prompt_widget.style.visibility = 'visible';
|
prompt_widget.style.visibility = 'visible';
|
||||||
prompt_widget.style.display = 'inline';
|
prompt_widget.style.display = 'inline';
|
||||||
prompt_widget.size = prompt.length;
|
prompt_widget.size = prompt.length;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
prompt_widget.style.display = 'none';
|
prompt_widget.style.display = 'none';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets the command - e.g. 'tabopen', 'open http://example.com/'
|
// Sets the command - e.g. 'tabopen', 'open http://example.com/'
|
||||||
function setCommand(cmd)
|
function setCommand(cmd)
|
||||||
{
|
{
|
||||||
command_widget.value = cmd;
|
command_widget.value = cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addToHistory(str)
|
function addToHistory(str)
|
||||||
{
|
{
|
||||||
// first remove all old history elements which have this string
|
// first remove all old history elements which have this string
|
||||||
history = history.filter(function(elem) {
|
history = history.filter(function(elem) {
|
||||||
return elem != str;
|
return elem != str;
|
||||||
});
|
});
|
||||||
// add string to the command line history
|
// add string to the command line history
|
||||||
if (str.length >= 1 && history.push(str) > HISTORY_SIZE)
|
if (str.length >= 1 && history.push(str) > HISTORY_SIZE)
|
||||||
history.shift();
|
history.shift();
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
////////////////////// PUBLIC SECTION //////////////////////////////////////////
|
////////////////////// PUBLIC SECTION //////////////////////////////////////////
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
this.getCommand = function()
|
this.getCommand = function()
|
||||||
{
|
{
|
||||||
return command_widget.value;
|
return command_widget.value;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All arguments can be ommited and will be defaulted to ""
|
* All arguments can be ommited and will be defaulted to ""
|
||||||
*/
|
*/
|
||||||
this.open = function(prompt, cmd, minor_mode)
|
this.open = function(prompt, cmd, minor_mode)
|
||||||
{
|
{
|
||||||
if (!prompt)
|
if (!prompt)
|
||||||
prompt = "";
|
prompt = "";
|
||||||
if (!cmd)
|
if (!cmd)
|
||||||
cmd = "";
|
cmd = "";
|
||||||
if (minor_mode)
|
if (minor_mode)
|
||||||
setCurrentMode(minor_mode);
|
setCurrentMode(minor_mode);
|
||||||
|
|
||||||
setNormalStyle();
|
setNormalStyle();
|
||||||
setPrompt(prompt);
|
setPrompt(prompt);
|
||||||
setCommand(cmd);
|
setCommand(cmd);
|
||||||
history_index = UNINITIALIZED;
|
history_index = UNINITIALIZED;
|
||||||
completion_index = UNINITIALIZED;
|
completion_index = UNINITIALIZED;
|
||||||
command_widget.focus();
|
command_widget.focus();
|
||||||
};
|
};
|
||||||
|
|
||||||
this.echo = function(str)
|
this.echo = function(str)
|
||||||
{
|
{
|
||||||
setNormalStyle();
|
setNormalStyle();
|
||||||
setPrompt("");
|
setPrompt("");
|
||||||
setCommand(str);
|
setCommand(str);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.echoErr = function(str)
|
this.echoErr = function(str)
|
||||||
{
|
{
|
||||||
setErrorStyle();
|
setErrorStyle();
|
||||||
setPrompt("");
|
setPrompt("");
|
||||||
setCommand(str);
|
setCommand(str);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.clear = function()
|
this.clear = function()
|
||||||
{
|
{
|
||||||
setPrompt(" "); // looks faster than an empty string
|
setPrompt(" "); // looks faster than an empty string
|
||||||
setCommand("");
|
setCommand("");
|
||||||
setNormalStyle();
|
setNormalStyle();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
this.onEvent = function(event)
|
this.onEvent = function(event)
|
||||||
|
{
|
||||||
|
//var end = false;
|
||||||
|
var command = this.getCommand();
|
||||||
|
|
||||||
|
if(event.type == "blur")
|
||||||
{
|
{
|
||||||
//var end = false;
|
// when we do a command_widget.focus() we get a blur event immediately,
|
||||||
var command = this.getCommand();
|
// so check if the target is the actualy input field
|
||||||
|
if (event.target == command_widget.inputField)
|
||||||
if(event.type == "blur")
|
{
|
||||||
{
|
addToHistory(command);
|
||||||
// when we do a command_widget.focus() we get a blur event immediately,
|
completionlist.hide();
|
||||||
// so check if the target is the actualy input field
|
}
|
||||||
if (event.target == command_widget.inputField)
|
|
||||||
{
|
|
||||||
addToHistory(command);
|
|
||||||
completionlist.hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(event.type == "input")
|
|
||||||
{
|
|
||||||
vimperator.triggerCallback("change", command);
|
|
||||||
}
|
|
||||||
else if(event.type == "keypress")
|
|
||||||
{
|
|
||||||
var key = keyToString(event);
|
|
||||||
/* user pressed ENTER to carry out a command */
|
|
||||||
if (key == "<Return>" || key == "<C-j>" || key == "<C-m>")
|
|
||||||
{
|
|
||||||
// try {
|
|
||||||
// [prev_match, heredoc, end] = multiliner(command, prev_match, heredoc);
|
|
||||||
// } catch(e) {
|
|
||||||
// logObject(e);
|
|
||||||
// echoerr(e.name + ": " + e.message);
|
|
||||||
// prev_match = new Array(5);
|
|
||||||
// heredoc = '';
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// if (!end)
|
|
||||||
// command_line.value = "";
|
|
||||||
|
|
||||||
// the command is saved in the blur() handler
|
|
||||||
focusContent();
|
|
||||||
var res = vimperator.triggerCallback("submit", command);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
/* user pressed ESCAPE to cancel this prompt */
|
|
||||||
else if (key == "<Esc>" || key == "<C-[>")
|
|
||||||
{
|
|
||||||
var res = vimperator.triggerCallback("cancel");
|
|
||||||
addToHistory(command);
|
|
||||||
this.clear();
|
|
||||||
focusContent(true, true);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* user pressed UP or DOWN arrow to cycle history completion */
|
|
||||||
else if (key == "<Up>" || key == "<Down>")
|
|
||||||
{
|
|
||||||
//always reset the tab completion if we use up/down keys
|
|
||||||
completion_index = UNINITIALIZED;
|
|
||||||
|
|
||||||
/* save 'start' position for iterating through the history */
|
|
||||||
if (history_index == UNINITIALIZED)
|
|
||||||
{
|
|
||||||
history_index = history.length;
|
|
||||||
history_start = command;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (history_index >= -1 && history_index <= history.length)
|
|
||||||
{
|
|
||||||
key == "<Up>" ? history_index-- : history_index++;
|
|
||||||
if (history_index == history.length) // user pressed DOWN when there is no newer history item
|
|
||||||
{
|
|
||||||
setCommand(history_start);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// cannot go past history start/end
|
|
||||||
if (history_index <= -1)
|
|
||||||
{
|
|
||||||
history_index = 0;
|
|
||||||
beep();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (history_index >= history.length + 1)
|
|
||||||
{
|
|
||||||
history_index = history.length;
|
|
||||||
beep();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (history[history_index].indexOf(history_start) == 0)
|
|
||||||
{
|
|
||||||
setCommand(history[history_index]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
beep();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* user pressed TAB to get completions of a command */
|
|
||||||
else if (key == "<Tab>" || key == "<S-Tab>")
|
|
||||||
{
|
|
||||||
//always reset our completion history so up/down keys will start with new values
|
|
||||||
history_index = UNINITIALIZED;
|
|
||||||
|
|
||||||
// we need to build our completion list first
|
|
||||||
if (completion_index == UNINITIALIZED)
|
|
||||||
{
|
|
||||||
// FIXME: completions.clear();
|
|
||||||
completion_start_index = 0;
|
|
||||||
|
|
||||||
completion_index = -1;
|
|
||||||
wild_index = 0;
|
|
||||||
|
|
||||||
completion_prefix = command.substring(0, command_widget.selectionStart);
|
|
||||||
completion_postfix = command.substring(command_widget.selectionStart);
|
|
||||||
var res = vimperator.triggerCallback("complete", completion_prefix);
|
|
||||||
if (res)
|
|
||||||
[completion_start_index, completions] = res;
|
|
||||||
|
|
||||||
// Sort the completion list
|
|
||||||
if (get_pref('wildoptions').match(/\bsort\b/))
|
|
||||||
{
|
|
||||||
completions.sort(function(a, b) {
|
|
||||||
if (a[0] < b[0])
|
|
||||||
return -1;
|
|
||||||
else if (a[0] > b[0])
|
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// we could also return when no completion is found
|
|
||||||
// but we fall through to the cleanup anyway
|
|
||||||
if (completions.length == 0)
|
|
||||||
{
|
|
||||||
beep();
|
|
||||||
// prevent tab from moving to the next field
|
|
||||||
event.preventDefault();
|
|
||||||
event.stopPropagation();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var wim = get_pref('wildmode').split(/,/);
|
|
||||||
var has_list = false;
|
|
||||||
var longest = false;
|
|
||||||
var full = false;
|
|
||||||
var wildtype = wim[wild_index++] || wim[wim.length - 1];
|
|
||||||
if (wildtype == 'list' || wildtype == 'list:full' || wildtype == 'list:longest')
|
|
||||||
has_list = true;
|
|
||||||
else if (wildtype == 'longest' || wildtype == 'list:longest')
|
|
||||||
longest = true;
|
|
||||||
else if (wildtype == 'full' || wildtype == 'list:full')
|
|
||||||
full = true;
|
|
||||||
|
|
||||||
// show the list
|
|
||||||
if (has_list)
|
|
||||||
{
|
|
||||||
completionlist.show(completions);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (full)
|
|
||||||
{
|
|
||||||
if (event.shiftKey)
|
|
||||||
{
|
|
||||||
completion_index--;
|
|
||||||
if(completion_index < -1)
|
|
||||||
completion_index = completions.length -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
completion_index++;
|
|
||||||
if(completion_index >= completions.length)
|
|
||||||
completion_index = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
showStatusbarMessage("match " + (completion_index+1).toString() + " of " + completions.length.toString(), STATUSFIELD_PROGRESS);
|
|
||||||
// if the list is hidden, this function does nothing
|
|
||||||
completionlist.selectItem(completion_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// if (longest && completions.length == 1)
|
|
||||||
// {
|
|
||||||
// completion_index=0;
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (completion_index == -1 && !longest) // wrapped around matches, reset command line
|
|
||||||
{
|
|
||||||
if (full && completions.length > 1)
|
|
||||||
{
|
|
||||||
setCommand(completion_prefix + completion_postfix);
|
|
||||||
//completion_list.selectedIndex = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (longest && completions.length > 1)
|
|
||||||
var compl = get_longest_substring();
|
|
||||||
if (full)
|
|
||||||
var compl = completions[completion_index][0];
|
|
||||||
if (completions.length == 1)
|
|
||||||
var compl = completions[COMMANDS][0];
|
|
||||||
//alert(compl)
|
|
||||||
if (compl)
|
|
||||||
{
|
|
||||||
setCommand(command.substring(0, completion_start_index) + compl + completion_postfix);
|
|
||||||
command_widget.selectionStart = command_widget.selectionEnd = completion_start_index + compl.length;
|
|
||||||
|
|
||||||
// XXX: needed?
|
|
||||||
// // Start a new completion in the next iteration. Useful for commands like :source
|
|
||||||
// if (completions.length == 1 && !full) // RFC: perhaps the command can indicate whether the completion should be restarted
|
|
||||||
// completion_index = UNINITIALIZED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// prevent tab from moving to the next field
|
|
||||||
event.preventDefault();
|
|
||||||
event.stopPropagation();
|
|
||||||
}
|
|
||||||
else if (key == "<BS>")
|
|
||||||
{
|
|
||||||
// reset the tab completion
|
|
||||||
completion_index = history_index = UNINITIALIZED;
|
|
||||||
|
|
||||||
// and blur the command line if there is no text left
|
|
||||||
if(command.length == 0)
|
|
||||||
{
|
|
||||||
this.clear();
|
|
||||||
focusContent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // any other key
|
|
||||||
{
|
|
||||||
// reset the tab completion
|
|
||||||
completion_index = history_index = UNINITIALIZED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else if(event.type == "input")
|
||||||
|
{
|
||||||
|
vimperator.triggerCallback("change", command);
|
||||||
|
}
|
||||||
|
else if(event.type == "keypress")
|
||||||
|
{
|
||||||
|
var key = keyToString(event);
|
||||||
|
/* user pressed ENTER to carry out a command */
|
||||||
|
if (key == "<Return>" || key == "<C-j>" || key == "<C-m>")
|
||||||
|
{
|
||||||
|
// try {
|
||||||
|
// [prev_match, heredoc, end] = multiliner(command, prev_match, heredoc);
|
||||||
|
// } catch(e) {
|
||||||
|
// logObject(e);
|
||||||
|
// echoerr(e.name + ": " + e.message);
|
||||||
|
// prev_match = new Array(5);
|
||||||
|
// heredoc = '';
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// if (!end)
|
||||||
|
// command_line.value = "";
|
||||||
|
|
||||||
|
// the command is saved in the blur() handler
|
||||||
|
focusContent();
|
||||||
|
var res = vimperator.triggerCallback("submit", command);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
/* user pressed ESCAPE to cancel this prompt */
|
||||||
|
else if (key == "<Esc>" || key == "<C-[>")
|
||||||
|
{
|
||||||
|
var res = vimperator.triggerCallback("cancel");
|
||||||
|
addToHistory(command);
|
||||||
|
this.clear();
|
||||||
|
focusContent(true, true);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* user pressed UP or DOWN arrow to cycle history completion */
|
||||||
|
else if (key == "<Up>" || key == "<Down>")
|
||||||
|
{
|
||||||
|
//always reset the tab completion if we use up/down keys
|
||||||
|
completion_index = UNINITIALIZED;
|
||||||
|
|
||||||
|
/* save 'start' position for iterating through the history */
|
||||||
|
if (history_index == UNINITIALIZED)
|
||||||
|
{
|
||||||
|
history_index = history.length;
|
||||||
|
history_start = command;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (history_index >= -1 && history_index <= history.length)
|
||||||
|
{
|
||||||
|
key == "<Up>" ? history_index-- : history_index++;
|
||||||
|
if (history_index == history.length) // user pressed DOWN when there is no newer history item
|
||||||
|
{
|
||||||
|
setCommand(history_start);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// cannot go past history start/end
|
||||||
|
if (history_index <= -1)
|
||||||
|
{
|
||||||
|
history_index = 0;
|
||||||
|
beep();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (history_index >= history.length + 1)
|
||||||
|
{
|
||||||
|
history_index = history.length;
|
||||||
|
beep();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (history[history_index].indexOf(history_start) == 0)
|
||||||
|
{
|
||||||
|
setCommand(history[history_index]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
beep();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* user pressed TAB to get completions of a command */
|
||||||
|
else if (key == "<Tab>" || key == "<S-Tab>")
|
||||||
|
{
|
||||||
|
//always reset our completion history so up/down keys will start with new values
|
||||||
|
history_index = UNINITIALIZED;
|
||||||
|
|
||||||
|
// we need to build our completion list first
|
||||||
|
if (completion_index == UNINITIALIZED)
|
||||||
|
{
|
||||||
|
// FIXME: completions.clear();
|
||||||
|
completion_start_index = 0;
|
||||||
|
|
||||||
|
completion_index = -1;
|
||||||
|
wild_index = 0;
|
||||||
|
|
||||||
|
completion_prefix = command.substring(0, command_widget.selectionStart);
|
||||||
|
completion_postfix = command.substring(command_widget.selectionStart);
|
||||||
|
var res = vimperator.triggerCallback("complete", completion_prefix);
|
||||||
|
if (res)
|
||||||
|
[completion_start_index, completions] = res;
|
||||||
|
|
||||||
|
// Sort the completion list
|
||||||
|
if (get_pref('wildoptions').match(/\bsort\b/))
|
||||||
|
{
|
||||||
|
completions.sort(function(a, b) {
|
||||||
|
if (a[0] < b[0])
|
||||||
|
return -1;
|
||||||
|
else if (a[0] > b[0])
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// we could also return when no completion is found
|
||||||
|
// but we fall through to the cleanup anyway
|
||||||
|
if (completions.length == 0)
|
||||||
|
{
|
||||||
|
beep();
|
||||||
|
// prevent tab from moving to the next field
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wim = get_pref('wildmode').split(/,/);
|
||||||
|
var has_list = false;
|
||||||
|
var longest = false;
|
||||||
|
var full = false;
|
||||||
|
var wildtype = wim[wild_index++] || wim[wim.length - 1];
|
||||||
|
if (wildtype == 'list' || wildtype == 'list:full' || wildtype == 'list:longest')
|
||||||
|
has_list = true;
|
||||||
|
if (wildtype == 'longest' || wildtype == 'list:longest')
|
||||||
|
longest = true;
|
||||||
|
else if (wildtype == 'full' || wildtype == 'list:full')
|
||||||
|
full = true;
|
||||||
|
|
||||||
|
// show the list
|
||||||
|
if (has_list)
|
||||||
|
completionlist.show(completions);
|
||||||
|
|
||||||
|
if (full)
|
||||||
|
{
|
||||||
|
if (event.shiftKey)
|
||||||
|
{
|
||||||
|
completion_index--;
|
||||||
|
if(completion_index < -1)
|
||||||
|
completion_index = completions.length -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
completion_index++;
|
||||||
|
if(completion_index >= completions.length)
|
||||||
|
completion_index = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
showStatusbarMessage("match " + (completion_index+1).toString() + " of " + completions.length.toString(), STATUSFIELD_PROGRESS);
|
||||||
|
// if the list is hidden, this function does nothing
|
||||||
|
completionlist.selectItem(completion_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (completion_index == -1 && !longest) // wrapped around matches, reset command line
|
||||||
|
{
|
||||||
|
if (full && completions.length > 1)
|
||||||
|
{
|
||||||
|
setCommand(completion_prefix + completion_postfix);
|
||||||
|
//completion_list.selectedIndex = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (longest && completions.length > 1)
|
||||||
|
var compl = get_longest_substring();
|
||||||
|
else if (full)
|
||||||
|
var compl = completions[completion_index][0];
|
||||||
|
else if (completions.length == 1)
|
||||||
|
var compl = completions[0][0];
|
||||||
|
if (compl)
|
||||||
|
{
|
||||||
|
setCommand(command.substring(0, completion_start_index) + compl + completion_postfix);
|
||||||
|
command_widget.selectionStart = command_widget.selectionEnd = completion_start_index + compl.length;
|
||||||
|
|
||||||
|
// Start a new completion in the next iteration. Useful for commands like :source
|
||||||
|
// RFC: perhaps the command can indicate whether the completion should be restarted
|
||||||
|
// Needed for :source to grab another set of completions after a file/directory has been filled out
|
||||||
|
if (completions.length == 1 && !full)
|
||||||
|
completion_index = UNINITIALIZED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// prevent tab from moving to the next field
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
}
|
||||||
|
else if (key == "<BS>")
|
||||||
|
{
|
||||||
|
// reset the tab completion
|
||||||
|
completion_index = history_index = UNINITIALIZED;
|
||||||
|
|
||||||
|
// and blur the command line if there is no text left
|
||||||
|
if(command.length == 0)
|
||||||
|
{
|
||||||
|
this.clear();
|
||||||
|
focusContent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // any other key
|
||||||
|
{
|
||||||
|
// reset the tab completion
|
||||||
|
completion_index = history_index = UNINITIALIZED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
logMessage("CommandLine initialized.");
|
logMessage("CommandLine initialized.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user