ajwillia-ms pushed a commit to branch master. http://git.enlightenment.org/tools/edi.git/commit/?id=19c48c6cdc15004add0456630a8096eb008a24ce
commit 19c48c6cdc15004add0456630a8096eb008a24ce Author: Andy Williams <a...@andywilliams.me> Date: Sun May 14 17:56:00 2017 +0100 editor: Initial work in snippet support Not really multiline yet but it's a start --- configure.ac | 2 +- src/bin/editor/edi_editor.c | 30 ++++++++++++++++++++++++++++-- src/bin/language/edi_language_provider.c | 5 +++-- src/bin/language/edi_language_provider.h | 1 + src/bin/language/edi_language_provider_c.c | 23 +++++++++++++++++++++++ 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index 23d82df..9e3fb54 100644 --- a/configure.ac +++ b/configure.ac @@ -71,7 +71,7 @@ EFL_CHECK_DOXYGEN([build_doc="yes"], [build_doc="no"]) ### Checks for libraries -requirements_pc_edi="eina >= 1.19.0 evas >= 1.19.0 ecore >= 1.19.0 edje >= 1.19.0 eo >= 1.19.0 elementary >= 1.19.0 eio >= 1.19.0" +requirements_pc_edi="eina >= 1.19.0 evas >= 1.19.0 ecore >= 1.19.0 edje >= 1.19.0 eo >= 1.19.0 elementary >= 1.19.99 eio >= 1.19.0" AC_SUBST([requirements_pc_edi]) PKG_CHECK_MODULES([EFL], [${requirements_pc_edi}]) diff --git a/src/bin/editor/edi_editor.c b/src/bin/editor/edi_editor.c index 72d64bb..9966bc4 100644 --- a/src/bin/editor/edi_editor.c +++ b/src/bin/editor/edi_editor.c @@ -581,6 +581,30 @@ _suggest_popup_setup(Edi_Editor *editor) } static void +_edi_editor_snippet_insert(Edi_Editor *editor, Evas_Event_Key_Down *ev) +{ + char *key; + const char *snippet; + unsigned int row, col; + Edi_Language_Provider *provider; + + provider = edi_language_provider_get(editor); + elm_code_widget_cursor_position_get(editor->entry, &row, &col); + key = _edi_editor_current_word_get(editor, row, col); + snippet = provider->snippet_get(key); + + if (!snippet) + return; + + elm_code_widget_selection_select_word(editor->entry, row, col); + elm_code_widget_selection_delete(editor->entry); + elm_code_widget_text_at_cursor_insert(editor->entry, snippet); + + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + free(key); +} + +static void _smart_cb_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) { @@ -635,9 +659,11 @@ _smart_cb_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, } } - if (edi_language_provider_has(editor)) + if ((!alt) && (!ctrl)) { - if ((!alt) && (!ctrl)) + if (!strcmp(ev->key, "Tab") && edi_language_provider_has(editor)) + _edi_editor_snippet_insert(editor, ev); + else if (edi_language_provider_has(editor)) _suggest_popup_key_down_cb(editor, ev->key, ev->string); } } diff --git a/src/bin/language/edi_language_provider.c b/src/bin/language/edi_language_provider.c index 46b6780..2cc12ac 100644 --- a/src/bin/language/edi_language_provider.c +++ b/src/bin/language/edi_language_provider.c @@ -14,10 +14,11 @@ static Edi_Language_Provider _edi_language_provider_registry[] = { { "c", _edi_language_c_add, _edi_language_c_refresh, _edi_language_c_del, - _edi_language_c_mime_name, _edi_language_c_lookup, _edi_language_c_lookup_doc + _edi_language_c_mime_name, _edi_language_c_snippet_get, + _edi_language_c_lookup, _edi_language_c_lookup_doc }, - {NULL, NULL, NULL, NULL, NULL, NULL, NULL} + {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL} }; Edi_Language_Provider *edi_language_provider_get(Edi_Editor *editor) diff --git a/src/bin/language/edi_language_provider.h b/src/bin/language/edi_language_provider.h index 137eb23..5ccb29c 100644 --- a/src/bin/language/edi_language_provider.h +++ b/src/bin/language/edi_language_provider.h @@ -45,6 +45,7 @@ typedef struct _Edi_Language_Provider void (*refresh)(Edi_Editor *editor); void (*del)(Edi_Editor *editor); const char *(*mime_name)(const char *mime); + const char *(*snippet_get)(const char *key); Eina_List *(*lookup)(Edi_Editor *editor, unsigned int row, unsigned int col); Edi_Language_Document *(*lookup_doc)(Edi_Editor *editor, unsigned int row, unsigned int col); } Edi_Language_Provider; diff --git a/src/bin/language/edi_language_provider_c.c b/src/bin/language/edi_language_provider_c.c index e04c08f..621cba2 100644 --- a/src/bin/language/edi_language_provider_c.c +++ b/src/bin/language/edi_language_provider_c.c @@ -154,6 +154,29 @@ _edi_language_c_mime_name(const char *mime) return NULL; } +const char * +_edi_language_c_snippet_get(const char *key) +{ + if (!strcmp(key, "ret")) + return "return"; + if (!strcmp(key, "if")) + return +"if ()" \ +" {" \ +" }"; + if (!strcmp(key, "ifel")) + return +"if ()" \ +" {" \ +" }" \ +"else" \ +" {" \ +" }"; + + return NULL; +} + + #if HAVE_LIBCLANG char * _edi_suggest_c_detail_get(Edi_Editor *editor, const char *term_str, --