Support Shift-Tab in prompt mode to go back in completions
This commit is contained in:
parent
b5a2901f8d
commit
ee4c6b04a6
|
@ -107,9 +107,10 @@ private:
|
||||||
class Client::PromptMode : public Client::Mode
|
class Client::PromptMode : public Client::Mode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PromptMode(Client& client, const String& prompt, Completer completer, PromptCallback callback)
|
PromptMode(Client& client, const String& prompt,
|
||||||
: Client::Mode(client),
|
Completer completer, PromptCallback callback)
|
||||||
m_prompt(prompt), m_completer(completer), m_callback(callback), m_cursor_pos(0)
|
: Client::Mode(client), m_prompt(prompt),
|
||||||
|
m_completer(completer), m_callback(callback)
|
||||||
{
|
{
|
||||||
m_history_it = ms_history[m_prompt].end();
|
m_history_it = ms_history[m_prompt].end();
|
||||||
m_client.print_status(m_prompt, m_prompt.length());
|
m_client.print_status(m_prompt, m_prompt.length());
|
||||||
|
@ -135,6 +136,8 @@ public:
|
||||||
PromptCallback callback = std::move(m_callback);
|
PromptCallback callback = std::move(m_callback);
|
||||||
String result = std::move(m_result);
|
String result = std::move(m_result);
|
||||||
m_client.reset_normal_mode();
|
m_client.reset_normal_mode();
|
||||||
|
// call callback after reset_normal_mode so that callback
|
||||||
|
// may change the mode
|
||||||
callback(result, context);
|
callback(result, context);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -217,40 +220,36 @@ public:
|
||||||
String reg = RegisterManager::instance()[k.key].values(context)[0];
|
String reg = RegisterManager::instance()[k.key].values(context)[0];
|
||||||
m_client.menu_hide();
|
m_client.menu_hide();
|
||||||
m_current_completion = -1;
|
m_current_completion = -1;
|
||||||
m_result = m_result.substr(0, m_cursor_pos) + reg + m_result.substr(m_cursor_pos, String::npos);
|
m_result = m_result.substr(0, m_cursor_pos) + reg
|
||||||
|
+ m_result.substr(m_cursor_pos, String::npos);
|
||||||
m_cursor_pos += reg.length();
|
m_cursor_pos += reg.length();
|
||||||
}
|
}
|
||||||
else if (key == Key(Key::Modifiers::Control, 'i')) // tab
|
else if (key == Key(Key::Modifiers::Control, 'i') or // tab
|
||||||
|
key == Key::BackTab)
|
||||||
{
|
{
|
||||||
|
const bool reverse = (key == Key::BackTab);
|
||||||
|
const CandidateList& candidates = m_completions.candidates;
|
||||||
if (m_current_completion == -1)
|
if (m_current_completion == -1)
|
||||||
{
|
{
|
||||||
m_completions = m_completer(context, m_result, m_cursor_pos);
|
m_completions = m_completer(context, m_result, m_cursor_pos);
|
||||||
if (m_completions.candidates.empty())
|
if (candidates.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_client.menu_hide();
|
m_client.menu_hide();
|
||||||
m_client.menu_show(m_completions.candidates);
|
m_client.menu_show(candidates);
|
||||||
m_text_before_completion = m_result.substr(m_completions.start,
|
m_completion_prefix = m_result.substr(m_completions.start,
|
||||||
m_completions.end - m_completions.start);
|
m_completions.end - m_completions.start);
|
||||||
|
m_completion_count = contains(candidates, m_completion_prefix) ?
|
||||||
|
(int)candidates.size() : (int)candidates.size() + 1;
|
||||||
}
|
}
|
||||||
++m_current_completion;
|
m_current_completion += reverse ? -1 : 1;
|
||||||
|
if (m_current_completion >= m_completion_count)
|
||||||
|
m_current_completion = 0;
|
||||||
|
else if (m_current_completion < 0)
|
||||||
|
m_current_completion = m_completion_count-1;
|
||||||
|
|
||||||
String completion;
|
String completion = (m_current_completion == candidates.size()) ?
|
||||||
if (m_current_completion >= m_completions.candidates.size())
|
m_completion_prefix : candidates[m_current_completion];
|
||||||
{
|
|
||||||
if (m_current_completion == m_completions.candidates.size() and
|
|
||||||
std::find(m_completions.candidates.begin(), m_completions.candidates.end(), m_text_before_completion) == m_completions.candidates.end())
|
|
||||||
{
|
|
||||||
completion = m_text_before_completion;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_current_completion = 0;
|
|
||||||
completion = m_completions.candidates[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
completion = m_completions.candidates[m_current_completion];
|
|
||||||
|
|
||||||
m_client.menu_select(m_current_completion);
|
m_client.menu_select(m_current_completion);
|
||||||
m_result = m_result.substr(0, m_completions.start) + completion;
|
m_result = m_result.substr(0, m_completions.start) + completion;
|
||||||
|
@ -270,10 +269,11 @@ private:
|
||||||
PromptCallback m_callback;
|
PromptCallback m_callback;
|
||||||
Completer m_completer;
|
Completer m_completer;
|
||||||
const String m_prompt;
|
const String m_prompt;
|
||||||
CharCount m_cursor_pos;
|
CharCount m_cursor_pos = 0;
|
||||||
Completions m_completions;
|
Completions m_completions;
|
||||||
|
int m_completion_count = 0;
|
||||||
int m_current_completion = -1;
|
int m_current_completion = -1;
|
||||||
String m_text_before_completion;
|
String m_completion_prefix;
|
||||||
String m_result;
|
String m_result;
|
||||||
String m_saved_result;
|
String m_saved_result;
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ struct Key
|
||||||
Right,
|
Right,
|
||||||
PageUp,
|
PageUp,
|
||||||
PageDown,
|
PageDown,
|
||||||
|
BackTab,
|
||||||
};
|
};
|
||||||
|
|
||||||
Modifiers modifiers;
|
Modifiers modifiers;
|
||||||
|
|
|
@ -189,6 +189,7 @@ Key NCursesClient::get_key()
|
||||||
case KEY_RIGHT: return Key::Right;
|
case KEY_RIGHT: return Key::Right;
|
||||||
case KEY_PPAGE: return Key::PageUp;
|
case KEY_PPAGE: return Key::PageUp;
|
||||||
case KEY_NPAGE: return Key::PageDown;
|
case KEY_NPAGE: return Key::PageDown;
|
||||||
|
case KEY_BTAB: return Key::BackTab;
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user