aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--main.cpp2
-rw-r--r--qbuffers.cpp75
-rw-r--r--qbuffers.h16
3 files changed, 89 insertions, 4 deletions
diff --git a/main.cpp b/main.cpp
index 18018ca..11358ea 100644
--- a/main.cpp
+++ b/main.cpp
@@ -175,7 +175,7 @@ main(int argc, char **argv)
local_qregs.initialize();
QRegisters::locals = &local_qregs;
- ring.edit(NULL);
+ ring.edit((const gchar *)NULL);
/* add remaining arguments to unnamed buffer */
for (int i = 1; i < argc; i++) {
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;
diff --git a/qbuffers.h b/qbuffers.h
index 2954388..0fd588d 100644
--- a/qbuffers.h
+++ b/qbuffers.h
@@ -133,6 +133,15 @@ public:
get_document();
}
+ gint64
+ set_integer(gint64 v)
+ {
+ return v;
+ }
+ void undo_set_integer(void) {}
+
+ gint64 get_integer(void);
+
void set_string(const gchar *str) {}
void undo_set_string(void) {}
void append_string(const gchar *str) {}
@@ -385,10 +394,12 @@ public:
}
Buffer *find(const gchar *filename);
+ Buffer *find(gint64 id);
void dirtify(void);
bool is_any_dirty(void);
+ bool edit(gint64 id);
void edit(const gchar *filename);
inline void
undo_edit(void)
@@ -414,7 +425,10 @@ public:
class StateEditFile : public StateExpectString {
private:
- void do_edit(const gchar *filename);
+ bool allowFilename;
+
+ void do_edit(const gchar *filename) throw (Error);
+ void do_edit(gint64 id) throw (Error);
void initial(void) throw (Error);
State *done(const gchar *str) throw (Error);