diff --git a/doc/man-medit.t2t.in b/doc/man-medit.t2t.in index 7abec5cb..15836d98 100644 --- a/doc/man-medit.t2t.in +++ b/doc/man-medit.t2t.in @@ -65,12 +65,6 @@ show debug output in a log window. This option is only useful on Windows. enable debug output for //DOMAINS// (if **medit** was compiled with --enable-debug option). -: **--exec** //STRING// -execute python code in //STRING// in an existing instance. - -: **--exec-file** //FILE// -execute python file //FILE// in an existing instance. - : **--geometry** //WIDTHxHEIGHT// : **--geometry** //WIDTHxHEIGHT+X+Y// default window size and position. diff --git a/doc/medit.1 b/doc/medit.1 deleted file mode 100644 index 34c0c315..00000000 --- a/doc/medit.1 +++ /dev/null @@ -1,116 +0,0 @@ -.TH "MEDIT" 1 "September 2010" "" - -.SH NAME -.P -medit \- text editor - -.SH SYNOPSIS -.P -\fBmedit\fR [\fIOPTION\fR]... [\fIFILES\fR] - -.SH DESCRIPTION -.P -\fBmedit\fR is a text editor. - -.SH OPTIONS -.TP -\fB\-n\fR, \fB\-\-new\-app\fR -run new instance of \fBmedit\fR. By default \fBmedit\fR opens \fIFILES\fR -(or creates a new document if none are given) in an existing instance -of application - -.TP -\fB\-s\fR, \fB\-\-use\-session\fR[=\fIyes|no\fR] -load and save session. By default \fBmedit\fR does it when \fB\-n\fR is not used. -If this option is not given on command line then medit uses the corresponding -preferences setting. - -.TP -\fB\-\-pid\fR \fIPID\fR -use existing instance with process id \fIPID\fR. - -.TP -\fB\-\-app\-name\fR \fINAME\fR -use instance name \fINAME\fR. If an instance with this name is already running, -then it will send files given on the command line to that instance and exit. - -.TP -\fB\-e\fR, \fB\-\-encoding\fR \fIENCODING\fR -use provided character encoding to open the file - -.TP -\fB\-l\fR, \fB\-\-line\fR \fILINE\fR -open file and position cursor on line \fILINE\fR. Alternatively -line number may be specified with filename, e.g. -medit foo.txt:12 - -.TP -\fB\-r\fR, \fB\-\-reload\fR -automatically reload opened file if it was modified on disk by another program. - -.TP -\fB\-w\fR, \fB\-\-new\-window\fR -open file in a new window. - -.TP -\fB\-t\fR, \fB\-\-new\-tab\fR -open file in a new tab. - -.TP -\fB\-\-log\-file\fR \fIFILE\fR -write debug output into \fIFILE\fR. This option is only useful on Windows. - -.TP -\fB\-\-log\-window\fR -show debug output in a log window. This option is only useful on Windows. - -.TP -\fB\-\-debug\fR \fIDOMAINS\fR -enable debug output for \fIDOMAINS\fR (if \fBmedit\fR was compiled with -\-\-enable\-debug option). - -.TP -\fB\-\-exec\fR \fISTRING\fR -execute python code in \fISTRING\fR in an existing instance. - -.TP -\fB\-\-exec\-file\fR \fIFILE\fR -execute python file \fIFILE\fR in an existing instance. - -.TP -\fB\-\-geometry\fR \fIWIDTHxHEIGHT\fR -.TP -\fB\-\-geometry\fR \fIWIDTHxHEIGHT+X+Y\fR -default window size and position. - -.TP -\fB\-h\fR, \fB\-\-help\fR -show summary of options. - -.TP -\fB\-v\fR, \fB\-\-version\fR -show program version. - -.TP -\fIFILES\fR -list of files to open. Filenames may include line numbers after colon, -e.g. /tmp/file.txt:200. Trailing colon is ignored. - -.SH ENVIRONMENT VARIABLES -.TP -MEDIT_PID -if set, it is used as \-\-pid argument. When medit spawns a process (e.g. a DVI viewer) it sets -MEDIT_PID to its own process id, so the child process may in turn simply use 'medit filename' -to open a file (e.g. for inverse DVI search). - -.SH CONTACT -.P -http://mooedit.sourceforge.net/contact.html - -.SH AUTHOR -.P -Written and maintained by Yevgen Muntyan - - -.\" man code generated by txt2tags 2.5 (http://txt2tags.sf.net) - diff --git a/moo/medit-app/data/testmedit.lua b/moo/medit-app/data/testmedit.lua index 9c50bba2..9558593b 100644 --- a/moo/medit-app/data/testmedit.lua +++ b/moo/medit-app/data/testmedit.lua @@ -7,6 +7,16 @@ require("_moo_utils") app = medit.get_app_obj() editor = app.editor() +local __docs_to_cleanup = {} +local function add_doc_to_cleanup(doc) + table.insert(__docs_to_cleanup, doc) +end +local function cleanup() + for i, doc in pairs(__docs_to_cleanup) do + doc.set_modified(false) + end +end + local function test_active_window() w1 = editor.active_window() tassert(w1 ~= nil, 'editor.active_window() ~= nil') @@ -27,6 +37,34 @@ local function test_active_window() tassert(w2 == editor.active_window(), 'w2 == editor.active_window()') end -test_active_window() +local function test_selection() + doc = editor.new_document() + add_doc_to_cleanup(doc) + tassert(doc.text() == '') + tassert(doc.start_pos() == 1) + tassert(doc.end_pos() == 1) + tassert(doc.text(1, 1) == '') + doc.insert_text('a') + doc.insert_text(1, 'b') + tassert(doc.text() == 'ba') + tassert(doc.start_pos() == 1) + tassert(doc.end_pos() == 3) + tassert(doc.text(1, 2) == 'b') + text = [[abcdefg +abcdefghij +1234567890 +]] + doc.replace_text(doc.start_pos(), doc.end_pos(), text) + tassert(doc.start_pos() == 1) + tassert(doc.end_pos() == #text + 1) + doc.select_text(2, 3) + tassert(doc.selected_text() == 'b') + doc.select_text({3, 4}) + tassert(doc.selected_text() == 'c') + doc.select_lines(1) + tassert(doc.selected_text() == 'abcdefg\n') +end --- print(#editor.views()) +-- test_active_window() +test_selection() +cleanup() diff --git a/moo/medit-app/main.c b/moo/medit-app/main.c index 18c8c294..78dfa607 100644 --- a/moo/medit-app/main.c +++ b/moo/medit-app/main.c @@ -58,7 +58,10 @@ static struct MeditOpts { const char *debug; gboolean ut; gboolean ut_list; + char *ut_dir; char **ut_tests; + char **run_script; + char **send_script; } medit_opts = { -1, -1 }; #include "parse.h" @@ -148,18 +151,16 @@ static GOptionEntry medit_options[] = { /* "ENCODING" part in --encoding=ENCODING */ N_("ENCODING") }, { "reload", 'r', 0, G_OPTION_ARG_NONE, &medit_opts.reload, /* help message for command line option --reload */ N_("Automatically reload file if it was modified on disk"), NULL }, + { "run-script", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING_ARRAY, (gpointer) &medit_opts.run_script, + "Run SCRIPT", "SCRIPT" }, + { "send-script", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING_ARRAY, (gpointer) &medit_opts.send_script, + "Send SCRIPT to existing instance", "SCRIPT" }, { "log-window", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &medit_opts.log_window, "Show debug output", NULL }, { "log-file", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_FILENAME, (gpointer) &medit_opts.log_file, "Write debug output to FILE", "FILE" }, { "debug", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, (gpointer) &medit_opts.debug, "Run in debug mode", NULL }, - { "exec", 0, 0, G_OPTION_ARG_STRING, (gpointer) &medit_opts.exec_string, - /* help message for command line option --exec CODE */ N_("Execute python code in an existing instance"), - /* "CODE" part in --exec CODE */ N_("CODE") }, - { "exec-file", 0, 0, G_OPTION_ARG_FILENAME, (gpointer) &medit_opts.exec_file, - /* help message for command line option --exec-file FILE */ N_("Execute python file in an existing instance"), - /* "FILE" part in --exec-file FILE */ N_("FILE") }, { "geometry", 0, 0, G_OPTION_ARG_STRING, (gpointer) &medit_opts.geometry, /* help message for command line option --geometry=WIDTHxHEIGHT[+X+Y] */ N_("Default window size and position"), /* "WIDTHxHEIGHT[+X+Y]" part in --geometry=WIDTHxHEIGHT[+X+Y] */ N_("WIDTHxHEIGHT[+X+Y]") }, @@ -167,6 +168,8 @@ static GOptionEntry medit_options[] = { /* help message for command line option --version */ N_("Show version information and exit"), NULL }, { "ut", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &medit_opts.ut, "Run unit tests", NULL }, + { "ut-dir", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &medit_opts.ut_dir, + "Data dir for unit tests", NULL }, { "ut-list", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &medit_opts.ut_list, "List unit tests", NULL }, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &medit_opts.files, @@ -203,14 +206,6 @@ post_parse_func (void) exit (EXIT_FAILURE); } - if (medit_opts.exec_string && medit_opts.exec_file) - { - /* error message for wrong commmand line */ - g_printerr (_("%s and %s options may not be used simultaneously\n"), - "--exec", "--exec-file"); - exit (EXIT_FAILURE); - } - if (medit_opts.debug) g_setenv ("MOO_DEBUG", medit_opts.debug, FALSE); @@ -532,11 +527,20 @@ static gboolean unit_test_func (void) { MooTestOptions opts = 0; - unit_tests_main (opts, medit_opts.ut_tests); + unit_tests_main (opts, medit_opts.ut_tests, medit_opts.ut_dir); moo_app_quit (moo_app_get_instance ()); return FALSE; } +static gboolean +run_script_func (void) +{ + char **p; + for (p = medit_opts.run_script; p && *p; ++p) + moo_app_run_script (moo_app_get_instance(), *p); + return FALSE; +} + static int medit_main (int argc, char *argv[]) { @@ -598,12 +602,15 @@ medit_main (int argc, char *argv[]) if (name && !name[0]) name = NULL; - if (medit_opts.exec_string || medit_opts.exec_file) + if (medit_opts.send_script) { - GString *msg; - msg = g_string_new (medit_opts.exec_string ? "p" : "P"); - g_string_append (msg, medit_opts.exec_string ? medit_opts.exec_string : medit_opts.exec_file); - moo_app_send_msg (name, msg->str, msg->len + 1); + char **p; + for (p = medit_opts.send_script; *p; ++p) + { + GString *msg = g_string_new ("e"); + g_string_append (msg, *p); + moo_app_send_msg (name, msg->str, msg->len + 1); + } notify_startup_complete (); exit (0); } @@ -682,7 +689,9 @@ medit_main (int argc, char *argv[]) g_option_context_free (ctx); if (medit_opts.ut) - g_timeout_add (10, (GSourceFunc) unit_test_func, NULL); + _moo_timeout_add (10, (GSourceFunc) unit_test_func, NULL); + if (medit_opts.run_script) + _moo_timeout_add (10, (GSourceFunc) run_script_func, NULL); retval = moo_app_run (app); gdk_threads_leave (); diff --git a/moo/medit-app/run-tests.h b/moo/medit-app/run-tests.h index 99e077eb..01acddc8 100644 --- a/moo/medit-app/run-tests.h +++ b/moo/medit-app/run-tests.h @@ -25,11 +25,12 @@ add_tests (void) } static int -unit_tests_main (MooTestOptions opts, char **tests) +unit_tests_main (MooTestOptions opts, char **tests, const char *data_dir_arg) { - const char *data_dir; + const char *data_dir = MOO_UNIT_TEST_DATA_DIR; - data_dir = MOO_UNIT_TEST_DATA_DIR; + if (data_dir_arg) + data_dir = data_dir_arg; add_tests (); moo_test_run_tests (tests, data_dir, opts); @@ -51,5 +52,5 @@ unit_tests_main (MooTestOptions opts, char **tests) static void list_unit_tests (void) { - unit_tests_main (MOO_TEST_LIST_ONLY, NULL); + unit_tests_main (MOO_TEST_LIST_ONLY, NULL, NULL); } diff --git a/moo/mooapp/mooapp-private.h b/moo/mooapp/mooapp-private.h index b4c8d0e3..da755ee6 100644 --- a/moo/mooapp/mooapp-private.h +++ b/moo/mooapp/mooapp-private.h @@ -22,27 +22,18 @@ G_BEGIN_DECLS typedef enum { - CMD_PYTHON_SCRIPT = 1, - CMD_PYTHON_FILE, - CMD_LUA_SCRIPT, - CMD_LUA_FILE, + CMD_SCRIPT = 1, CMD_OPEN_FILES, CMD_LAST } MooAppCmdCode; /* I is taken by the IPC thing */ -#define CMD_PYTHON_SCRIPT_S "p" -#define CMD_PYTHON_FILE_S "P" -#define CMD_LUA_SCRIPT_S "l" -#define CMD_LUA_FILE_S "L" +#define CMD_SCRIPT_S "e" #define CMD_OPEN_FILES_S "F" static const char *moo_app_cmd_chars = "\0" - CMD_PYTHON_SCRIPT_S - CMD_PYTHON_FILE_S - CMD_LUA_SCRIPT_S - CMD_LUA_FILE_S + CMD_SCRIPT_S CMD_OPEN_FILES_S ; diff --git a/moo/mooapp/mooapp.c b/moo/mooapp/mooapp.c index 2cfb3d57..deeb0a29 100644 --- a/moo/mooapp/mooapp.c +++ b/moo/mooapp/mooapp.c @@ -24,6 +24,7 @@ #include "mooapp-accels.h" #include "mooapp-info.h" #include "mooappabout.h" +#include "moolua/moolua.h" #include "mooedit/mooeditprefs.h" #include "mooedit/mooeditor.h" #include "mooedit/mooplugin.h" @@ -475,45 +476,63 @@ moo_app_get_instance (void) } -static void -run_python_file (MooApp *app, - const char *filename) -{ - FILE *file; - MooPyObject *res; +#define SCRIPT_PREFIX_LUA "lua-script:" +#define SCRIPT_PREFIX_LUA_FILE "lua-file:" +void +moo_app_run_script (MooApp *app, + const char *script) +{ g_return_if_fail (MOO_IS_APP (app)); - g_return_if_fail (filename != NULL); - g_return_if_fail (moo_python_running ()); + g_return_if_fail (script != NULL); - file = _moo_fopen (filename, "rb"); - g_return_if_fail (file != NULL); - - res = moo_python_run_file (file, filename, NULL, NULL); - - fclose (file); - - if (res) - moo_Py_DECREF (res); + if (g_str_has_prefix (script, SCRIPT_PREFIX_LUA)) + medit_lua_run_string (script + strlen (SCRIPT_PREFIX_LUA)); + else if (g_str_has_prefix (script, SCRIPT_PREFIX_LUA_FILE)) + medit_lua_run_file (script + strlen (SCRIPT_PREFIX_LUA_FILE)); else - moo_PyErr_Print (); + medit_lua_run_string (script); } -static void -run_python_script (const char *string) -{ - MooPyObject *res; - - g_return_if_fail (string != NULL); - g_return_if_fail (moo_python_running ()); - - res = moo_python_run_simple_string (string); - - if (res) - moo_Py_DECREF (res); - else - moo_PyErr_Print (); -} +// static void +// run_python_file (MooApp *app, +// const char *filename) +// { +// FILE *file; +// MooPyObject *res; +// +// g_return_if_fail (MOO_IS_APP (app)); +// g_return_if_fail (filename != NULL); +// g_return_if_fail (moo_python_running ()); +// +// file = _moo_fopen (filename, "rb"); +// g_return_if_fail (file != NULL); +// +// res = moo_python_run_file (file, filename, NULL, NULL); +// +// fclose (file); +// +// if (res) +// moo_Py_DECREF (res); +// else +// moo_PyErr_Print (); +// } +// +// static void +// run_python_script (const char *string) +// { +// MooPyObject *res; +// +// g_return_if_fail (string != NULL); +// g_return_if_fail (moo_python_running ()); +// +// res = moo_python_run_simple_string (string); +// +// if (res) +// moo_Py_DECREF (res); +// else +// moo_PyErr_Print (); +// } MooEditor * @@ -1303,18 +1322,9 @@ moo_app_exec_cmd (MooApp *app, switch (code) { - case CMD_PYTHON_SCRIPT: - run_python_script (data); + case CMD_SCRIPT: + moo_app_run_script (app, data); break; - case CMD_PYTHON_FILE: - run_python_file (app, data); - break; -// case CMD_LUA_SCRIPT: -// run_lua_script (data); -// break; -// case CMD_LUA_FILE: -// run_lua_file (app, data); -// break; case CMD_OPEN_FILES: moo_app_cmd_open_files (app, data); diff --git a/moo/mooapp/mooapp.h b/moo/mooapp/mooapp.h index ca3a2016..8a9ee8e5 100644 --- a/moo/mooapp/mooapp.h +++ b/moo/mooapp/mooapp.h @@ -100,6 +100,8 @@ void moo_app_open_files (MooApp *app, MooAppFileInfo *files, int n_files, guint32 stamp); +void moo_app_run_script (MooApp *app, + const char *script); G_END_DECLS diff --git a/moo/moolua/moolua.cpp b/moo/moolua/moolua.cpp index feecdefe..36497f04 100644 --- a/moo/moolua/moolua.cpp +++ b/moo/moolua/moolua.cpp @@ -88,8 +88,12 @@ cfunc_spin_main_loop (lua_State *L) g_return_val_if_fail (sec >= 0, 0); GMainLoop *main_loop = g_main_loop_new (NULL, FALSE); - g_timeout_add (sec * 1000, (GSourceFunc) quit_main_loop, main_loop); + _moo_timeout_add (sec * 1000, (GSourceFunc) quit_main_loop, main_loop); + + gdk_threads_leave (); g_main_loop_run (main_loop); + gdk_threads_enter (); + g_main_loop_unref (main_loop); return 0; @@ -163,7 +167,7 @@ moo_lua_add_user_path (lua_State *L) lua_State * -medit_lua_new (const char *init, bool enable_callbacks) +medit_lua_new (bool default_init, bool enable_callbacks) { lua_State *L = lua_open (); moo_return_val_if_fail (L != NULL, NULL); @@ -173,7 +177,7 @@ medit_lua_new (const char *init, bool enable_callbacks) moo_assert (lua_gettop (L) == 0); - if (!mom::lua_setup (L, enable_callbacks)) + if (!mom::lua_setup (L, default_init, enable_callbacks)) { lua_close (L); return NULL; @@ -181,36 +185,74 @@ medit_lua_new (const char *init, bool enable_callbacks) moo_assert (lua_gettop (L) == 0); - if (init) - { - if (luaL_loadstring (L, init) != 0) - { - const char *msg = lua_tostring (L, -1); - moo_critical ("%s", msg ? msg : "ERROR"); - lua_close (L); - return NULL; - } + return L; +} - if (lua_pcall (L, 0, 0, 0) != 0) - { - const char *msg = lua_tostring (L, -1); - moo_critical ("%s", msg ? msg : "ERROR"); - lua_close (L); - return NULL; - } +bool +medit_lua_do_string (lua_State *L, const char *string) +{ + moo_return_val_if_fail (L != NULL, FALSE); + moo_return_val_if_fail (string != NULL, FALSE); + + if (luaL_dostring (L, string) != 0) + { + const char *msg = lua_tostring (L, -1); + g_critical ("%s: %s", G_STRLOC, msg ? msg : "ERROR"); + return false; } - moo_assert (lua_gettop (L) == 0); + return true; +} - return L; +bool +medit_lua_do_file (lua_State *L, const char *filename) +{ + moo_return_val_if_fail (L != NULL, FALSE); + moo_return_val_if_fail (filename != NULL, FALSE); + + char *content = NULL; + GError *error = NULL; + if (!g_file_get_contents (filename, &content, NULL, &error)) + { + moo_warning ("could not read file '%s': %s", filename, error->message); + g_error_free (error); + return false; + } + + gboolean ret = medit_lua_do_string (L, content); + g_free (content); + return ret; } void medit_lua_free (lua_State *L) { - moo_return_if_fail (L != NULL); - mom::lua_cleanup (L); - lua_close (L); + if (L) + { + mom::lua_cleanup (L); + lua_close (L); + } +} + + +extern "C" void +medit_lua_run_string (const char *string) +{ + moo_return_if_fail (string != NULL); + lua_State *L = medit_lua_new (TRUE, FALSE); + if (L) + medit_lua_do_string (L, string); + medit_lua_free (L); +} + +extern "C" void +medit_lua_run_file (const char *filename) +{ + moo_return_if_fail (filename != NULL); + lua_State *L = medit_lua_new (TRUE, FALSE); + if (L) + medit_lua_do_file (L, filename); + medit_lua_free (L); } diff --git a/moo/moolua/moolua.h b/moo/moolua/moolua.h index 630a6f50..12f04c61 100644 --- a/moo/moolua/moolua.h +++ b/moo/moolua/moolua.h @@ -16,6 +16,8 @@ #ifndef MOO_LUA_H #define MOO_LUA_H +#ifdef __cplusplus + #include "lualib.h" #include "lauxlib.h" @@ -43,8 +45,26 @@ const char *lua_check_utf8string (lua_State *L, void moo_lua_add_user_path (lua_State *L); -lua_State *medit_lua_new (const char *init = NULL, - bool enable_callbacks = false); +lua_State *medit_lua_new (bool default_init, + bool enable_callbacks); void medit_lua_free (lua_State *L); +bool medit_lua_do_string (lua_State *L, + const char *string); +bool medit_lua_do_file (lua_State *L, + const char *filename); + +#endif /* __cplusplus */ + +#ifdef __cplusplus +extern "C" { +#endif + +void medit_lua_run_string (const char *string); +void medit_lua_run_file (const char *filename); + +#ifdef __cplusplus +} // extern "C" +#endif + #endif /* MOO_LUA_H */ diff --git a/moo/mooscript/Makefile.incl b/moo/mooscript/Makefile.incl index 6e1e016f..45916620 100644 --- a/moo/mooscript/Makefile.incl +++ b/moo/mooscript/Makefile.incl @@ -22,6 +22,12 @@ EXTRA_DIST += \ $(MOO_SCRIPT_PARSER_FILES) \ mooscript/mooscript.xml +EXTRA_DIST += mooscript/lua-default-init.lua +built_moo_sources += lua-default-init.h +lua-default-init.h: mooscript/lua-default-init.lua $(top_srcdir)/tools/xml2h.py + $(AM_V_GEN)$(PYTHON) $(top_srcdir)/tools/xml2h.py $(srcdir)/mooscript/lua-default-init.lua lua-default-init.h.tmp LUA_DEFAULT_INIT \ + && mv lua-default-init.h.tmp lua-default-init.h + if MOO_DEV_MODE built_moo_sources += \ mooscript/mooscript.stamp diff --git a/moo/mooscript/lua-default-init.lua b/moo/mooscript/lua-default-init.lua new file mode 100644 index 00000000..a99ba57f --- /dev/null +++ b/moo/mooscript/lua-default-init.lua @@ -0,0 +1,5 @@ +local _g = getfenv(0) +require("moo.builtin")._inject(_g) +local medit = require("medit") +_g.app = medit.get_app_obj() +_g.editor = _g.app.editor() diff --git a/moo/mooscript/mooscript-classes-impl.cpp b/moo/mooscript/mooscript-classes-impl.cpp index 774044c7..847c8a09 100644 --- a/moo/mooscript/mooscript-classes-impl.cpp +++ b/moo/mooscript/mooscript-classes-impl.cpp @@ -62,9 +62,13 @@ static String get_string(const Variant &val, bool null_ok = false) static moo::Vector get_string_list(const Variant &val) { - if (val.vt() != VtArray) + VariantArray ar; + if (val.vt() == VtArray) + ar = val.value(); + else if (val.vt() == VtArgs) + ar = val.value(); + else Error::raise("list expected"); - const VariantArray &ar = val.value(); moo::Vector ret; for (int i = 0, c = ar.size(); i < c; ++i) ret.append(get_string(ar[i])); @@ -113,9 +117,13 @@ static void get_iter(const Variant &val, GtkTextBuffer *buf, GtkTextIter *iter) static void get_pair(const Variant &val, Variant &elm1, Variant &elm2) { - if (val.vt() != VtArray) + VariantArray ar; + if (val.vt() == VtArray) + ar = val.value(); + else if (val.vt() == VtArgs) + ar = val.value(); + else Error::raise("pair of values expected"); - const VariantArray &ar = val.value(); if (ar.size() != 2) Error::raise("pair of values expected"); elm1 = ar[0]; @@ -674,6 +682,20 @@ String Document::basename() return String(moo_edit_get_display_basename(gobj())); } +/// @item Document.is_modified() +/// returns whether the document is modified. +bool Document::is_modified() +{ + return MOO_EDIT_IS_MODIFIED(gobj()); +} + +/// @item Document.set_modified(modified) +/// sets modification state of the document. +void Document::set_modified(bool modified) +{ + moo_edit_set_modified(gobj(), modified); +} + /// @item Document.encoding() /// returns character encoding of the document. String Document::encoding() diff --git a/moo/mooscript/mooscript-lua.cpp b/moo/mooscript/mooscript-lua.cpp index 3c213aa4..0d770664 100644 --- a/moo/mooscript/mooscript-lua.cpp +++ b/moo/mooscript/mooscript-lua.cpp @@ -1,4 +1,5 @@ #include "mooscript-lua.h" +#include "lua-default-init.h" namespace mom { @@ -447,7 +448,7 @@ static bool add_raw_api(lua_State *L, bool enable_callbacks) return true; } -bool lua_setup(lua_State *L, bool enable_callbacks) throw() +bool lua_setup(lua_State *L, bool default_init, bool enable_callbacks) throw() { try { @@ -466,6 +467,9 @@ bool lua_setup(lua_State *L, bool enable_callbacks) throw() g_assert (lua_gettop (L) == 0); + if (default_init) + medit_lua_do_string (L, LUA_DEFAULT_INIT); + return true; } catch (...) diff --git a/moo/mooscript/mooscript-lua.h b/moo/mooscript/mooscript-lua.h index 998843f4..dff1f53e 100644 --- a/moo/mooscript/mooscript-lua.h +++ b/moo/mooscript/mooscript-lua.h @@ -6,7 +6,7 @@ namespace mom { -bool lua_setup(lua_State *L, bool enable_callbacks) throw(); +bool lua_setup(lua_State *L, bool default_init, bool enable_callbacks) throw(); void lua_cleanup(lua_State *L) throw(); } // namespace mom diff --git a/moo/mooscript/mooscript.xml b/moo/mooscript/mooscript.xml index d0a175d8..af0e6e80 100644 --- a/moo/mooscript/mooscript.xml +++ b/moo/mooscript/mooscript.xml @@ -109,6 +109,9 @@ + + + diff --git a/moo/plugins/lua-module-setup.lua b/moo/plugins/lua-module-setup.lua index 62e12180..c3cc7e16 100644 --- a/moo/plugins/lua-module-setup.lua +++ b/moo/plugins/lua-module-setup.lua @@ -1,10 +1,4 @@ -local _g = getfenv(0) - -require("moo.builtin")._inject(_g) - local medit = require("medit") -_g.app = medit.get_app_obj() -_g.editor = _g.app.editor() local __medit_callbacks = {} diff --git a/moo/plugins/mooluaplugin.cpp b/moo/plugins/mooluaplugin.cpp index 5a94c3cc..733a1513 100644 --- a/moo/plugins/mooluaplugin.cpp +++ b/moo/plugins/mooluaplugin.cpp @@ -36,40 +36,22 @@ struct MooLuaPlugin { ModuleList *modules; }; -static bool -load_file (lua_State *L, const char *module_file) -{ - char *content = NULL; - GError *error = NULL; - if (!g_file_get_contents (module_file, &content, NULL, &error)) - { - moo_warning ("could not read file '%s': %s", module_file, error->message); - g_error_free (error); - return false; - } - - bool ret = true; - - if (luaL_dostring (L, content) != 0) - { - const char *msg = lua_tostring (L, -1); - g_critical ("%s: %s", G_STRLOC, msg ? msg : "ERROR"); - ret = false; - } - - g_free (content); - return ret; -} - static MooLuaModule * moo_lua_module_load (const char *filename) { - lua_State *L = medit_lua_new (LUA_MODULE_SETUP_CODE); + lua_State *L = medit_lua_new (true, true); if (!L) return NULL; - if (!load_file (L, filename)) + + if (!medit_lua_do_string (L, LUA_MODULE_SETUP_CODE)) { - lua_close (L); + medit_lua_free (L); + return NULL; + } + + if (!medit_lua_do_file (L, filename)) + { + medit_lua_free (L); return NULL; } diff --git a/moo/plugins/usertools/lua/lua-tool-setup.lua b/moo/plugins/usertools/lua/lua-tool-setup.lua index 2aafbc7c..fb1140ab 100644 --- a/moo/plugins/usertools/lua/lua-tool-setup.lua +++ b/moo/plugins/usertools/lua/lua-tool-setup.lua @@ -1,10 +1,4 @@ local _g = getfenv(0) - -require("moo.builtin")._inject(_g) - -local medit = require("medit") -_g.app = medit.get_app_obj() -_g.editor = _g.app.editor() _g.doc = _g.app.active_document() _g.view = _g.app.active_view() _g.window = _g.app.active_window() diff --git a/moo/plugins/usertools/lua/moocommand-lua.cpp b/moo/plugins/usertools/lua/moocommand-lua.cpp index 424639f9..0e67976f 100644 --- a/moo/plugins/usertools/lua/moocommand-lua.cpp +++ b/moo/plugins/usertools/lua/moocommand-lua.cpp @@ -50,14 +50,20 @@ moo_command_lua_run (MooCommand *cmd_base, g_return_if_fail (cmd->priv->code != NULL); - L = medit_lua_new (LUA_SETUP_CODE); + L = medit_lua_new (TRUE, FALSE); g_return_if_fail (L != NULL); + if (!medit_lua_do_string (L, LUA_SETUP_CODE)) + { + medit_lua_free (L); + return; + } + if (luaL_loadstring (L, cmd->priv->code) != 0) { const char *msg = lua_tostring (L, -1); g_critical ("%s: %s", G_STRLOC, msg ? msg : "ERROR"); - lua_close (L); + medit_lua_free (L); return; } diff --git a/plat/win32/gtk-win/Makefile b/plat/win32/gtk-win/Makefile index a22d5873..35fd8691 100644 --- a/plat/win32/gtk-win/Makefile +++ b/plat/win32/gtk-win/Makefile @@ -25,4 +25,4 @@ bdist: bdist-all: bdist-en bdist clean: - rm -rf $(mgwtargetdir) $(mgwdestdir) $(mgwdestdir)-en + rm -rf $(mgwbuilddir) $(mgwdestdir) $(mgwdestdir)-en diff --git a/plat/win32/gtk-win/config.sh b/plat/win32/gtk-win/config.sh index 828cc3cf..6b3f4e69 100644 --- a/plat/win32/gtk-win/config.sh +++ b/plat/win32/gtk-win/config.sh @@ -1,5 +1,6 @@ export mgwdir_s=$mgwdir export mgwdir=`cd $mgwdir && pwd` +export mgwbuildroot=$HOME/projects/gtk-win-build export mgwconfig=release case "$1" in @@ -13,10 +14,10 @@ case "$1" in ;; esac -export mgwdestdir=$mgwdir/bdist-$mgwconfig +export mgwdestdir=$mgwbuildroot/bdist-$mgwconfig -export mgwbuilddir=$mgwdir/$mgwconfig -export mgwbuilddir_s=$mgwdir_s/$mgwconfig +export mgwbuilddir=$mgwbuildroot/$mgwconfig +export mgwbuilddir_s=$mgwbuildroot/$mgwconfig export mgwsourcedir=$mgwbuilddir/source export mgwtargetdir=$mgwbuilddir/target export mgwsourcedir_s=$mgwbuilddir_s/source diff --git a/plat/win32/gtk-win/jhbuildrc/jhbuildrc b/plat/win32/gtk-win/jhbuildrc/jhbuildrc index bea38ad3..fdebc339 100644 --- a/plat/win32/gtk-win/jhbuildrc/jhbuildrc +++ b/plat/win32/gtk-win/jhbuildrc/jhbuildrc @@ -2,6 +2,7 @@ _gtkwindir = os.environ['_GTKWINDIR'] _gtkwinjhbuilddir = os.path.join(_gtkwindir, 'jhbuildrc') +_gtkwinbuildroot = os.environ['_GTKWINBUILDROOT'] _gtkwinconfig = os.environ.get('_GTKWINCONFIG') if _gtkwinconfig is None: @@ -23,10 +24,10 @@ use_lib64 = False modules = ['medit-gtk-win'] -checkoutroot = os.path.join(_gtkwindir, _gtkwinconfig, 'source') -buildroot = os.path.join(_gtkwindir, _gtkwinconfig, 'build') -prefix = os.path.join(_gtkwindir, _gtkwinconfig, 'target') -tarballdir = os.path.join(_gtkwindir, 'tarballs') +checkoutroot = os.path.join(_gtkwinbuildroot, _gtkwinconfig, 'source') +buildroot = os.path.join(_gtkwinbuildroot, _gtkwinconfig, 'build') +prefix = os.path.join(_gtkwinbuildroot, _gtkwinconfig, 'target') +tarballdir = os.path.join(_gtkwinbuildroot, 'tarballs') os.environ['prefix'] = prefix diff --git a/plat/win32/gtk-win/mjhbuild.sh b/plat/win32/gtk-win/mjhbuild.sh index d5277a09..9206d9f7 100755 --- a/plat/win32/gtk-win/mjhbuild.sh +++ b/plat/win32/gtk-win/mjhbuild.sh @@ -9,6 +9,7 @@ fi export _GTKWINDIR=`cd $mgwdir && pwd` export _GTKWINCONFIG=$mgwconfig +export _GTKWINBUILDROOT=$mgwbuildroot # JHBUILD=$mgwdir_s/jhbuild/bin/jhbuild JHBUILD=jhbuild