branch : pmacs2
This commit is contained in:
moculus 2008-06-06 13:11:46 +00:00
parent 86fa0512af
commit 3d18767ddd
4 changed files with 60 additions and 10 deletions

1
IDEAS
View File

@ -13,6 +13,7 @@ certainly requires seperate processes or threads.
Semantic tab-completion via iperl/ipython buffers... after syntax check, the Semantic tab-completion via iperl/ipython buffers... after syntax check, the
file will be read into an interactive buffer, which can then be hooked into in file will be read into an interactive buffer, which can then be hooked into in
order to support tab completion! order to support tab completion!
(mostly done!)
2008/05/11: 2008/05/11:

View File

@ -412,7 +412,7 @@ class InterpreterBuffer(Buffer):
readre = re.compile('^([A-Z]+):(.*)\n$') readre = re.compile('^([A-Z]+):(.*)\n$')
def __init__(self, parent, app): def __init__(self, parent, app):
self.application = app self.application = app
if hasattr(parent, 'path'): if parent and hasattr(parent, 'path'):
self.parent = parent self.parent = parent
else: else:
self.parent = None self.parent = None
@ -479,6 +479,15 @@ class IperlBuffer(InterpreterBuffer):
_basename = 'IPerl' _basename = 'IPerl'
btype = 'iperl' btype = 'iperl'
modename = 'iperl' modename = 'iperl'
def create_name(cls, parent):
if parent and hasattr(parent, 'path'):
if parent.path.endswith('.pm'):
return '*%s:%s*' % (cls._basename, parent.name())
else:
raise Exception, "not a perl module"
else:
return '*%s*' % cls._basename
create_name = classmethod(create_name)
def get_cmd(self): def get_cmd(self):
if self.parent: if self.parent:
return ('iperl', '-p', '-r', self.parent.path) return ('iperl', '-p', '-r', self.parent.path)

View File

@ -85,9 +85,15 @@ class GetToken(Method):
class TokenComplete(Method): class TokenComplete(Method):
'''Complete token names based on other tokens in the buffer''' '''Complete token names based on other tokens in the buffer'''
_mini_prompt = 'Token Complete' _mini_prompt = 'Token Complete'
_tabber = completer.TokenCompleter()
class Dummy(object): pass
def _complete(self, s):
dw = self.Dummy()
dw.buffer = self.Dummy()
dw.buffer.method = self
return self._tabber.tab_string(s, dw)
def _execute(self, w, **vargs): def _execute(self, w, **vargs):
self.old_window = w self.old_window = w
tabber = completer.TokenCompleter()
t = w.get_token2() t = w.get_token2()
if t is None: if t is None:
w.set_error("No token to complete!") w.set_error("No token to complete!")
@ -96,11 +102,10 @@ class TokenComplete(Method):
w.set_error("Will not complete reserved token") w.set_error("Will not complete reserved token")
return return
class Dummy(object): pass dw = self.Dummy()
dw = Dummy() dw.buffer = self.Dummy()
dw.buffer = Dummy()
dw.buffer.method = self dw.buffer.method = self
(s2, exists, complete) = tabber.tab_string(t.string, dw) (s2, exists, complete) = self._tabber.tab_string(t.string, dw)
p1 = Point(t.x, t.y) p1 = Point(t.x, t.y)
p2 = Point(t.end_x(), t.y) p2 = Point(t.end_x(), t.y)
@ -114,10 +119,8 @@ class TokenComplete(Method):
callback(s2) callback(s2)
return return
else: else:
if exists:
pass
w.application.open_mini_buffer("%s: " % self._mini_prompt, callback, w.application.open_mini_buffer("%s: " % self._mini_prompt, callback,
method=self, tabber=tabber, method=self, tabber=self._tabber,
startvalue=s2) startvalue=s2)
class OpenConsole(Method): class OpenConsole(Method):

View File

@ -493,6 +493,17 @@ class PerlWrapParagraph(method.WrapParagraph):
class PerlSemanticComplete(method.introspect.TokenComplete): class PerlSemanticComplete(method.introspect.TokenComplete):
_mini_prompt = 'Semantic Complete' _mini_prompt = 'Semantic Complete'
def _prune_candidates(self, t, minlen, candidates):
if not candidates:
return ([], t.string)
i = len(t.string)
while i < minlen:
c = candidates[0][i]
for s in candidates:
if s[i] != c:
return (candidates, candidates[0][:i])
i += 1
return (candidates, candidates[0][:minlen])
def _min_completion(self, w, t): def _min_completion(self, w, t):
a = w.application a = w.application
a.methods['iperl-path-start'].execute(w, switch=False) a.methods['iperl-path-start'].execute(w, switch=False)
@ -502,7 +513,7 @@ class PerlSemanticComplete(method.introspect.TokenComplete):
line = w.buffer.lines[t.y] line = w.buffer.lines[t.y]
(x1, x2) = (t.x, t.end_x()) (x1, x2) = (t.x, t.end_x())
candidates = [t.string + s for s in b.readline_completions(x1, x2, line)] candidates = b.readline_completions(x1, x2, line)
minlen = None minlen = None
for candidate in candidates: for candidate in candidates:
@ -512,6 +523,32 @@ class PerlSemanticComplete(method.introspect.TokenComplete):
minlen = min(minlen, len(candidate)) minlen = min(minlen, len(candidate))
return self._prune_candidates(t, minlen, candidates) return self._prune_candidates(t, minlen, candidates)
def _execute(self, w, **vargs):
t = w.get_token2()
if t is None:
w.set_error("No token to complete!")
return
elif regex.reserved_token_names.match(t.name):
w.set_error("Will not complete reserved token")
return
(candidates, result) = self._min_completion(w, t)
if candidates:
p1 = Point(t.x, t.y)
p2 = Point(t.end_x(), t.y)
w.buffer.delete(p1, p2)
w.insert_string(p1, result)
if not candidates:
w.set_error("No completion: %r" % result)
elif len(candidates) == 1:
w.set_error("Unique completion: %r" % result)
elif result in candidates:
w.set_error("Ambiguous completion: %r" % candidates)
else:
w.set_error("Partial completion: %r" % candidates)
class PerlOpenModule(method.Method): class PerlOpenModule(method.Method):
args = [Argument("module", type=type(""), prompt="Open Perl Module: ")] args = [Argument("module", type=type(""), prompt="Open Perl Module: ")]