[pyrepl-checkins] r5440 - in pyrepl/branch/pyrepl-rework-n: pyrepl
pyrepl/dfa test/unit
mwh at codespeak.net
mwh at codespeak.net
Mon Jul 5 17:17:18 MEST 2004
Author: mwh
Date: Mon Jul 5 17:17:17 2004
New Revision: 5440
Modified:
pyrepl/branch/pyrepl-rework-n/pyrepl/commands.py
pyrepl/branch/pyrepl-rework-n/pyrepl/console.py
pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/commandsm.py
pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/keystrokesm.py
pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/unicodesm.py
pyrepl/branch/pyrepl-rework-n/pyrepl/reader.py
pyrepl/branch/pyrepl-rework-n/pyrepl/unix_console.py
pyrepl/branch/pyrepl-rework-n/test/unit/test_commandsm.py
pyrepl/branch/pyrepl-rework-n/test/unit/test_keystrokesm.py
pyrepl/branch/pyrepl-rework-n/test/unit/test_statemachines.py
Log:
some random code motion
changes to reader.py to begin using new machinery
everything still feels a bit too much like random hacking
Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/commands.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/commands.py (original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/commands.py Mon Jul 5 17:17:17 2004
@@ -284,7 +284,7 @@
class self_insert(EditCommand):
def do(self):
r = self.reader
- r.insert(self.event * r.get_arg())
+ r.insert(self.event[-1].raw * r.get_arg())
class insert_nl(EditCommand):
def do(self):
Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/console.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/console.py (original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/console.py Mon Jul 5 17:17:17 2004
@@ -17,6 +17,35 @@
# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+class Keystroke(object):
+ def __init__(self, name, raw):
+ self.name = name
+ self.raw = raw
+ def __eq__(self, other):
+ if isinstance(other, Keystroke):
+ return self.name == other.name and self.raw == other.raw
+ else:
+ return False
+ def __repr__(self):
+ return "%s(%r, %r)"%(self.__class__.__name__,
+ self.name, self.raw)
+
+
+class Command(object):
+ def __init__(self, cmd, keystrokes):
+ self.cmd = cmd
+ self.keystrokes = keystrokes
+ def __eq__(self, other):
+ if isinstance(other, Command):
+ return self.cmd == other.cmd \
+ and self.keystrokes == other.keystrokes
+ else:
+ return False
+ def __repr__(self):
+ return "%s(%r, %r)"%(self.__class__.__name__,
+ self.cmd, self.keystrokes)
+
class Event:
"""An Event. `evt' is 'key' or somesuch."""
Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/commandsm.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/commandsm.py (original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/commandsm.py Mon Jul 5 17:17:17 2004
@@ -1,25 +1,10 @@
+from pyrepl.console import Command
from pyrepl.dfa.base import StateMachine
from pyrepl.dfa.compile import make_match
from pyrepl.keymap import parse_keys
import unicodedata
-class Command(object):
- def __init__(self, cmd, keystrokes):
- self.cmd = cmd
- self.keystrokes = keystrokes
- def __eq__(self, other):
- if isinstance(other, Command):
- return self.cmd == other.cmd \
- and self.keystrokes == other.keystrokes
- else:
- return False
- def __repr__(self):
- return "%s(%r, %r)"%(self.__class__.__name__,
- self.cmd, self.keystrokes)
-
-
-
class CommandSM(StateMachine):
def __init__(self, parent, keys, keymap, invalid_cls, character_cls):
super(CommandSM, self).__init__(parent)
Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/keystrokesm.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/keystrokesm.py (original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/keystrokesm.py Mon Jul 5 17:17:17 2004
@@ -1,57 +1,14 @@
+from pyrepl.console import Keystroke
from pyrepl.dfa.base import StateMachine
from pyrepl.dfa.compile import make_match
-class Keystroke(object):
- def __init__(self, name, raw):
- self.name = name
- self.raw = raw
- def __eq__(self, other):
- if isinstance(other, Keystroke):
- return self.name == other.name and self.raw == other.raw
- else:
- return False
- def __repr__(self):
- return "%s(%r, %r)"%(self.__class__.__name__,
- self.name, self.raw)
-
-class CursesKeys(object):
- _keynames = {
- "delete" : "kdch1",
- "down" : "kcud1",
- "end" : "kend",
- "enter" : "kent",
- "f1" : "kf1", "f2" : "kf2", "f3" : "kf3", "f4" : "kf4",
- "f5" : "kf5", "f6" : "kf6", "f7" : "kf7", "f8" : "kf8",
- "f9" : "kf9", "f10" : "kf10", "f11" : "kf11", "f12" : "kf12",
- "f13" : "kf13", "f14" : "kf14", "f15" : "kf15", "f16" : "kf16",
- "f17" : "kf17", "f18" : "kf18", "f19" : "kf19", "f20" : "kf20",
- "home" : "khome",
- "insert" : "kich1",
- "left" : "kcub1",
- "page down" : "knp",
- "page up" : "kpp",
- "right" : "kcuf1",
- "up" : "kcuu1",
- }
- def translate(self, key):
- from curses import tigetstr
- return tigetstr(self._keynames[key])
- def all_keys(self):
- r = []
- for k in _keynames:
- v = self.translate(k)
- if v is not None:
- r.append((v, k))
- r.append((tcgetattr(fd)[6][VERASE], 'backspace'))
- return r
- def keynames(self):
- return self._keynames.keys()
-
class KeystrokeSM(StateMachine):
def __init__(self, parent, keys):
super(KeystrokeSM, self).__init__(parent)
self.k = self.ck = make_match(keys.all_keys())
self.chars = ''
+ def insert(self, keystroke):
+ self.output.insert(0, keystroke)
def push(self, evt):
if evt in self.k:
self.chars += evt
Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/unicodesm.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/unicodesm.py (original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/unicodesm.py Mon Jul 5 17:17:17 2004
@@ -1,5 +1,7 @@
from pyrepl.dfa.base import StateMachine
+import codecs
+
class FixedWidthUnicodeSM(StateMachine):
def __init__(self, parent, encoding):
super(FixedWidthUnicodeSM, self).__init__(parent)
@@ -51,3 +53,11 @@
c = self.chars
self.chars = ''
self.output.append(c.decode('utf-8'))
+
+def unicodesm_for_encoding(encoding):
+ if codecs.lookup(encoding) == codecs.lookup('utf-8'):
+ return UTF8UnicodeSM(None)
+ else:
+ # optimistic!
+ return FixedWidthUnicodeSM(None, encoding)
+
Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/reader.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/reader.py (original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/reader.py Mon Jul 5 17:17:17 2004
@@ -20,7 +20,7 @@
import types, unicodedata
from pyrepl import commands
from curses import ascii
-from pyrepl import input
+from pyrepl.dfa import commandsm
def _make_unctrl_map():
uc_map = {}
@@ -242,8 +242,8 @@
self.syntax_table = make_default_syntax_table()
self.input_trans_stack = []
self.keymap = self.collect_keymap()
- self.input_trans = input.KeymapTranslator(
- self.keymap,
+ self.input_trans = commandsm.CommandSM(
+ None, self.console.keys, self.keymap,
invalid_cls='invalid-key',
character_cls='self-insert')
@@ -469,11 +469,11 @@
def do_cmd(self, cmd):
#print cmd
- if isinstance(cmd[0], str):
- cmd = self.commands.get(cmd[0],
- commands.invalid_command)(self, cmd)
+ if isinstance(cmd.cmd, str):
+ cmd = self.commands.get(cmd.cmd,
+ commands.invalid_command)(self, (cmd.cmd, cmd.keystrokes))
elif isinstance(cmd[0], type):
- cmd = cmd[0](self, cmd)
+ cmd = cmd.cmd(self, cmd)
cmd.do()
@@ -502,15 +502,15 @@
self.dirty = 1
while 1:
- event = self.console.get_event(block)
- if not event: # can only happen if we're not blocking
+ keystroke = self.console.get_event(block)
+ if keystroke is None: # can only happen if we're not blocking
return None
- if event.evt == 'key':
- self.input_trans.push(event)
- elif event.evt == 'scroll':
+ if keystroke.name[0] != '<':
+ self.input_trans.push(keystroke)
+ elif keystroke.name == '<scroll>':
self.refresh()
- elif event.evt == 'resize':
+ elif keystroke.name == '<resize>':
self.refresh()
else:
pass
Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/unix_console.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/unix_console.py (original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/unix_console.py Mon Jul 5 17:17:17 2004
@@ -23,6 +23,7 @@
from pyrepl.fancy_termios import tcgetattr, tcsetattr
from pyrepl.console import Console, Event
from pyrepl import unix_eventqueue
+from pyrepl.dfa import unicodesm, keystrokesm
# there are arguments for changing this to "refresh"
SIGWINCH_EVENT = 'repaint'
@@ -68,7 +69,56 @@
POLLIN = getattr(select, "POLLIN", None)
+
+class CursesKeys(object):
+ _curses_keynames = {
+ "delete" : "kdch1",
+ "down" : "kcud1",
+ "end" : "kend",
+ "enter" : "kent",
+ "f1" : "kf1", "f2" : "kf2", "f3" : "kf3", "f4" : "kf4",
+ "f5" : "kf5", "f6" : "kf6", "f7" : "kf7", "f8" : "kf8",
+ "f9" : "kf9", "f10" : "kf10", "f11" : "kf11", "f12" : "kf12",
+ "f13" : "kf13", "f14" : "kf14", "f15" : "kf15", "f16" : "kf16",
+ "f17" : "kf17", "f18" : "kf18", "f19" : "kf19", "f20" : "kf20",
+ "home" : "khome",
+ "insert" : "kich1",
+ "left" : "kcub1",
+ "page down" : "knp",
+ "page up" : "kpp",
+ "right" : "kcuf1",
+ "up" : "kcuu1",
+ }
+ _simple_keys = {
+ 'enter': '\r',
+# 'escape': '\033',
+ 'return': '\r',
+ 'space': ' ',
+ 'tab': '\t',
+ }
+
+ def translate(self, key):
+ if key in self._curses_keynames:
+ from curses import tigetstr
+ return tigetstr(self._curses_keynames[key])
+ elif key in self._simple_keys:
+ return self._simple_keys[key]
+ def all_keys(self):
+ r = []
+ for k in self.keynames():
+ v = self.translate(k)
+ if v is not None:
+ r.append((v, k))
+ # XXX ick
+ r.append((tcgetattr(0).cc[termios.VERASE], 'backspace'))
+ print r
+ return r
+ def keynames(self):
+ return self._curses_keynames.keys() + self._simple_keys.keys() + ['backspace']
+
+
class UnixConsole(Console):
+ keys = CursesKeys()
def __init__(self, f_in=0, f_out=1, term=None, encoding=None):
if encoding is None:
encoding = sys.getdefaultencoding()
@@ -89,6 +139,10 @@
self.pollob.register(self.input_fd, POLLIN)
curses.setupterm(term, self.output_fd)
self.term = term
+
+ self.unicodesm = unicodesm.unicodesm_for_encoding(encoding)
+ self.keystrokesm = keystrokesm.KeystrokeSM(None, self.keys)
+ self.unicodesm.parent = self.keystrokesm
self._bel = _my_getstr("bel")
self._civis = _my_getstr("civis", optional=1)
@@ -148,7 +202,6 @@
self.__move = self.__move_short
- self.event_queue = unix_eventqueue.EventQueue(self.input_fd)
self.partial_char = ''
def change_encoding(self, encoding):
@@ -328,7 +381,7 @@
def move_cursor(self, x, y):
if y < self.__offset or y >= self.__offset + self.height:
- self.event_queue.insert(Event('scroll', None))
+ self.keystrokesm.insert(Keystroke('<scroll>', None))
else:
self.__move(x, y)
self.__posxy = x, y
@@ -344,7 +397,7 @@
raw.cflag &=~ (termios.CSIZE|termios.PARENB)
raw.cflag |= (termios.CS8)
raw.lflag &=~ (termios.ICANON|termios.ECHO|
- termios.IEXTEN|(termios.ISIG*1))
+ termios.IEXTEN|(termios.ISIG*0))
raw.cc[termios.VMIN] = 1
raw.cc[termios.VTIME] = 0
tcsetattr(self.input_fd, termios.TCSADRAIN, raw)
@@ -373,40 +426,34 @@
def __sigwinch(self, signum, frame):
self.height, self.width = self.getheightwidth()
- self.event_queue.insert(Event('resize', None))
+ self.keystroke.insert(Keystroke('<resize>', None))
def push_char(self, char):
- self.partial_char += char
- try:
- c = unicode(self.partial_char, self.encoding)
- except UnicodeError, e:
- if len(e.args) > 4 and \
- e.args[4] == 'unexpected end of data':
- pass
- else:
- raise
- else:
- self.partial_char = ''
- self.event_queue.push(c)
+ self.unicodesm.push_and_go(char)
def get_event(self, block=1):
- while self.event_queue.empty():
- while 1: # All hail Unix!
+ while 1:
+ k = self.keystrokesm.get()
+ if k is not None:
+ return k
+ while 1:
try:
- self.push_char(os.read(self.input_fd, 1))
+ c = os.read(self.input_fd, 1)
+ if c:
+ self.push_char(c)
except IOError, err:
if err.errno == errno.EINTR:
- if not self.event_queue.empty():
- return self.event_queue.get()
- else:
- continue
+ k = self.keystrokesm.get()
+ if k is not None:
+ return k
+ continue
else:
raise
else:
break
if not block:
break
- return self.event_queue.get()
+ return self.keystrokesm.get()
def wait(self):
self.pollob.poll()
Modified: pyrepl/branch/pyrepl-rework-n/test/unit/test_commandsm.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/test/unit/test_commandsm.py (original)
+++ pyrepl/branch/pyrepl-rework-n/test/unit/test_commandsm.py Mon Jul 5 17:17:17 2004
@@ -1,4 +1,4 @@
-from pyrepl.dfa.keystrokesm import Keystroke
+from pyrepl.console import Keystroke
from pyrepl.dfa.commandsm import Command, CommandSM
def do_feed(m, data, results):
Modified: pyrepl/branch/pyrepl-rework-n/test/unit/test_keystrokesm.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/test/unit/test_keystrokesm.py (original)
+++ pyrepl/branch/pyrepl-rework-n/test/unit/test_keystrokesm.py Mon Jul 5 17:17:17 2004
@@ -1,4 +1,5 @@
-from pyrepl.dfa.keystrokesm import KeystrokeSM, Keystroke
+from pyrepl.console import Keystroke
+from pyrepl.dfa.keystrokesm import KeystrokeSM
class TestKeys(object):
def translate(self, key):
Modified: pyrepl/branch/pyrepl-rework-n/test/unit/test_statemachines.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/test/unit/test_statemachines.py (original)
+++ pyrepl/branch/pyrepl-rework-n/test/unit/test_statemachines.py Mon Jul 5 17:17:17 2004
@@ -1,6 +1,7 @@
from pyrepl.dfa.unicodesm import UTF8UnicodeSM
-from pyrepl.dfa.keystrokesm import KeystrokeSM, Keystroke
-from pyrepl.dfa.commandsm import CommandSM, Command
+from pyrepl.dfa.keystrokesm import KeystrokeSM
+from pyrepl.dfa.commandsm import CommandSM
+from pyrepl.console import Command, Keystroke
class TestKeys(object):
def translate(self, key):
More information about the pyrepl-checkins
mailing list