Fix bug in insert completer deregistering

The context options might change, as the context might have a different
window/buffer from the one at creation. So we need to store the correct
option manager rather than ask the context for it.
This commit is contained in:
Maxime Coste 2014-11-04 23:51:41 +00:00
parent c8ea2e78f9
commit 4c3056a05e
2 changed files with 10 additions and 9 deletions

View File

@ -217,14 +217,14 @@ InsertCompletion complete_line(const Buffer& buffer, ByteCoord cursor_pos)
}
InsertCompleter::InsertCompleter(const Context& context)
: m_context(context)
: m_context(context), m_options(context.options())
{
context.options().register_watcher(*this);
m_options.register_watcher(*this);
}
InsertCompleter::~InsertCompleter()
{
m_context.options().unregister_watcher(*this);
m_options.unregister_watcher(*this);
}
void InsertCompleter::select(int offset)
@ -321,19 +321,19 @@ bool InsertCompleter::setup_ifn()
using namespace std::placeholders;
if (not m_completions.is_valid())
{
auto& completers = m_context.options()["completers"].get<InsertCompleterDescList>();
auto& completers = m_options["completers"].get<InsertCompleterDescList>();
for (auto& completer : completers)
{
if (completer.mode == InsertCompleterDesc::Filename and
try_complete([this](const Buffer& buffer, ByteCoord cursor_pos) {
return complete_filename<true>(buffer, cursor_pos,
m_context.options());
m_options);
}))
return true;
if (completer.mode == InsertCompleterDesc::Option and
try_complete([&,this](const Buffer& buffer, ByteCoord cursor_pos) {
return complete_option(buffer, cursor_pos,
m_context.options(), *completer.param);
m_options, *completer.param);
}))
return true;
if (completer.mode == InsertCompleterDesc::Word and
@ -358,7 +358,7 @@ void InsertCompleter::menu_show()
return;
CharCoord menu_pos = m_context.window().display_position(m_completions.begin);
const CharCount tabstop = m_context.options()["tabstop"].get<int>();
const CharCount tabstop = m_options["tabstop"].get<int>();
const CharCount column = get_column(m_context.buffer(), tabstop,
m_completions.begin);
std::vector<String> menu_entries;
@ -374,7 +374,7 @@ void InsertCompleter::menu_show()
void InsertCompleter::on_option_changed(const Option& opt)
{
auto& completers = m_context.options()["completers"].get<InsertCompleterDescList>();
auto& completers = m_options["completers"].get<InsertCompleterDescList>();
std::vector<StringView> option_names;
for (auto& completer : completers)
{
@ -416,7 +416,7 @@ bool InsertCompleter::try_complete(CompleteFunc complete_func)
void InsertCompleter::explicit_file_complete()
{
try_complete([this](const Buffer& buffer, ByteCoord cursor_pos) {
return complete_filename<false>(buffer, cursor_pos, m_context.options());
return complete_filename<false>(buffer, cursor_pos, m_options);
});
}

View File

@ -75,6 +75,7 @@ private:
void menu_show();
const Context& m_context;
OptionManager& m_options;
InsertCompletion m_completions;
CandidateList m_matching_candidates;
int m_current_candidate = -1;