branch : pmacs2
This commit is contained in:
moculus 2008-05-30 18:13:26 +00:00
parent 5f99e1f8fb
commit 7fc0d762d7
5 changed files with 85 additions and 30 deletions

View File

@ -194,6 +194,7 @@ class Application(object):
method.DATATYPES['method'] = completer.MethodCompleter() method.DATATYPES['method'] = completer.MethodCompleter()
method.DATATYPES['register'] = completer.RegisterCompleter() method.DATATYPES['register'] = completer.RegisterCompleter()
method.DATATYPES['mode'] = completer.ModeCompleter() method.DATATYPES['mode'] = completer.ModeCompleter()
method.DATATYPES['token'] = completer.TokenCompleter()
# set up curses # set up curses
self.win = curses.newwin(self.y, self.x, 0, 0) self.win = curses.newwin(self.y, self.x, 0, 0)
@ -245,7 +246,7 @@ class Application(object):
# NOTE: this is not an optimal packing, but it's fast and easy to # NOTE: this is not an optimal packing, but it's fast and easy to
# understand. i encourage someone else to write something better. # understand. i encourage someone else to write something better.
numcols = self.bufferlist.slots[n].width // (maxlen + 2) numcols = max(self.bufferlist.slots[n].width // (maxlen + 2), 1)
numrows = clen - ((clen // numcols) * (numcols - 1)) numrows = clen - ((clen // numcols) * (numcols - 1))
for i in range(0, numrows): for i in range(0, numrows):
names = [] names = []
@ -387,7 +388,8 @@ class Application(object):
return self.mini_buffer return self.mini_buffer
def mini_buffer_is_open(self): def mini_buffer_is_open(self):
return self.mini_buffer is not None return self.mini_buffer is not None
def open_mini_buffer(self, prompt, callback, method=None, tabber=None, modename=None): def open_mini_buffer(self, prompt, callback, method=None, tabber=None,
modename=None, startvalue=None):
if self.mini_buffer_is_open(): if self.mini_buffer_is_open():
self.close_mini_buffer() self.close_mini_buffer()
self.mini_prompt = prompt self.mini_prompt = prompt
@ -395,6 +397,8 @@ class Application(object):
try: try:
w = self.x - 1 - len(self.mini_prompt) - 1 w = self.x - 1 - len(self.mini_prompt) - 1
window.Window(self.mini_buffer, self, height=1, width=w) window.Window(self.mini_buffer, self, height=1, width=w)
if startvalue:
self.mini_buffer.set_data(startvalue)
self.mini_active = True self.mini_active = True
except minibuffer.MiniBufferError: except minibuffer.MiniBufferError:
self.mini_buffer = None self.mini_buffer = None

View File

@ -90,6 +90,20 @@ class ShellCompleter(Completer):
else: else:
return self.command_completer.get_candidates(s) return self.command_completer.get_candidates(s)
class TokenCompleter(Completer):
def get_candidates(self, s, w=None):
w2 = w.buffer.method.old_window
t = w2.get_token2()
h = w2.get_highlighter()
candidates = {}
for line in h.tokens:
for t2 in line:
if t2 is t:
continue
elif t2.string.startswith(s):
candidates[t2.string] = 1
return candidates.keys()
class MethodCompleter(Completer): class MethodCompleter(Completer):
def get_candidates(self, s, w=None): def get_candidates(self, s, w=None):
return [n for n in w.application.methods if n.startswith(s)] return [n for n in w.application.methods if n.startswith(s)]

View File

@ -68,9 +68,8 @@ class Argument(object):
p = self.prompt + "(%s) " % (d) p = self.prompt + "(%s) " % (d)
else: else:
p = self.prompt p = self.prompt
app.open_mini_buffer(p, return_value, method, tabber) app.open_mini_buffer(p, return_value, method=method, tabber=tabber,
if starting_value: startvalue=starting_value)
app.mini_buffer.set_data(starting_value)
class Method(object): class Method(object):
_is_method = True _is_method = True

View File

@ -1,7 +1,7 @@
import os, commands, re, sets, tempfile import os, commands, re, sets, tempfile
from subprocess import Popen, PIPE, STDOUT from subprocess import Popen, PIPE, STDOUT
import buffer, default, dirutil, regex, util, window import buffer, completer, default, dirutil, regex, util, window
import mode.mini import mode.mini
from point import Point from point import Point
@ -82,7 +82,7 @@ class GetToken(Method):
else: else:
w.set_error('Token: %r (%s)' % (token.string, token.fqname())) w.set_error('Token: %r (%s)' % (token.string, token.fqname()))
class TokenComplete(Method): class TokenComplete2(Method):
'''Complete token names based on other tokens in the buffer''' '''Complete token names based on other tokens in the buffer'''
def _prune_candidates(self, t, minlen, candidates): def _prune_candidates(self, t, minlen, candidates):
if not candidates: if not candidates:
@ -131,7 +131,6 @@ class TokenComplete(Method):
w.buffer.delete(p1, p2) w.buffer.delete(p1, p2)
w.insert_string(p1, result) w.insert_string(p1, result)
#mode.mini.use_completion_window(w.application, result, candidates)
if not candidates: if not candidates:
w.set_error("No completion: %r" % result) w.set_error("No completion: %r" % result)
elif len(candidates) == 1: elif len(candidates) == 1:
@ -141,6 +140,43 @@ class TokenComplete(Method):
else: else:
w.set_error("Partial completion: %r" % candidates) w.set_error("Partial completion: %r" % candidates)
class TokenComplete(Method):
'''Complete token names based on other tokens in the buffer'''
def _execute(self, w, **vargs):
self.old_window = w
tabber = completer.TokenCompleter()
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
class Dummy(object): pass
dw = Dummy()
dw.buffer = Dummy()
dw.buffer.method = self
(s2, exists, complete) = tabber.tab_string(t.string, dw)
p1 = Point(t.x, t.y)
p2 = Point(t.end_x(), t.y)
def callback(s):
w.buffer.delete(p1, p2)
w.insert_string(p1, s)
w.application.close_mini_buffer()
if exists and complete:
w.set_error("Unique completion: %r" % s2)
callback(s2)
return
else:
if exists:
pass
w.application.open_mini_buffer("Foog: ", callback, method=self,
tabber=tabber, startvalue=s2)
class OpenConsole(Method): class OpenConsole(Method):
'''Evaluate python expressions (for advanced use and debugging only)''' '''Evaluate python expressions (for advanced use and debugging only)'''
def execute(self, w, **vargs): def execute(self, w, **vargs):

View File

@ -117,10 +117,11 @@ class PerlGrammar(Grammar):
RegionRule(r'quoted', r'qw? *(?P<delim>[^ #])', Grammar, r'%(delim)s'), RegionRule(r'quoted', r'qw? *(?P<delim>[^ #])', Grammar, r'%(delim)s'),
PatternRule(r'perl_function', r"(?:[a-zA-Z_][a-zA-Z_0-9]*::)*[a-zA-Z_][a-zA-Z_0-9]*(?= *\()"), PatternRule(r'perl_function', r"(?:[a-zA-Z_][a-zA-Z_0-9]*::)*[a-zA-Z_][a-zA-Z_0-9]*(?= *\()"),
PatternRule(r'perl_namespace', r"(?:[a-zA-Z_][a-zA-Z_0-9]*\:\:)+(?:[a-zA-Z_][a-zA-Z_0-9]*)?"),
PatternRule(r'perl_class', r"(?:[a-zA-Z_][a-zA-Z_0-9]*::)*[a-zA-Z_][a-zA-Z_0-9]*(?=->)"), PatternRule(r'perl_class', r"(?:[a-zA-Z_][a-zA-Z_0-9]*::)*[a-zA-Z_][a-zA-Z_0-9]*(?=->)"),
# some basic stuff # some basic stuff
PatternRule(r'delimiter', r"->|=>|(?<!:):(?!=:)|[,;=\?(){}\[\]\(\)]"), PatternRule(r'delimiter', r"::|->|=>|(?<!:):(?!=:)|[,;=\?(){}\[\]\(\)]"),
PatternRule(r'operator', r"\+=|-=|\*=|/=|//=|%=|&=\|\^=|>>=|<<=|\*\*="), PatternRule(r'operator', r"\+=|-=|\*=|/=|//=|%=|&=\|\^=|>>=|<<=|\*\*="),
PatternRule(r'operator', r"\+\+|\+|<=>|<>|<<|<=|<|-|>>|>=|>|\*\*|\*|&&|&|\|\||\||/|\^|==|//|~|=~|!~|!=|%|!|\.|x(?![a-zA-Z_])"), PatternRule(r'operator', r"\+\+|\+|<=>|<>|<<|<=|<|-|>>|>=|>|\*\*|\*|&&|&|\|\||\||/|\^|==|//|~|=~|!~|!=|%|!|\.|x(?![a-zA-Z_])"),
PatternRule(r'noperator', r"(?:xor|or|not|ne|lt|le|gt|ge|eq|cmp|and)(?![a-zA-Z_])"), PatternRule(r'noperator', r"(?:xor|or|not|ne|lt|le|gt|ge|eq|cmp|and)(?![a-zA-Z_])"),
@ -610,27 +611,28 @@ class Perl(mode.Fundamental):
'pod.end': ('red', 'default', 'bold'), 'pod.end': ('red', 'default', 'bold'),
# basic stuff # basic stuff
'escaped': ('magenta', 'default', 'bold'), 'escaped': ('magenta', 'default', 'bold'),
'null': ('default', 'default', 'bold'), 'null': ('default', 'default', 'bold'),
'sub': ('cyan', 'default', 'bold'), 'sub': ('cyan', 'default', 'bold'),
'prototype': ('magenta', 'default', 'bold'), 'prototype': ('magenta', 'default', 'bold'),
'operator': ('default', 'default', 'bold'), 'operator': ('default', 'default', 'bold'),
'noperator': ('magenta', 'default', 'bold'), 'noperator': ('magenta', 'default', 'bold'),
'endblock': ('red', 'default', 'bold'), 'endblock': ('red', 'default', 'bold'),
'perl_keyword': ('magenta', 'default', 'bold'), 'perl_keyword': ('magenta', 'default', 'bold'),
'cast': ('yellow', 'default', 'bold'), 'cast': ('yellow', 'default', 'bold'),
'scalar': ('yellow', 'default', 'bold'), 'scalar': ('yellow', 'default', 'bold'),
'array': ('yellow', 'default', 'bold'), 'array': ('yellow', 'default', 'bold'),
'deref': ('yellow', 'default', 'bold'), 'deref': ('yellow', 'default', 'bold'),
'perl_hash': ('yellow', 'default', 'bold'), 'perl_hash': ('yellow', 'default', 'bold'),
'hash_key': ('green', 'default', 'bold'), 'hash_key': ('green', 'default', 'bold'),
'perl_function': ('cyan', 'default', 'bold'), 'perl_function': ('cyan', 'default', 'bold'),
'perl_builtin': ('magenta', 'default', 'bold'), 'perl_namespace': ('cyan', 'default', 'bold'),
'perl_label': ('cyan', 'default', 'bold'), 'perl_builtin': ('magenta', 'default', 'bold'),
'package': ('cyan', 'default', 'bold'), 'perl_label': ('cyan', 'default', 'bold'),
'perl_class': ('cyan', 'default', 'bold'), 'package': ('cyan', 'default', 'bold'),
'use': ('cyan', 'default', 'bold'), 'perl_class': ('cyan', 'default', 'bold'),
'require': ('cyan', 'default', 'bold'), 'use': ('cyan', 'default', 'bold'),
'require': ('cyan', 'default', 'bold'),
# heredoc/evaldoc # heredoc/evaldoc
'heredoc.start': ('green', 'default', 'bold'), 'heredoc.start': ('green', 'default', 'bold'),