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,

-- 


Reply via email to