new features ftw

--HG--
branch : pmacs2
This commit is contained in:
moculus 2008-03-21 06:08:17 +00:00
parent 9cf78a89bc
commit 6e7a6d7cb0
4 changed files with 69 additions and 19 deletions

View File

@ -2,7 +2,7 @@
import curses, curses.ascii, getpass, os, re, string, sets, sys, termios, time import curses, curses.ascii, getpass, os, re, string, sets, sys, termios, time
import traceback import traceback
import buffer, bufferlist, color, completer, keyinput, method, minibuffer, mode, mode import buffer, bufferlist, color, completer, keyinput, method, minibuffer, mode
import util, window import util, window
from point import Point from point import Point
@ -190,6 +190,7 @@ class Application(object):
method.DATATYPES['register'] = completer.RegisterCompleter() method.DATATYPES['register'] = completer.RegisterCompleter()
method.DATATYPES['mode'] = completer.ModeCompleter() method.DATATYPES['mode'] = completer.ModeCompleter()
method.DATATYPES['perlfunction'] = completer.PerlFunctionCompleter() method.DATATYPES['perlfunction'] = completer.PerlFunctionCompleter()
method.DATATYPES['pythonfunction'] = completer.PythonFunctionCompleter()
# 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)

View File

@ -111,3 +111,9 @@ class PerlFunctionCompleter(Completer):
old_window = w.buffer.method.old_window old_window = w.buffer.method.old_window
functions = old_window.mode.get_functions() functions = old_window.mode.get_functions()
return [n for n in functions if n.startswith(s)] return [n for n in functions if n.startswith(s)]
class PythonFunctionCompleter(Completer):
def get_candidates(self, s, w=None):
old_window = w.buffer.method.old_window
functions = old_window.mode.get_functions()
return [n for n in functions if n.startswith(s)]

View File

@ -200,6 +200,9 @@ class Python(mode.Fundamental):
'rawstring.end': ('green', 'default'), 'rawstring.end': ('green', 'default'),
'system_identifier': ('cyan', 'default'), 'system_identifier': ('cyan', 'default'),
} }
config = {
'python.lib': '.',
}
def __init__(self, w): def __init__(self, w):
mode.Fundamental.__init__(self, w) mode.Fundamental.__init__(self, w)
# tag matching # tag matching
@ -207,22 +210,61 @@ class Python(mode.Fundamental):
self.add_bindings('close-brace', ('}',)) self.add_bindings('close-brace', ('}',))
self.add_bindings('close-bracket', (']',)) self.add_bindings('close-bracket', (']',))
# add python-specific methods # add python-specific methods
self.add_action(PythonInitFunctions())
self.add_action(PythonListFunctions())
self.add_action_and_bindings(PythonGotoFunction(), ('C-c M-g',))
self.add_action_and_bindings(PythonCheckSyntax(), ('C-c s',)) self.add_action_and_bindings(PythonCheckSyntax(), ('C-c s',))
self.add_action_and_bindings(PythonDictCleanup(), ('C-c h',)) self.add_action_and_bindings(PythonDictCleanup(), ('C-c h',))
# highlighting # other python
self.pythonlib = "." self.functions = None
def build_function_map(self):
b = self.window.buffer
self.functions = {}
for i in range(0, len(b.lines)):
m = regex.python_function.match(b.lines[i])
if m:
self.functions[m.group(1)] = i
def get_functions(self):
if self.functions is None:
self.build_function_map()
return self.functions
def get_function_names(self):
functions = self.get_functions()
pairs = [[functions[key], key] for key in functions]
pairs.sort()
names = [x[1] for x in pairs]
return names
class PythonSetLib(method.Method): class PythonInitFunctions(method.Method):
'''Set the path(s) to find perl modules''' '''Jump to a function defined in this module'''
args = [method.Argument("lib", type=type(""), prompt="Python Path: ",
default=default.build_constant("."))]
def _execute(self, w, **vargs): def _execute(self, w, **vargs):
w.mode.pythonlib = vargs['lib'] w.mode.build_function_map()
w.application.set_error("Initialized function map")
class PythonGotoFunction(method.Method):
'''Jump to a function defined in this module'''
args = [method.Argument("name", type(""), "pythonfunction", "Goto Function: ")]
def _execute(self, w, **vargs):
name = vargs['name']
functions = w.mode.get_functions()
if name in functions:
w.goto(Point(0, functions[name]))
else:
w.application.set_error("Function %r was not found" % name)
class PythonListFunctions(method.Method):
'''Show the user all functions defined in this module'''
def _execute(self, w, **vargs):
names = w.mode.get_function_names()
output = "\n".join(names) + "\n"
w.application.data_buffer("*Python-List-Functions*", output, switch_to=True)
class PythonCheckSyntax(method.Method): class PythonCheckSyntax(method.Method):
'''Check the syntax of the current python file''' '''Check the syntax of the current python file'''
def _execute(self, w, **vargs): def _execute(self, w, **vargs):
sys.path.insert(0, w.mode.pythonlib) pythonlib = w.application.config.get('python.lib')
if pythonlib:
sys.path.insert(0, pythonlib)
source = w.buffer.make_string() source = w.buffer.make_string()
try: try:
code = compile(source, w.buffer.path, 'exec') code = compile(source, w.buffer.path, 'exec')

View File

@ -32,3 +32,4 @@ perl_function = re.compile(r"^ *sub ([A-Za-z_][A-Za-z0-9_]*)")
python_base = re.compile(r"^[^ ]") python_base = re.compile(r"^[^ ]")
python_dict_cleanup = re.compile(r"^( *)((?:[^'\":]|'(?:\.|[^\'])*'|\"(?:\.|[^\'])*)+?)( *)(:)( *)([^ ].*)$") python_dict_cleanup = re.compile(r"^( *)((?:[^'\":]|'(?:\.|[^\'])*'|\"(?:\.|[^\'])*)+?)( *)(:)( *)([^ ].*)$")
python_assign_cleanup = re.compile(r"^( *)([^ ]+)( *)(=)( *)([^ ].*)$") python_assign_cleanup = re.compile(r"^( *)([^ ]+)( *)(=)( *)([^ ].*)$")
python_function = re.compile('^ *def ([A-Za-z_][A-Za-z0-9_]*)')