aboutsummaryrefslogtreecommitdiffhomepage
path: root/qbuffers.cpp
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-12-02 16:38:19 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-12-02 16:38:19 +0100
commit1d44c8f0f75acb979a98d94e4dae6ff44d1accbf (patch)
treea9c3af46aa280c306c10722e211e1898850751e7 /qbuffers.cpp
parent036cc00ecdb8908f3ac54e8cc9fef006bbd8095e (diff)
downloadsciteco-1d44c8f0f75acb979a98d94e4dae6ff44d1accbf.tar.gz
support Q* (return current buffer's Id) and edit-by-id using <n>EB$
Diffstat (limited to 'qbuffers.cpp')
-rw-r--r--qbuffers.cpp75
1 files changed, 73 insertions, 2 deletions
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();
@@ -721,10 +768,23 @@ StateEditFile::do_edit(const gchar *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 <EB> "
+ "string argument must be empty");
+
+ return &States::start;
+ }
+
if (is_glob_pattern(str)) {
gchar *dirname;
GDir *dir;