[gedit] Allow non alphanumeric snippet tab triggers



commit 175d71c0418710693dd6070e80d8f233a444cb04
Author: Jesse van den Kieboom <jesse vandenkieboom epfl ch>
Date:   Wed Aug 15 09:45:28 2012 +0200

    Allow non alphanumeric snippet tab triggers

 plugins/snippets/snippets/document.py |   42 ++++++++++++++++++---------------
 plugins/snippets/snippets/helper.py   |   19 +++++++++++++++
 plugins/snippets/snippets/library.py  |   16 +-----------
 plugins/snippets/snippets/manager.py  |    2 +-
 4 files changed, 44 insertions(+), 35 deletions(-)
---
diff --git a/plugins/snippets/snippets/document.py b/plugins/snippets/snippets/document.py
index 59213d0..322a66b 100644
--- a/plugins/snippets/snippets/document.py
+++ b/plugins/snippets/snippets/document.py
@@ -27,6 +27,7 @@ from placeholder import *
 import completion
 from signals import Signals
 from shareddata import SharedData
+import helper
 
 class DynamicSnippet(dict):
         def __init__(self, text):
@@ -598,31 +599,34 @@ class Document(GObject.Object, Gedit.ViewActivatable, Signals):
                         end = buf.get_iter_at_mark(buf.get_insert())
 
                 start = end.copy()
-
                 word = None
+                first = True
 
-                if start.backward_word_start():
-                        # Check if we were at a word start ourselves
-                        tmp = start.copy()
-                        tmp.forward_word_end()
+                # Move start backward as long as there is a valid character
+                while start.backward_char():
+                        c = start.get_char()
 
-                        if tmp.equal(end):
-                                word = unicode(buf.get_text(start, end, False), 'utf-8')
-                        else:
-                                start = end.copy()
-                else:
-                        start = end.copy()
+                        if not helper.is_tab_trigger_character(c):
+                                # Check this for a single special char
+                                if first and helper.is_tab_trigger(c):
+                                        break
 
-                if not word or word == '':
-                        if start.backward_char():
-                                word = start.get_char()
+                                # Make sure first char is valid
+                                while not start.equal(end) and \
+                                      not helper.is_first_tab_trigger_character(start):
+                                        start.forward_char()
 
-                                if word.isalnum() or word.isspace():
-                                        return (None, None, None)
-                        else:
-                                return (None, None, None)
+                                break
+
+                        first = False
+
+                if not start.equal(end):
+                        word = unicode(buf.get_text(start, end, False), 'utf-8')
+
+                        if word and word != '':
+                                return (word, start, end)
 
-                return (word, start, end)
+                return (None, None, None)
 
         def parse_and_run_snippet(self, data, iter):
                 if not self.view.get_editable():
diff --git a/plugins/snippets/snippets/helper.py b/plugins/snippets/snippets/helper.py
index 58cdb2f..3bdf4e6 100644
--- a/plugins/snippets/snippets/helper.py
+++ b/plugins/snippets/snippets/helper.py
@@ -146,6 +146,25 @@ def _write_node(node, file, cdata_nodes=(), indent=0):
 def _cdata(text):
         return '<![CDATA[' + text.replace(']]>', ']]]]><![CDATA[>') + ']]>'
 
+def is_tab_trigger(w):
+        if len(w) == 1 and not (w.isalnum() or w.isspace()):
+                return True
+
+        if not is_first_tab_trigger_character(w[0]):
+                return False
+
+        for c in w:
+                if not is_tab_trigger_character(c):
+                        return False
+
+        return True
+
+def is_first_tab_trigger_character(c):
+        return c.isalpha() or c in '_:.'
+
+def is_tab_trigger_character(c):
+        return c.isalnum() or c in '_:.'
+
 def buffer_word_boundary(buf):
         iter = buf.get_iter_at_mark(buf.get_insert())
         start = iter.copy()
diff --git a/plugins/snippets/snippets/library.py b/plugins/snippets/snippets/library.py
index 0cb6d70..79b894c 100644
--- a/plugins/snippets/snippets/library.py
+++ b/plugins/snippets/snippets/library.py
@@ -945,21 +945,7 @@ class Library(Singleton):
                 if not trigger:
                         return True
 
-                if trigger.isdigit():
-                        return False
-
-                self.check_buffer.set_text(trigger)
-
-                start, end = self.check_buffer.get_bounds()
-                text = unicode(self.check_buffer.get_text(start, end, False), 'utf-8')
-
-                s = start.copy()
-                e = end.copy()
-
-                end.backward_word_start()
-                start.forward_word_end()
-
-                return (s.equal(end) and e.equal(start)) or (len(text) == 1 and not (text.isalnum() or text.isspace()))
+                return is_tab_trigger(trigger)
 
         # Snippet getters
         # ===============
diff --git a/plugins/snippets/snippets/manager.py b/plugins/snippets/snippets/manager.py
index 15d80d5..3720509 100644
--- a/plugins/snippets/snippets/manager.py
+++ b/plugins/snippets/snippets/manager.py
@@ -660,7 +660,7 @@ class Manager(Gtk.Dialog, Gtk.Buildable):
                         img.show()
 
                         #self['hbox_tab_trigger'].set_spacing(3)
-                        tip = _('This is not a valid Tab trigger. Triggers can either contain letters or a single (non-alphanumeric) character like: {, [, etc.')
+                        tip = _('This is not a valid Tab trigger. Triggers can either contain alphanumeric characters (or _, : and .) or a single (non-alphanumeric) character like: {, [, etc.')
 
                         entry.set_tooltip_text(tip)
                         img.set_tooltip_text(tip)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]