This appears to work for me, opening the email in gvim with the cursor properly located. Along with a review, it likely needs a 'quickfix' with regard to the htmlengine.h include. I'm not familiar enough with the build environment to know if there is a more proper/correct way of getting it included.
There is also a single change to mono-plugin.c that I had to make in order to get mono-plugin.c to compile. Signed-off-by: Reid Thompson <jreidthomp...@nc.rr.com> --- plugins/external-editor/external-editor.c | 66 ++++++++++++++++++++++++++++- plugins/mono/mono-plugin.c | 2 +- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/plugins/external-editor/external-editor.c b/plugins/external-editor/external-editor.c index a7f06b6..0ed4d8f 100644 --- a/plugins/external-editor/external-editor.c +++ b/plugins/external-editor/external-editor.c @@ -34,6 +34,8 @@ #include <e-msg-composer.h> #include <camel/camel-mime-filter-tohtml.h> +#include "/media/disk-1/home/evo-src/git/gtkhtml/gtkhtml/htmlengine.h" + #include <glib/gi18n-lib.h> #include <glib-object.h> #include <glib.h> @@ -62,6 +64,7 @@ static void ee_editor_immediate_launch_changed (GtkWidget *checkbox); static void async_external_editor (EMsgComposer *composer); static gboolean editor_running (void); static gboolean key_press_cb(GtkWidget * widget, GdkEventKey * event, EMsgComposer *composer); +static gint numlines(gchar *text, gint pos); /* used to track when the external editor is active */ static GThread *editor_thread; @@ -214,8 +217,19 @@ async_external_editor (EMsgComposer *composer) GConfClient *gconf; gchar *editor_cmd_line = NULL; gint fd; + GtkHTML *html; + GtkhtmlEditor *editor; + gint cursor_position = 0; + gint cursor_offset = 0; + gint lineno = 0; + gchar *contents; + gchar *linenostr; + gchar *cursor_offsetstr; + gsize length = 0; - fd = g_file_open_tmp (NULL, &filename, NULL); + + /* prefix temp files with evo so .*vimrc can be setup to recognize them */ + fd = g_file_open_tmp ("evoXXXXXX", &filename, NULL); if (fd > 0) { close (fd); /* Push the text (if there is one) from the composer to the file */ @@ -242,6 +256,35 @@ async_external_editor (EMsgComposer *composer) } g_object_unref (gconf); + /* if gvim is editor, configure editor_cmd_line to pass cursor location */ + if (g_strrstr(editor_cmd_line, "vim") != NULL) + { + editor = GTKHTML_EDITOR (composer); + html = gtkhtml_editor_get_html (editor); + cursor_position = html->engine->cursor->position; + cursor_offset = html->engine->cursor->offset; + + /* increment 1 so that entering vim insert mode places you in the same + * entry position you were at in the html */ + ++cursor_offset; + + /* calculate the line number that the cursor is in */ + contents = gtkhtml_editor_get_text_plain (editor, &length); + lineno = numlines(contents, cursor_position); + g_free(contents); + + /* setup the editor_cmd_line */ + editor_cmd_line = g_strconcat(editor_cmd_line, " \"+call cursor(", NULL); + linenostr = g_strdup_printf("%d", lineno); + editor_cmd_line = g_strconcat(editor_cmd_line, linenostr, NULL); + editor_cmd_line = g_strconcat(editor_cmd_line, ",", NULL); + cursor_offsetstr = g_strdup_printf("%d", cursor_offset); + editor_cmd_line = g_strconcat(editor_cmd_line, cursor_offsetstr, NULL); + editor_cmd_line = g_strconcat(editor_cmd_line, ")\"", NULL); + g_free(linenostr); + g_free(cursor_offsetstr); + } + editor_cmd_line = g_strconcat(editor_cmd_line, " ", filename, NULL); if (!g_spawn_command_line_sync(editor_cmd_line, NULL, NULL, &status, NULL)) @@ -393,3 +436,24 @@ e_plugin_ui_init (GtkUIManager *manager, EMsgComposer *composer) return TRUE; } + +static gint +numlines(gchar *text, gint pos) +{ + gint ctr = 0; + gint lineno = 0; + + for (ctr = 0; ctr <= pos; ++ctr) + { + if (text[ctr] == '\n') + { + ++lineno; + } + } + if (lineno > 0) + { + ++lineno; + } + + return(lineno); +} diff --git a/plugins/mono/mono-plugin.c b/plugins/mono/mono-plugin.c index 76b1e42..86bbb43 100644 --- a/plugins/mono/mono-plugin.c +++ b/plugins/mono/mono-plugin.c @@ -159,7 +159,7 @@ epm_invoke(EPlugin *ep, const gchar *name, gpointer data) if (res) { gpointer *p = mono_object_unbox(res); - d(printf("mono method returned '%p' %ld\n", *p, (long gint)*p)); + d(printf("mono method returned '%p' %ld\n", *p, (long int)*p)); return *p; } else return NULL; -- 1.6.0.6 _______________________________________________ Evolution-list mailing list Evolution-list@gnome.org http://mail.gnome.org/mailman/listinfo/evolution-list