SF.net SVN: jython:[7153] trunk/jython
[email protected] Sun, 17 Oct 2010 04:51:16 +0000
| Newsgroups | gmane.comp.lang.jython.cvs |
|---|---|
| Message-ID | <[email protected]> |
Revision: 7153
http://jython.svn.sourceforge.net/jython/?rev=7153&view=rev
Author: zyasoft
Date: 2010-10-17 04:51:15 +0000 (Sun, 17 Oct 2010)
Log Message:
-----------
Modified readline, specifically completion support and various hooks,
so that it supports ipython 0.10.1 (with a minor patch on os.name in
that codebase). Still requires user to provide an alternative
properties file, that should be fixed before RC1.
Fixes #1133.
Modified Paths:
--------------
trunk/jython/Lib/readline.py
trunk/jython/src/org/python/util/JLineConsole.java
Modified: trunk/jython/Lib/readline.py
===================================================================
--- trunk/jython/Lib/readline.py 2010-10-16 16:15:33 UTC (rev 7152)
+++ trunk/jython/Lib/readline.py 2010-10-17 04:51:15 UTC (rev 7153)
@@ -7,6 +7,24 @@
except AttributeError:
raise ImportError("Cannot access JLineConsole")
+history_list = None
+
+def _setup_history():
+ # This is obviously not desirable, but avoids O(n) workarounds to
+ # modify the history (ipython uses the function
+ # remove_history_item to mutate the history relatively frequently)
+ global history_list
+
+ history = reader.history
+ try:
+ history_list_field = history.class.getDeclaredField("history")
+ history_list_field.setAccessible(True)
+ history_list = history_list_field.get(history)
+ except:
+ pass
+
+_setup_history()
+
def parse_and_bind(string):
# TODO this should probably reinitialize the reader, if possible
# with any desired settings; this will require some more work to implement
@@ -14,24 +32,28 @@
# most importantly, need to support at least
# readline.parse_and_bind("tab: complete")
# but it's possible we can readily support other aspects of a readline file
+
+ # XXX first time through, print a warning message about the required setup
+ # with jline properties (or potentially test...)
pass
def get_line_buffer():
- return str(reader.cursorBuffer.buffer) # or use toString to get unicode?
+ return str(reader.cursorBuffer.buffer)
def insert_text(string):
reader.putString(string)
def read_init_file(filename=None):
- pass
+ print "Not implemented: read_init_file", filename
def read_history_file(filename="~/.history"):
expanded = os.path.expanduser(filename)
new_history = reader.getHistory().getClass()()
with open(expanded) as f:
for line in f:
- new_history.addToHistory(line)
+ new_history.addToHistory(line.rstrip())
reader.history = new_history
+ _setup_history()
def write_history_file(filename="~/.history"):
expanded = os.path.expanduser(filename)
@@ -42,6 +64,9 @@
def clear_history():
reader.history.clear()
+def add_history(line):
+ reader.addToHistory(line)
+
def get_history_length():
return reader.history.maxSize
@@ -55,23 +80,22 @@
return reader.history.historyList[index]
def remove_history_item(pos):
- # TODO possible?
- raise Exception("not implemented")
+ if history_list:
+ history_list.remove(pos)
+ else:
+ print "Cannot remove history item at position:", pos
def redisplay():
reader.redrawLine()
def set_startup_hook(function=None):
- # TODO add
- pass
-
+ sys._jy_interpreter.startupHook = function
+
def set_pre_input_hook(function=None):
- # TODO add
- pass
+ print "Not implemented: set_pre_input_hook", function
+_completer_function = None
-_completion_function = None
-
def set_completer(function=None):
"""set_completer([function]) -> None
Set or remove the completer function.
@@ -79,42 +103,50 @@
for state in 0, 1, 2, ..., until it returns a non-string.
It should return the next possible completion starting with 'text'."""
- _completion_function = function
+ global _completer_function
+ _completer_function = function
def complete_handler(buffer, cursor, candidates):
+ start = _get_delimited(buffer, cursor)[0]
+ delimited = buffer[start:cursor]
for state in xrange(100): # TODO arbitrary, what's the number used by gnu readline?
completion = None
try:
- completion = function(buffer[:cursor], state)
+ completion = function(delimited, state)
except:
pass
if completion:
candidates.add(completion)
else:
break
- return 0
+ return start
reader.addCompletor(complete_handler)
def get_completer():
- return _completion_function
+ return _completer_function
+def _get_delimited(buffer, cursor):
+ start = cursor
+ for i in xrange(cursor-1, -1, -1):
+ if buffer[i] in _completer_delims:
+ break
+ start = i
+ return start, cursor
+
def get_begidx():
- # TODO add
- pass
+ return _get_delimited(str(reader.cursorBuffer.buffer), reader.cursorBuffer.cursor)[0]
def get_endidx():
- # TODO add
- pass
+ return _get_delimited(str(reader.cursorBuffer.buffer), reader.cursorBuffer.cursor)[1]
def set_completer_delims(string):
- pass
+ global _completer_delims, _completer_delims_set
+ _completer_delims = string
+ _completer_delims_set = set(string)
def get_completer_delims():
- pass
+ return _completer_delims
-def add_history(line):
- reader.addToHistory(line)
-
-
+set_completer_delims(' \t\n`~!@#$%^&*()-=+[{]}\\|;:\'",<>/?')
Modified: trunk/jython/src/org/python/util/JLineConsole.java
===================================================================
--- trunk/jython/src/org/python/util/JLineConsole.java 2010-10-16 16:15:33 UTC (rev 7152)
+++ trunk/jython/src/org/python/util/JLineConsole.java 2010-10-17 04:51:15 UTC (rev 7153)
@@ -32,6 +32,11 @@
/** Main interface to JLine. */
protected ConsoleReader reader;
+ /** Set by readline.set_startup_hook */
+ protected PyObject startup_hook;
+
+ protected PyObject pre_input_hook;
+
/** Whether reader is a WindowsTerminal. */
private boolean windows;
@@ -116,6 +121,13 @@
while (true) {
try {
+ if (startup_hook != null) {
+ try {
+ startup_hook.__call__();
+ } catch (Exception ex) {
+ System.err.println(ex);
+ }
+ }
line = reader.readLine(promptString);
break;
} catch (IOException ioe) {
@@ -163,4 +175,19 @@
public ConsoleReader getReader() {
return reader;
}
+
+
+ /**
+ * @return the startup hook (called prior to each readline)
+ */
+ public PyObject getStartupHook() {
+ return startup_hook;
+ }
+
+ /**
+ * Sets the startup hook (called prior to each readline)
+ */
+ public void setStartupHook(PyObject hook) {
+ startup_hook = hook;
+ }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
------------------------------------------------------------------------------
Download new Adobe(R) Flash(R) Builder(TM) 4
The new Adobe(R) Flex(R) 4 and Flash(R) Builder(TM) 4 (formerly
Flex(R) Builder(TM)) enable the development of rich applications that run
across multiple browsers and platforms. Download your free trials today!
http://p.sf.net/sfu/adobe-dev2dev