Window: support adding and removing filters with :addfilter :rmfilter
This commit is contained in:
parent
1f3f5ea1ba
commit
3af1b89034
28
src/main.cc
28
src/main.cc
|
@ -427,6 +427,32 @@ void show_buffer(const CommandParameters& params)
|
|||
current_window = buffer->get_or_create_window();
|
||||
}
|
||||
|
||||
void add_filter(const CommandParameters& params)
|
||||
{
|
||||
if (params.size() < 1)
|
||||
throw wrong_argument_count();
|
||||
|
||||
try
|
||||
{
|
||||
FilterRegistry& registry = FilterRegistry::instance();
|
||||
FilterParameters filter_params(params.begin()+1, params.end());
|
||||
FilterAndId filter_and_id = registry.get_filter(params[0], filter_params);
|
||||
current_window->add_filter(std::move(filter_and_id));
|
||||
}
|
||||
catch (runtime_error& err)
|
||||
{
|
||||
print_status("error: " + err.description());
|
||||
}
|
||||
}
|
||||
|
||||
void rm_filter(const CommandParameters& params)
|
||||
{
|
||||
if (params.size() != 1)
|
||||
throw wrong_argument_count();
|
||||
|
||||
current_window->remove_filter(params[0]);
|
||||
}
|
||||
|
||||
void do_command()
|
||||
{
|
||||
try
|
||||
|
@ -585,6 +611,8 @@ int main(int argc, char* argv[])
|
|||
PerArgumentCommandCompleter{ complete_filename });
|
||||
command_manager.register_command(std::vector<std::string>{ "b", "buffer" }, show_buffer,
|
||||
PerArgumentCommandCompleter { complete_buffername });
|
||||
command_manager.register_command(std::vector<std::string>{ "af", "addfilter" }, add_filter);
|
||||
command_manager.register_command(std::vector<std::string>{ "rf", "rmfilter" }, rm_filter);
|
||||
|
||||
register_filters();
|
||||
|
||||
|
|
|
@ -114,10 +114,8 @@ Window::Window(Buffer& buffer)
|
|||
m_current_inserter(nullptr)
|
||||
{
|
||||
m_selections.push_back(Selection(buffer.begin(), buffer.begin()));
|
||||
m_filters.push_back(colorize_cplusplus);
|
||||
m_filters.push_back(expand_tabulations);
|
||||
m_filters.push_back(HighlightSelections(*this));
|
||||
m_filters.push_back(show_line_numbers);
|
||||
m_filters.push_back(FilterAndId("show_tabs", expand_tabulations));
|
||||
m_filters.push_back(FilterAndId("show_selection", HighlightSelections(*this)));
|
||||
}
|
||||
|
||||
void Window::check_invariant() const
|
||||
|
@ -329,7 +327,7 @@ void Window::update_display_buffer()
|
|||
|
||||
for (auto& filter : m_filters)
|
||||
{
|
||||
filter(m_display_buffer);
|
||||
filter.second(m_display_buffer);
|
||||
m_display_buffer.check_invariant();
|
||||
}
|
||||
}
|
||||
|
@ -377,6 +375,28 @@ std::string Window::status_line() const
|
|||
return oss.str();
|
||||
}
|
||||
|
||||
void Window::add_filter(FilterAndId&& filter)
|
||||
{
|
||||
for (auto it = m_filters.begin(); it != m_filters.end(); ++it)
|
||||
{
|
||||
if (it->first == filter.first)
|
||||
throw filter_id_not_unique(filter.first);
|
||||
}
|
||||
m_filters.push_back(filter);
|
||||
}
|
||||
|
||||
void Window::remove_filter(const std::string& id)
|
||||
{
|
||||
for (auto it = m_filters.begin(); it != m_filters.end(); ++it)
|
||||
{
|
||||
if (it->first == id)
|
||||
{
|
||||
m_filters.erase(it);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IncrementalInserter::IncrementalInserter(Window& window, Mode mode)
|
||||
: m_window(window)
|
||||
{
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include "buffer.hh"
|
||||
#include "dynamic_buffer_iterator.hh"
|
||||
#include "display_buffer.hh"
|
||||
#include "filter.hh"
|
||||
|
||||
namespace Kakoune
|
||||
{
|
||||
|
@ -69,6 +70,15 @@ public:
|
|||
|
||||
std::string status_line() const;
|
||||
|
||||
struct filter_id_not_unique : public runtime_error
|
||||
{
|
||||
filter_id_not_unique(const std::string& id)
|
||||
: runtime_error("filter id not unique: " + id) {}
|
||||
};
|
||||
|
||||
void add_filter(FilterAndId&& filter);
|
||||
void remove_filter(const std::string& id);
|
||||
|
||||
private:
|
||||
friend class Buffer;
|
||||
|
||||
|
@ -93,7 +103,7 @@ private:
|
|||
SelectionList m_selections;
|
||||
DisplayBuffer m_display_buffer;
|
||||
|
||||
typedef std::vector<std::function<void (DisplayBuffer&)>> FilterList;
|
||||
typedef std::vector<FilterAndId> FilterList;
|
||||
FilterList m_filters;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user