diff --git a/application.py b/application.py index 4ae4b5d..9a48a8f 100755 --- a/application.py +++ b/application.py @@ -80,6 +80,9 @@ class Application(object): } self.default_color = ('default', 'default',) + # xyz + self._load_config_defaults() + # initialize our colors if curses.has_colors(): curses.start_color() @@ -189,15 +192,15 @@ class Application(object): self.registers = {} # initialize tab handlers - method.DATATYPES['path'] = completer.FileCompleter() + method.DATATYPES['path'] = completer.FileCompleter(self) method.DATATYPES['buffer'] = completer.BufferCompleter(self) - method.DATATYPES['command'] = completer.CommandCompleter() - method.DATATYPES['shell'] = completer.ShellCompleter() - method.DATATYPES['config'] = completer.ConfigCompleter() - method.DATATYPES['method'] = completer.MethodCompleter() - method.DATATYPES['register'] = completer.RegisterCompleter() - method.DATATYPES['mode'] = completer.ModeCompleter() - method.DATATYPES['token'] = completer.TokenCompleter() + method.DATATYPES['command'] = completer.CommandCompleter(self) + method.DATATYPES['shell'] = completer.ShellCompleter(self) + method.DATATYPES['config'] = completer.ConfigCompleter(self) + method.DATATYPES['method'] = completer.MethodCompleter(self) + method.DATATYPES['register'] = completer.RegisterCompleter(self) + method.DATATYPES['mode'] = completer.ModeCompleter(self) + method.DATATYPES['token'] = completer.TokenCompleter(self) # set up curses self.win = curses.newwin(self.y, self.x, 0, 0) @@ -208,6 +211,9 @@ class Application(object): curses.nonl() curses.def_prog_mode() + def _load_config_defaults(self): + self.config['ignore-suffix'] = ['~', '-'] + def completion_window_is_open(self): n = self.complete_slot if n is None: diff --git a/completer.py b/completer.py index 8ebf6d7..a4bc897 100644 --- a/completer.py +++ b/completer.py @@ -18,6 +18,8 @@ def find_common_string(candidates): return test class Completer(object): + def __init__(self, application): + self.application = application def get_candidates(self, s): assert "Not implemented" def tab_string(self, s, w=None): @@ -45,6 +47,21 @@ class FileCompleter(Completer): candidates = [util.expand_tilde(user) for user in users if user.startswith(s)] else: candidates = glob.glob(s + '*') + + # ignore some suffixes by default, unless the only possible completions + # ALL have ignored-suffixes, in which case just return them all. + cand2 = [] + for c in candidates: + ok = True + for suffix in self.application.config['ignore-suffix']: + if c.endswith(suffix): + ok = False + break + if ok: + cand2.append(c) + if cand2: + candidates = cand2 + for i in range(0, len(candidates)): c = candidates[i] if os.path.isdir(os.path.realpath(c)): @@ -52,8 +69,6 @@ class FileCompleter(Completer): return candidates class BufferCompleter(Completer): - def __init__(self, application): - self.application = application def get_candidates(self, s, w=None): bl = self.application.bufferlist candidates = [b.name() for b in bl.buffers if b.name().startswith(s)] @@ -77,18 +92,19 @@ class CommandCompleter(Completer): return candidates class ShellCompleter(Completer): - def __init__(self): - self.file_completer = FileCompleter() - self.command_completer = CommandCompleter() + def __init__(self, application): + Completer.__init__(self, application) + self.fc = FileCompleter(application) + self.cc = CommandCompleter(application) def get_candidates(self, s, w=None): if ' ' in s: i = s.rindex(' ') + 1 base = s[:i] last = s[i:] - candidates = self.file_completer.get_candidates(last) + candidates = self.fc.get_candidates(last) return [base + x for x in candidates] else: - return self.command_completer.get_candidates(s) + return self.cc.get_candidates(s) class TokenCompleter(Completer): def get_candidates(self, s, w=None): diff --git a/method/introspect.py b/method/introspect.py index ae785b0..5763b9b 100644 --- a/method/introspect.py +++ b/method/introspect.py @@ -101,7 +101,7 @@ class GetToken(Method): class TokenComplete(Method): '''Complete token names based on other tokens in the buffer''' _mini_prompt = 'Token Complete' - _tabber = completer.TokenCompleter() + _tabber = completer.TokenCompleter(None) class Dummy(object): pass def _complete(self, s): dw = self.Dummy() diff --git a/mode/__init__.py b/mode/__init__.py index b2db6c8..abaa193 100644 --- a/mode/__init__.py +++ b/mode/__init__.py @@ -1,4 +1,4 @@ -import math, os, string +import math, os, sets, string import color, method from lex import Lexer from point import Point @@ -88,9 +88,13 @@ class Fundamental(Handler): tabber = None context = None colors = {} - config = {} - lconfig = {} - dconfig = {} + + # config settings installed/modified by the mode + config = {} + dconfig = {} + lconfig = {} + sconfig = {} + actions = [] completers = {} format = "%(flag)s %(bname)-18s (%(mname)s) %(indent)s %(cursor)s/%(mark)s %(perc)s" @@ -110,8 +114,23 @@ class Fundamental(Handler): raise Exception, s else: app.token_colors[key] = val + + # install configuration stuff for (key, val) in cls.config.iteritems(): + assert key not in app.config, "uh oh: %r" % key app.config[key] = val + for (key, val) in cls.lconfig.iteritems(): + app.config.setdefault(key, []) + for val2 in val: + app.config[key].append(val2) + for (key, val) in cls.sconfig.iteritems(): + app.config.setdefault(key, sets.Set()) + app.config[key].add(val) + for (key, d) in cls.dconfig.iteritems(): + app.config.setdefault(key, {}) + for (subkey, val) in d.iteritems(): + app.config[key][subkey] = val + for mcls in cls.actions: m = mcls() if m.name in app.methods: diff --git a/mode/c.py b/mode/c.py index f898539..657db33 100644 --- a/mode/c.py +++ b/mode/c.py @@ -185,6 +185,9 @@ class C(mode.Fundamental): 'c.make-cmd': "make", 'c.make-rel-dir': True, } + lconfig = { + 'ignore-suffix': ['.o'], + } actions = [CCheckSyntax, CMake] format = "%(flag)s %(bname)-18s (%(mname)s) %(indent)s %(cursor)s/%(mark)s %(perc)s [%(func)s]" diff --git a/mode/perl.py b/mode/perl.py index 60df5b6..466bfb8 100644 --- a/mode/perl.py +++ b/mode/perl.py @@ -715,7 +715,7 @@ class Perl(mode.Fundamental): PerlListFunctions, PerlOpenModule, PerlOpenModuleWord, PerlSemanticComplete] completers = { - 'perlfunction': PerlFunctionCompleter(), + 'perlfunction': PerlFunctionCompleter(None), } format = "%(flag)s %(bname)-18s (%(mname)s) %(indent)s %(cursor)s/%(mark)s %(perc)s [%(func)s]" #format = "%(flag)s %(bname)-18s (%(mname)s) %(cursor)s/%(mark)s %(perc)s" diff --git a/mode/python.py b/mode/python.py index 4bbc715..3a0350f 100644 --- a/mode/python.py +++ b/mode/python.py @@ -497,14 +497,17 @@ class Python(mode.Fundamental): config = { 'python.lib': '.', } + lconfig = { + 'ignore-suffix': ['.pyc'], + } actions = [PythonInitNames, PythonListNames, PythonGotoName, PythonGotoFunction, PythonGotoClass, PythonCheckSyntax, PythonDictCleanup, PythonSemanticComplete, PythonInsertTripleSquotes, PythonInsertTripleDquotes] completers = { - "pythonname": PythonNameCompleter(), - "pythonfunction": PythonFunctionCompleter(), - "pythonclass": PythonClassCompleter(), + "pythonname": PythonNameCompleter(None), + "pythonfunction": PythonFunctionCompleter(None), + "pythonclass": PythonClassCompleter(None), } format = "%(flag)s %(bname)-18s (%(mname)s) %(indent)s %(cursor)s/%(mark)s %(perc)s [%(name)s]"