From 1d44c8f0f75acb979a98d94e4dae6ff44d1accbf Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Sun, 2 Dec 2012 16:38:19 +0100 Subject: support Q* (return current buffer's Id) and edit-by-id using EB$ --- qbuffers.cpp | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 2 deletions(-) (limited to 'qbuffers.cpp') diff --git a/qbuffers.cpp b/qbuffers.cpp index ce22b6f..1ee9139 100644 --- a/qbuffers.cpp +++ b/qbuffers.cpp @@ -224,6 +224,22 @@ QRegister::load(const gchar *filename) return true; } +gint64 +QRegisterBufferInfo::get_integer(void) +{ + gint64 id = 1; + + if (!ring.current) + return 0; + + for (Buffer *buffer = ring.first(); + buffer != ring.current; + buffer = buffer->next()) + id++; + + return id; +} + gchar * QRegisterBufferInfo::get_string(void) { @@ -423,6 +439,18 @@ Ring::find(const gchar *filename) return cur; } +Buffer * +Ring::find(gint64 id) +{ + Buffer *cur; + + LIST_FOREACH(cur, &head, buffers) + if (!--id) + break; + + return cur; +} + void Ring::dirtify(void) { @@ -447,6 +475,25 @@ Ring::is_any_dirty(void) return false; } +bool +Ring::edit(gint64 id) +{ + Buffer *buffer = find(id); + + if (!buffer) + return false; + + current_save_dot(); + + QRegisters::current = NULL; + current = buffer; + buffer->edit(); + + QRegisters::hook(QRegisters::HOOK_EDIT); + + return true; +} + void Ring::edit(const gchar *filename) { @@ -637,7 +684,7 @@ Ring::close(void) QRegisters::hook(QRegisters::HOOK_EDIT); } else { - edit(NULL); + edit((const gchar *)NULL); undo_close(); } } @@ -711,7 +758,7 @@ get_absolute_path(const gchar *path) */ void -StateEditFile::do_edit(const gchar *filename) +StateEditFile::do_edit(const gchar *filename) throw (Error) { if (ring.current) ring.undo_edit(); @@ -720,11 +767,24 @@ StateEditFile::do_edit(const gchar *filename) ring.edit(filename); } +void +StateEditFile::do_edit(gint64 id) throw (Error) +{ + if (ring.current) + ring.undo_edit(); + else /* QRegisters::current != NULL */ + QRegisters::undo_edit(); + if (!ring.edit(id)) + throw Error("Invalid buffer id %" G_GINT64_FORMAT, id); +} + void StateEditFile::initial(void) throw (Error) { gint64 id = expressions.pop_num_calc(1, -1); + allowFilename = true; + if (id == 0) { for (Buffer *cur = ring.first(); cur; cur = cur->next()) interface.popup_add(Interface::POPUP_FILE, @@ -732,6 +792,9 @@ StateEditFile::initial(void) throw (Error) cur == ring.current); interface.popup_show(); + } else if (id > 0) { + allowFilename = false; + do_edit(id); } } @@ -740,6 +803,14 @@ StateEditFile::done(const gchar *str) throw (Error) { BEGIN_EXEC(&States::start); + if (!allowFilename) { + if (*str) + throw Error("If a buffer is selected by id, the " + "string argument must be empty"); + + return &States::start; + } + if (is_glob_pattern(str)) { gchar *dirname; GDir *dir; -- cgit v1.2.3