summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-05-28 22:51:12 +0000
committerMaxime Coste <frrrwww@gmail.com>2012-05-28 22:51:12 +0000
commitd96427b83186835107bc4331f91a9f8924d8bb3f (patch)
tree4e1db9c94992ba07055fc49fa8dc6bbc99d2dd7c
parent393b9b24e2100eb0382e9eeb16f12e11ab53478a (diff)
Add a delbuf (db) command which delete an existing buffer
-rw-r--r--src/buffer_manager.hh1
-rw-r--r--src/commands.cc41
2 files changed, 39 insertions, 3 deletions
diff --git a/src/buffer_manager.hh b/src/buffer_manager.hh
index 1ee9f8fb..e893d419 100644
--- a/src/buffer_manager.hh
+++ b/src/buffer_manager.hh
@@ -31,6 +31,7 @@ public:
iterator begin() const { return iterator(m_buffers.begin()); }
iterator end() const { return iterator(m_buffers.end()); }
+ size_t count() const { return m_buffers.size(); }
Buffer* get_buffer(const String& name);
diff --git a/src/commands.cc b/src/commands.cc
index a5d84c0f..7e59b4c7 100644
--- a/src/commands.cc
+++ b/src/commands.cc
@@ -295,9 +295,38 @@ void show_buffer(const CommandParameters& params, const Context& context)
Buffer* buffer = BufferManager::instance().get_buffer(params[0]);
if (not buffer)
- NCurses::print_status("buffer " + params[0] + " does not exists");
- else
- main_context = Context(*buffer->get_or_create_window());
+ throw runtime_error("buffer " + params[0] + " does not exists");
+
+ main_context = Context(*buffer->get_or_create_window());
+}
+
+void delete_buffer(const CommandParameters& params, const Context& context)
+{
+ if (params.size() != 1)
+ throw wrong_argument_count();
+
+ BufferManager& manager = BufferManager::instance();
+
+ Buffer* buffer = manager.get_buffer(params[0]);
+ if (not buffer)
+ throw runtime_error("buffer " + params[0] + " does not exists");
+ if (buffer->type()!= Buffer::Type::Scratch and buffer->is_modified())
+ throw runtime_error("buffer " + params[0] + " is modified");
+
+ if (&main_context.buffer() == buffer)
+ {
+ if (manager.count() == 1)
+ throw runtime_error("buffer " + params[0] + " is the last one");
+ for (Buffer& buf : manager)
+ {
+ if (&buf != buffer)
+ {
+ main_context = Context(*buf.get_or_create_window());
+ break;
+ }
+ }
+ }
+ delete buffer;
}
void add_highlighter(const CommandParameters& params, const Context& context)
@@ -685,6 +714,12 @@ void register_commands()
[](const String& prefix, size_t cursor_pos)
{ return BufferManager::instance().complete_buffername(prefix, cursor_pos); }
}));
+ cm.register_commands({ "db", "delbuf" }, delete_buffer,
+ CommandManager::None,
+ PerArgumentCommandCompleter({
+ [](const String& prefix, size_t cursor_pos)
+ { return BufferManager::instance().complete_buffername(prefix, cursor_pos); }
+ }));
cm.register_commands({ "ah", "addhl" }, add_highlighter,
CommandManager::None,
[](const CommandParameters& params, size_t token_to_complete, size_t pos_in_token)