From a0b0db40575bb7f7460af010fc20cb6f8d4bbc49 Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Wed, 30 Mar 2011 00:26:30 +0900 Subject: [PATCH 01/19] apply 2to3.py $ python-3.2 2to3.py -w . --- doc/do_sphinx.py | 160 +- eggsetup.py | 2 +- pyreadline/__init__.py | 6 +- pyreadline/clipboard/__init__.py | 32 +- pyreadline/clipboard/ironpython_clipboard.py | 6 +- pyreadline/clipboard/no_clipboard.py | 2 +- pyreadline/clipboard/win32_clipboard.py | 6 +- pyreadline/configuration/startup.py | 2 +- pyreadline/console/__init__.py | 4 +- pyreadline/console/ansi.py | 80 +- pyreadline/console/console.py | 190 +- pyreadline/console/consolebase.py | 12 +- pyreadline/console/event.py | 28 +- pyreadline/console/ironpython_console.py | 162 +- pyreadline/examples/callback_example.py | 16 +- pyreadline/examples/tk_gui.py | 12 +- pyreadline/get_doc.py | 9 +- pyreadline/keysyms/__init__.py | 12 +- pyreadline/keysyms/common.py | 252 +- pyreadline/keysyms/ironpython_keysyms.py | 404 +-- pyreadline/keysyms/keysyms.py | 264 +- pyreadline/lineeditor/history.py | 74 +- pyreadline/lineeditor/lineobj.py | 82 +- pyreadline/lineeditor/wordmatcher.py | 32 +- pyreadline/logger.py | 6 +- pyreadline/logserver.py | 30 +- pyreadline/modes/__init__.py | 2 +- pyreadline/modes/basemode.py | 193 +- pyreadline/modes/emacs.py | 324 +-- pyreadline/modes/notemacs.py | 232 +- pyreadline/modes/vi.py | 2348 ++++++++-------- pyreadline/release.py | 50 +- pyreadline/rlmain.py | 1181 ++++---- pyreadline/test/common.py | 22 +- pyreadline/test/test_emacs.py | 370 +-- pyreadline/test/test_history.py | 54 +- pyreadline/test/test_lineeditor.py | 248 +- pyreadline/test/test_vi.py | 2570 +++++++++--------- pyreadline/unicode_helper.py | 18 +- readline.py | 2 +- setup.py | 2 +- 41 files changed, 4752 insertions(+), 4749 deletions(-) diff --git a/doc/do_sphinx.py b/doc/do_sphinx.py index 6a79b9f..f8a5d10 100644 --- a/doc/do_sphinx.py +++ b/doc/do_sphinx.py @@ -1,80 +1,80 @@ -#!/usr/bin/env python -"""Script to build documentation using Sphinx. -""" - -import fileinput, os, sys - -def oscmd(c): - os.system(c) - -if os.path.isdir("build"): - os.removedirs("build") - -os.makedirs("build/html") -os.makedirs("build/latex") - -# html manual. -oscmd('sphinx-build -d build/doctrees source build/html') - -if sys.platform != 'win32': - # LaTeX format. - oscmd('sphinx-build -b latex -d build/doctrees source build/latex') - - # Produce pdf. - topdir = os.getcwd() - os.chdir('build/latex') - - # Change chapter style to section style: allows chapters to start on - # the current page. Works much better for the short chapters we have. - # This must go in the class file rather than the preamble, so we modify - # manual.cls at runtime. - chapter_cmds=r''' -% Local changes. -\renewcommand\chapter{ - \thispagestyle{plain} - \global\@topnum\z@ - \@afterindentfalse - \secdef\@chapter\@schapter -} -\def\@makechapterhead#1{ - \vspace*{10\p@} - {\raggedright \reset@font \Huge \bfseries \thechapter \quad #1} - \par\nobreak - \hrulefill - \par\nobreak - \vspace*{10\p@} -} -\def\@makeschapterhead#1{ - \vspace*{10\p@} - {\raggedright \reset@font \Huge \bfseries #1} - \par\nobreak - \hrulefill - \par\nobreak - \vspace*{10\p@} -} -''' - - unmodified=True - for line in fileinput.FileInput('manual.cls',inplace=1): - if 'Support for module synopsis' in line and unmodified: - line=chapter_cmds+line - elif 'makechapterhead' in line: - # Already have altered manual.cls: don't need to again. - unmodified=False - print line, - - # Copying the makefile produced by sphinx... - oscmd('pdflatex pyreadline.tex') - oscmd('pdflatex pyreadline.tex') - oscmd('pdflatex pyreadline.tex') - oscmd('makeindex -s python.ist pyreadline.idx') - oscmd('makeindex -s python.ist modpyreadline.idx') - oscmd('pdflatex pyreadline.tex') - oscmd('pdflatex pyreadline.tex') - - # Create a manual/ directory with final html/pdf output -# os.chdir(topdir) -# oscmd('rm -rf manual') -# oscmd('mkdir manual') -# oscmd('cp -r build/html/*.html build/html/_static manual/') -# oscmd('cp build/latex/ipython.pdf manual/') +#!/usr/bin/env python +"""Script to build documentation using Sphinx. +""" + +import fileinput, os, sys + +def oscmd(c): + os.system(c) + +if os.path.isdir("build"): + os.removedirs("build") + +os.makedirs("build/html") +os.makedirs("build/latex") + +# html manual. +oscmd('sphinx-build -d build/doctrees source build/html') + +if sys.platform != 'win32': + # LaTeX format. + oscmd('sphinx-build -b latex -d build/doctrees source build/latex') + + # Produce pdf. + topdir = os.getcwd() + os.chdir('build/latex') + + # Change chapter style to section style: allows chapters to start on + # the current page. Works much better for the short chapters we have. + # This must go in the class file rather than the preamble, so we modify + # manual.cls at runtime. + chapter_cmds=r''' +% Local changes. +\renewcommand\chapter{ + \thispagestyle{plain} + \global\@topnum\z@ + \@afterindentfalse + \secdef\@chapter\@schapter +} +\def\@makechapterhead#1{ + \vspace*{10\p@} + {\raggedright \reset@font \Huge \bfseries \thechapter \quad #1} + \par\nobreak + \hrulefill + \par\nobreak + \vspace*{10\p@} +} +\def\@makeschapterhead#1{ + \vspace*{10\p@} + {\raggedright \reset@font \Huge \bfseries #1} + \par\nobreak + \hrulefill + \par\nobreak + \vspace*{10\p@} +} +''' + + unmodified=True + for line in fileinput.FileInput('manual.cls',inplace=1): + if 'Support for module synopsis' in line and unmodified: + line=chapter_cmds+line + elif 'makechapterhead' in line: + # Already have altered manual.cls: don't need to again. + unmodified=False + print(line, end=' ') + + # Copying the makefile produced by sphinx... + oscmd('pdflatex pyreadline.tex') + oscmd('pdflatex pyreadline.tex') + oscmd('pdflatex pyreadline.tex') + oscmd('makeindex -s python.ist pyreadline.idx') + oscmd('makeindex -s python.ist modpyreadline.idx') + oscmd('pdflatex pyreadline.tex') + oscmd('pdflatex pyreadline.tex') + + # Create a manual/ directory with final html/pdf output +# os.chdir(topdir) +# oscmd('rm -rf manual') +# oscmd('mkdir manual') +# oscmd('cp -r build/html/*.html build/html/_static manual/') +# oscmd('cp build/latex/ipython.pdf manual/') diff --git a/eggsetup.py b/eggsetup.py index b5bcf75..7661d85 100644 --- a/eggsetup.py +++ b/eggsetup.py @@ -8,7 +8,7 @@ #***************************************************************************** import glob from setuptools import setup,find_packages -execfile('pyreadline/release.py') +exec(compile(open('pyreadline/release.py').read(), 'pyreadline/release.py', 'exec')) setup(name=name, version = version, diff --git a/pyreadline/__init__.py b/pyreadline/__init__.py index 7a50e1c..6e8417e 100644 --- a/pyreadline/__init__.py +++ b/pyreadline/__init__.py @@ -6,6 +6,6 @@ # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #***************************************************************************** -import unicode_helper, logger, clipboard, lineeditor, modes, console -from rlmain import * -import rlmain +from . import unicode_helper, logger, clipboard, lineeditor, modes, console +from .rlmain import * +from . import rlmain diff --git a/pyreadline/clipboard/__init__.py b/pyreadline/clipboard/__init__.py index ec9fff2..e22b1be 100644 --- a/pyreadline/clipboard/__init__.py +++ b/pyreadline/clipboard/__init__.py @@ -1,17 +1,17 @@ import sys success = True -in_ironpython = u"IronPython" in sys.version +in_ironpython = "IronPython" in sys.version if in_ironpython: try: - from ironpython_clipboard import GetClipboardText, SetClipboardText + from .ironpython_clipboard import GetClipboardText, SetClipboardText except ImportError: - from no_clipboard import GetClipboardText, SetClipboardText + from .no_clipboard import GetClipboardText, SetClipboardText else: try: - from win32_clipboard import GetClipboardText, SetClipboardText + from .win32_clipboard import GetClipboardText, SetClipboardText except ImportError: - from no_clipboard import GetClipboardText, SetClipboardText + from .no_clipboard import GetClipboardText, SetClipboardText def send_data(lists): @@ -22,15 +22,15 @@ def set_clipboard_text(toclipboard): SetClipboardText(str(toclipboard)) def make_tab(lists): - if hasattr(lists, u"tolist"): + if hasattr(lists, "tolist"): lists = lists.tolist() ut = [] for rad in lists: if type(rad) in [list, tuple]: - ut.append(u"\t".join([u"%s"%x for x in rad])) + ut.append("\t".join(["%s"%x for x in rad])) else: - ut.append(u"%s"%rad) - return u"\n".join(ut) + ut.append("%s"%rad) + return "\n".join(ut) def make_list_of_list(txt): def make_num(x): @@ -47,26 +47,26 @@ def make_list_of_list(txt): return x ut = [] flag = False - for rad in [x for x in txt.split(u"\r\n") if x != u""]: - raden=[make_num(x) for x in rad.split(u"\t")] - if str in map(type,raden): + for rad in [x for x in txt.split("\r\n") if x != ""]: + raden=[make_num(x) for x in rad.split("\t")] + if str in list(map(type,raden)): flag = True ut.append(raden) return ut, flag def get_clipboard_text_and_convert(paste_list=False): - u"""Get txt from clipboard. if paste_list==True the convert tab separated + """Get txt from clipboard. if paste_list==True the convert tab separated data to list of lists. Enclose list of list in array() if all elements are numeric""" txt = GetClipboardText() if txt: - if paste_list and u"\t" in txt: + if paste_list and "\t" in txt: array, flag = make_list_of_list(txt) if flag: txt = repr(array) else: - txt = u"array(%s)"%repr(array) - txt = u"".join([c for c in txt if c not in u" \t\r\n"]) + txt = "array(%s)"%repr(array) + txt = "".join([c for c in txt if c not in " \t\r\n"]) return txt diff --git a/pyreadline/clipboard/ironpython_clipboard.py b/pyreadline/clipboard/ironpython_clipboard.py index 10187d4..83789c2 100644 --- a/pyreadline/clipboard/ironpython_clipboard.py +++ b/pyreadline/clipboard/ironpython_clipboard.py @@ -6,7 +6,7 @@ # the file COPYING, distributed as part of this software. #***************************************************************************** import clr -clr.AddReferenceByPartialName(u"System.Windows.Forms") +clr.AddReferenceByPartialName("System.Windows.Forms") import System.Windows.Forms.Clipboard as cb def GetClipboardText(): @@ -19,9 +19,9 @@ def GetClipboardText(): def SetClipboardText(text): cb.SetText(text) -if __name__ == u'__main__': +if __name__ == '__main__': txt = GetClipboardText() # display last text clipped - print txt + print(txt) diff --git a/pyreadline/clipboard/no_clipboard.py b/pyreadline/clipboard/no_clipboard.py index 195b0ad..9c61e1d 100644 --- a/pyreadline/clipboard/no_clipboard.py +++ b/pyreadline/clipboard/no_clipboard.py @@ -7,7 +7,7 @@ #***************************************************************************** -mybuffer = u"" +mybuffer = "" def GetClipboardText(): return mybuffer diff --git a/pyreadline/clipboard/win32_clipboard.py b/pyreadline/clipboard/win32_clipboard.py index c0f4ef4..c60416e 100644 --- a/pyreadline/clipboard/win32_clipboard.py +++ b/pyreadline/clipboard/win32_clipboard.py @@ -80,7 +80,7 @@ def getformatname(format): return buffer.value def GetClipboardText(): - text = u"" + text = "" if OpenClipboard(0): hClipMem = GetClipboardData(CF_TEXT) if hClipMem: @@ -103,6 +103,6 @@ def SetClipboardText(text): SetClipboardData(c_int(CF_TEXT), c_int(hGlobalMem)) CloseClipboard() -if __name__ == u'__main__': +if __name__ == '__main__': txt = GetClipboardText() # display last text clipped - print txt + print(txt) diff --git a/pyreadline/configuration/startup.py b/pyreadline/configuration/startup.py index acda5e9..1a1ae12 100644 --- a/pyreadline/configuration/startup.py +++ b/pyreadline/configuration/startup.py @@ -11,7 +11,7 @@ try: #if you need to change this uncomment the following line #pyreadline.unicode_helper.pyreadline_codepage="utf8" except ImportError: - print "Module readline not available." + print("Module readline not available.") else: #import tab completion functionality import rlcompleter diff --git a/pyreadline/console/__init__.py b/pyreadline/console/__init__.py index 805fb95..d85a093 100644 --- a/pyreadline/console/__init__.py +++ b/pyreadline/console/__init__.py @@ -5,13 +5,13 @@ in_ironpython = "IronPython" in sys.version if in_ironpython: try: - from ironpython_console import * + from .ironpython_console import * success = True except ImportError: raise else: try: - from console import * + from .console import * success = True except ImportError: pass diff --git a/pyreadline/console/ansi.py b/pyreadline/console/ansi.py index 13fd8dc..7e98c40 100644 --- a/pyreadline/console/ansi.py +++ b/pyreadline/console/ansi.py @@ -1,21 +1,21 @@ # -*- coding: ISO-8859-1 -*- import re,sys,os -terminal_escape = re.compile(u'(\001?\033\\[[0-9;]*m\002?)') -escape_parts = re.compile(u'\001?\033\\[([0-9;]*)m\002?') +terminal_escape = re.compile('(\001?\033\\[[0-9;]*m\002?)') +escape_parts = re.compile('\001?\033\\[([0-9;]*)m\002?') class AnsiState(object): - def __init__(self,bold=False,inverse=False,color=u"white",background=u"black",backgroundbold=False): + def __init__(self,bold=False,inverse=False,color="white",background="black",backgroundbold=False): self.bold = bold self.inverse = inverse self.color = color self.background = background self.backgroundbold = backgroundbold - trtable = {u"black":0, u"red":4, u"green":2, u"yellow":6, - u"blue":1, u"magenta":5, u"cyan":3, u"white":7} - revtable = dict(zip(trtable.values(),trtable.keys())) + trtable = {"black":0, "red":4, "green":2, "yellow":6, + "blue":1, "magenta":5, "cyan":3, "white":7} + revtable = dict(list(zip(list(trtable.values()),list(trtable.keys())))) def get_winattr(self): attr = 0 if self.bold: @@ -37,8 +37,8 @@ class AnsiState(object): winattr=property(get_winattr,set_winattr) def __repr__(self): - return u'AnsiState(bold=%s,inverse=%s,color=%9s,' \ - u'background=%9s,backgroundbold=%s)# 0x%x'% \ + return 'AnsiState(bold=%s,inverse=%s,color=%9s,' \ + 'background=%9s,backgroundbold=%s)# 0x%x'% \ (self.bold, self.inverse, '"%s"'%self.color, '"%s"'%self.background, self.backgroundbold, self.winattr) @@ -52,10 +52,10 @@ class AnsiState(object): x.backgroundbold = self.backgroundbold return x -defaultstate = AnsiState(False,False,u"white") +defaultstate = AnsiState(False,False,"white") -trtable = {0:u"black", 1:u"red", 2:u"green", 3:u"yellow", - 4:u"blue", 5:u"magenta", 6:u"cyan", 7:u"white"} +trtable = {0:"black", 1:"red", 2:"green", 3:"yellow", + 4:"blue", 5:"magenta", 6:"cyan", 7:"white"} class AnsiWriter(object): def __init__(self, default=defaultstate): @@ -67,7 +67,7 @@ class AnsiWriter(object): def write_color(self,text, attr=None): - u'''write text at current cursor position and interpret color escapes. + '''write text at current cursor position and interpret color escapes. return the number of characters written. ''' @@ -85,21 +85,21 @@ class AnsiWriter(object): for chunk in chunks: m = escape_parts.match(chunk) if m: - parts = m.group(1).split(u";") - if len(parts) == 1 and parts[0] == u"0": + parts = m.group(1).split(";") + if len(parts) == 1 and parts[0] == "0": attr = self.defaultstate.copy() continue for part in parts: - if part == u"0": # No text attribute + if part == "0": # No text attribute attr = self.defaultstate.copy() attr.bold=False - elif part == u"7": # switch on reverse + elif part == "7": # switch on reverse attr.inverse=True - elif part == u"1": # switch on bold (i.e. intensify foreground color) + elif part == "1": # switch on bold (i.e. intensify foreground color) attr.bold=True - elif len(part) == 2 and u"30" <= part <= u"37": # set foreground color + elif len(part) == 2 and "30" <= part <= "37": # set foreground color attr.color = trtable[int(part) - 30] - elif len(part) == 2 and u"40" <= part <= u"47": # set background color + elif len(part) == 2 and "40" <= part <= "47": # set background color attr.backgroundcolor = trtable[int(part) - 40] continue n += len(chunk) @@ -116,7 +116,7 @@ def write_color(text, attr=None): return a.write_color(text, attr) def write_color_old( text, attr=None): - u'''write text at current cursor position and interpret color escapes. + '''write text at current cursor position and interpret color escapes. return the number of characters written. ''' @@ -128,18 +128,18 @@ def write_color_old( text, attr=None): for chunk in chunks: m = escape_parts.match(chunk) if m: - for part in m.group(1).split(u";"): - if part == u"0": # No text attribute + for part in m.group(1).split(";"): + if part == "0": # No text attribute attr = 0 - elif part == u"7": # switch on reverse + elif part == "7": # switch on reverse attr |= 0x4000 - if part == u"1": # switch on bold (i.e. intensify foreground color) + if part == "1": # switch on bold (i.e. intensify foreground color) attr |= 0x08 - elif len(part) == 2 and u"30" <= part <= u"37": # set foreground color + elif len(part) == 2 and "30" <= part <= "37": # set foreground color part = int(part)-30 # we have to mirror bits attr = (attr & ~0x07) | ((part & 0x1) << 2) | (part & 0x2) | ((part & 0x4) >> 2) - elif len(part) == 2 and u"40" <= part <= u"47": # set background color + elif len(part) == 2 and "40" <= part <= "47": # set background color part = int(part) - 40 # we have to mirror bits attr = (attr & ~0x70) | ((part & 0x1) << 6) | ((part & 0x2) << 4) | ((part & 0x4) << 2) @@ -147,44 +147,44 @@ def write_color_old( text, attr=None): continue n += len(chunk) if chunk: - res.append((u"0x%x"%attr, chunk)) + res.append(("0x%x"%attr, chunk)) return res #trtable={0:"black",1:"red",2:"green",3:"yellow",4:"blue",5:"magenta",6:"cyan",7:"white"} -if __name__==u"__main__x": +if __name__=="__main__x": import pprint pprint=pprint.pprint - s=u"\033[0;31mred\033[0;32mgreen\033[0;33myellow\033[0;34mblue\033[0;35mmagenta\033[0;36mcyan\033[0;37mwhite\033[0m" + s="\033[0;31mred\033[0;32mgreen\033[0;33myellow\033[0;34mblue\033[0;35mmagenta\033[0;36mcyan\033[0;37mwhite\033[0m" pprint (write_color(s)) pprint (write_color_old(s)) - s=u"\033[1;31mred\033[1;32mgreen\033[1;33myellow\033[1;34mblue\033[1;35mmagenta\033[1;36mcyan\033[1;37mwhite\033[0m" + s="\033[1;31mred\033[1;32mgreen\033[1;33myellow\033[1;34mblue\033[1;35mmagenta\033[1;36mcyan\033[1;37mwhite\033[0m" pprint (write_color(s)) pprint (write_color_old(s)) - s=u"\033[0;7;31mred\033[0;7;32mgreen\033[0;7;33myellow\033[0;7;34mblue\033[0;7;35mmagenta\033[0;7;36mcyan\033[0;7;37mwhite\033[0m" + s="\033[0;7;31mred\033[0;7;32mgreen\033[0;7;33myellow\033[0;7;34mblue\033[0;7;35mmagenta\033[0;7;36mcyan\033[0;7;37mwhite\033[0m" pprint (write_color(s)) pprint (write_color_old(s)) - s=u"\033[1;7;31mred\033[1;7;32mgreen\033[1;7;33myellow\033[1;7;34mblue\033[1;7;35mmagenta\033[1;7;36mcyan\033[1;7;37mwhite\033[0m" + s="\033[1;7;31mred\033[1;7;32mgreen\033[1;7;33myellow\033[1;7;34mblue\033[1;7;35mmagenta\033[1;7;36mcyan\033[1;7;37mwhite\033[0m" pprint (write_color(s)) pprint (write_color_old(s)) -if __name__==u"__main__": - import console +if __name__=="__main__": + from . import console import pprint pprint=pprint.pprint c=console.Console() - c.write_color(u"dhsjdhs") - c.write_color(u"\033[0;32mIn [\033[1;32m1\033[0;32m]:") - print - pprint (write_color(u"\033[0;32mIn [\033[1;32m1\033[0;32m]:")) + c.write_color("dhsjdhs") + c.write_color("\033[0;32mIn [\033[1;32m1\033[0;32m]:") + print() + pprint (write_color("\033[0;32mIn [\033[1;32m1\033[0;32m]:")) -if __name__==u"__main__x": +if __name__=="__main__x": import pprint pprint=pprint.pprint - s=u"\033[0;31mred\033[0;32mgreen\033[0;33myellow\033[0;34mblue\033[0;35mmagenta\033[0;36mcyan\033[0;37mwhite\033[0m" + s="\033[0;31mred\033[0;32mgreen\033[0;33myellow\033[0;34mblue\033[0;35mmagenta\033[0;36mcyan\033[0;37mwhite\033[0m" pprint (write_color(s)) diff --git a/pyreadline/console/console.py b/pyreadline/console/console.py index 2204003..e2d9a1f 100644 --- a/pyreadline/console/console.py +++ b/pyreadline/console/console.py @@ -6,7 +6,7 @@ # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #***************************************************************************** -u'''Cursor control and color for the Windows console. +'''Cursor control and color for the Windows console. This was modeled after the C extension of the same name by Fredrik Lundh. ''' @@ -28,7 +28,7 @@ try: from ctypes import * from _ctypes import call_function except ImportError: - raise ImportError(u"You need ctypes to run this code") + raise ImportError("You need ctypes to run this code") def nolog(string): pass @@ -54,7 +54,7 @@ MENU_EVENT = 0x0008 VK_SHIFT = 0x10 VK_CONTROL = 0x11 VK_MENU = 0x12 -GENERIC_READ = int(0x80000000L) +GENERIC_READ = int(0x80000000) GENERIC_WRITE = 0x40000000 # Windows structures we'll need later @@ -168,12 +168,12 @@ def split_block(text, size=1000): class Console(object): - u'''Console driver for Windows. + '''Console driver for Windows. ''' def __init__(self, newbuffer=0): - u'''Initialize the Console object. + '''Initialize the Console object. newbuffer=1 will allocate a new buffer so the old content will be restored on exit. @@ -208,18 +208,18 @@ class Console(object): for escape in self.escape_to_color: if self.escape_to_color[escape] is not None: self.escape_to_color[escape] |= background - log(u'initial attr=%x' % self.attr) + log('initial attr=%x' % self.attr) self.softspace = 0 # this is for using it as a file-like object self.serial = 0 self.pythondll = \ - CDLL(u'python%s%s' % (sys.version[0], sys.version[2])) + CDLL('python%s%s' % (sys.version[0], sys.version[2])) self.inputHookPtr = \ c_int.from_address(addressof(self.pythondll.PyOS_InputHook)).value - setattr(Console, u'PyMem_Malloc', self.pythondll.PyMem_Malloc) + setattr(Console, 'PyMem_Malloc', self.pythondll.PyMem_Malloc) def __del__(self): - u'''Cleanup the console when finished.''' + '''Cleanup the console when finished.''' # I don't think this ever gets called self.SetConsoleTextAttribute(self.hout, self.saveattr) self.SetConsoleMode(self.hin, self.inmode) @@ -234,7 +234,7 @@ class Console(object): return top,bot def fixcoord(self, x, y): - u'''Return a long with x and y packed inside, + '''Return a long with x and y packed inside, also handle negative x and y.''' if x < 0 or y < 0: info = CONSOLE_SCREEN_BUFFER_INFO() @@ -248,7 +248,7 @@ class Console(object): return c_int(y << 16 | x) def pos(self, x=None, y=None): - u'''Move or query the window cursor.''' + '''Move or query the window cursor.''' if x is None: info = CONSOLE_SCREEN_BUFFER_INFO() self.GetConsoleScreenBufferInfo(self.hout, byref(info)) @@ -258,38 +258,38 @@ class Console(object): self.fixcoord(x, y)) def home(self): - u'''Move to home.''' + '''Move to home.''' self.pos(0, 0) # Map ANSI color escape sequences into Windows Console Attributes - terminal_escape = re.compile(u'(\001?\033\\[[0-9;]+m\002?)') - escape_parts = re.compile(u'\001?\033\\[([0-9;]+)m\002?') - escape_to_color = { u'0;30': 0x0, #black - u'0;31': 0x4, #red - u'0;32': 0x2, #green - u'0;33': 0x4+0x2, #brown? - u'0;34': 0x1, #blue - u'0;35': 0x1+0x4, #purple - u'0;36': 0x2+0x4, #cyan - u'0;37': 0x1+0x2+0x4, #grey - u'1;30': 0x1+0x2+0x4, #dark gray - u'1;31': 0x4+0x8, #red - u'1;32': 0x2+0x8, #light green - u'1;33': 0x4+0x2+0x8, #yellow - u'1;34': 0x1+0x8, #light blue - u'1;35': 0x1+0x4+0x8, #light purple - u'1;36': 0x1+0x2+0x8, #light cyan - u'1;37': 0x1+0x2+0x4+0x8, #white - u'0': None, + terminal_escape = re.compile('(\001?\033\\[[0-9;]+m\002?)') + escape_parts = re.compile('\001?\033\\[([0-9;]+)m\002?') + escape_to_color = { '0;30': 0x0, #black + '0;31': 0x4, #red + '0;32': 0x2, #green + '0;33': 0x4+0x2, #brown? + '0;34': 0x1, #blue + '0;35': 0x1+0x4, #purple + '0;36': 0x2+0x4, #cyan + '0;37': 0x1+0x2+0x4, #grey + '1;30': 0x1+0x2+0x4, #dark gray + '1;31': 0x4+0x8, #red + '1;32': 0x2+0x8, #light green + '1;33': 0x4+0x2+0x8, #yellow + '1;34': 0x1+0x8, #light blue + '1;35': 0x1+0x4+0x8, #light purple + '1;36': 0x1+0x2+0x8, #light cyan + '1;37': 0x1+0x2+0x4+0x8, #white + '0': None, } # This pattern should match all characters that change the cursor position differently # than a normal character. - motion_char_re = re.compile(u'([\n\r\t\010\007])') + motion_char_re = re.compile('([\n\r\t\010\007])') def write_scrolling(self, text, attr=None): - u'''write text at current cursor position while watching for scrolling. + '''write text at current cursor position while watching for scrolling. If the window scrolls because you are at the bottom of the screen buffer, all positions that you are storing will be shifted by the @@ -310,19 +310,19 @@ class Console(object): for chunk in chunks: n = self.write_color(chunk, attr) if len(chunk) == 1: # the funny characters will be alone - if chunk[0] == u'\n': # newline + if chunk[0] == '\n': # newline x = 0 y += 1 - elif chunk[0] == u'\r': # carriage return + elif chunk[0] == '\r': # carriage return x = 0 - elif chunk[0] == u'\t': # tab + elif chunk[0] == '\t': # tab x = 8 * (int(x / 8) + 1) if x > w: # newline x -= w y += 1 - elif chunk[0] == u'\007': # bell + elif chunk[0] == '\007': # bell pass - elif chunk[0] == u'\010': + elif chunk[0] == '\010': x -= 1 if x < 0: y -= 1 # backed up 1 line @@ -349,8 +349,8 @@ class Console(object): n, res= self.ansiwriter.write_color(text, attr) junk = c_int(0) for attr,chunk in res: - log(u"console.attr:%s"%unicode(attr)) - log(u"console.chunk:%s"%unicode(chunk)) + log("console.attr:%s"%str(attr)) + log("console.chunk:%s"%str(chunk)) self.SetConsoleTextAttribute(self.hout, attr.winattr) for short_chunk in split_block(chunk): self.WriteConsoleW(self.hout, short_chunk, @@ -358,9 +358,9 @@ class Console(object): return n def write_plain(self, text, attr=None): - u'''write text at current cursor position.''' + '''write text at current cursor position.''' text = ensure_unicode(text) - log(u'write("%s", %s)' %(text, attr)) + log('write("%s", %s)' %(text, attr)) if attr is None: attr = self.attr n = c_int(0) @@ -372,7 +372,7 @@ class Console(object): #This function must be used to ensure functioning with EMACS #Emacs sets the EMACS environment variable - if os.environ.has_key(u"EMACS"): + if "EMACS" in os.environ: def write_color(self, text, attr=None): text = ensure_str(text) junk = c_int(0) @@ -383,7 +383,7 @@ class Console(object): # make this class look like a file object def write(self, text): text = ensure_unicode(text) - log(u'write("%s")' % text) + log('write("%s")' % text) return self.write_color(text) #write = write_scrolling @@ -394,8 +394,8 @@ class Console(object): def flush(self): pass - def page(self, attr=None, fill=u' '): - u'''Fill the entire screen.''' + def page(self, attr=None, fill=' '): + '''Fill the entire screen.''' if attr is None: attr = self.attr if len(fill) != 1: @@ -416,7 +416,7 @@ class Console(object): self.attr = attr def text(self, x, y, text, attr=None): - u'''Write text at the given position.''' + '''Write text at the given position.''' if attr is None: attr = self.attr @@ -434,8 +434,8 @@ class Console(object): if pos[1] < bot: self.rectangle((0, pos[1] + 1, w, bot + 1)) - def rectangle(self, rect, attr=None, fill=u' '): - u'''Fill Rectangle.''' + def rectangle(self, rect, attr=None, fill=' '): + '''Fill Rectangle.''' x0, y0, x1, y1 = rect n = c_int(0) if attr is None: @@ -448,7 +448,7 @@ class Console(object): pos, byref(n)) def scroll(self, rect, dx, dy, attr=None, fill=' '): - u'''Scroll a rectangle.''' + '''Scroll a rectangle.''' if attr is None: attr = self.attr x0, y0, x1, y1 = rect @@ -462,11 +462,11 @@ class Console(object): byref(source), dest, byref(style)) def scroll_window(self, lines): - u'''Scroll the window by the indicated number of lines.''' + '''Scroll the window by the indicated number of lines.''' info = CONSOLE_SCREEN_BUFFER_INFO() self.GetConsoleScreenBufferInfo(self.hout, byref(info)) rect = info.srWindow - log(u'sw: rtop=%d rbot=%d' % (rect.Top, rect.Bottom)) + log('sw: rtop=%d rbot=%d' % (rect.Top, rect.Bottom)) top = rect.Top + lines bot = rect.Bottom + lines h = bot - top @@ -483,12 +483,12 @@ class Console(object): nrect.Bottom = bot nrect.Left = rect.Left nrect.Right = rect.Right - log(u'sn: top=%d bot=%d' % (top, bot)) + log('sn: top=%d bot=%d' % (top, bot)) r=self.SetConsoleWindowInfo(self.hout, True, byref(nrect)) - log(u'r=%d' % r) + log('r=%d' % r) def get(self): - u'''Get next event from queue.''' + '''Get next event from queue.''' inputHookFunc = c_int.from_address(self.inputHookPtr).value Cevent = INPUT_RECORD() @@ -503,25 +503,25 @@ class Console(object): return e def getkeypress(self): - u'''Return next key press event from the queue, ignoring others.''' + '''Return next key press event from the queue, ignoring others.''' while 1: e = self.get() - if e.type == u'KeyPress' and e.keycode not in key_modifiers: - log(u"console.getkeypress %s"%e) - if e.keyinfo.keyname == u'next': + if e.type == 'KeyPress' and e.keycode not in key_modifiers: + log("console.getkeypress %s"%e) + if e.keyinfo.keyname == 'next': self.scroll_window(12) - elif e.keyinfo.keyname == u'prior': + elif e.keyinfo.keyname == 'prior': self.scroll_window(-12) else: return e - elif ((e.type == u'KeyRelease') and + elif ((e.type == 'KeyRelease') and (e.keyinfo == KeyPress('S', False, True, False, 'S'))): - log(u"getKeypress:%s,%s,%s"%(e.keyinfo, e.keycode, e.type)) + log("getKeypress:%s,%s,%s"%(e.keyinfo, e.keycode, e.type)) return e def getchar(self): - u'''Get next character from queue.''' + '''Get next character from queue.''' Cevent = INPUT_RECORD() count = c_int(0) @@ -538,7 +538,7 @@ class Console(object): return sym def peek(self): - u'''Check event queue.''' + '''Check event queue.''' Cevent = INPUT_RECORD() count = c_int(0) status = self.PeekConsoleInputW(self.hin, @@ -547,7 +547,7 @@ class Console(object): return event(self, Cevent) def title(self, txt=None): - u'''Set/get title.''' + '''Set/get title.''' if txt: self.SetConsoleTitleW(txt) else: @@ -557,7 +557,7 @@ class Console(object): return buffer.value[:n] def size(self, width=None, height=None): - u'''Set/get window size.''' + '''Set/get window size.''' info = CONSOLE_SCREEN_BUFFER_INFO() status = self.GetConsoleScreenBufferInfo(self.hout, byref(info)) if not status: @@ -575,7 +575,7 @@ class Console(object): return (info.dwSize.X, info.dwSize.Y) def cursor(self, visible=None, size=None): - u'''Set cursor on or off.''' + '''Set cursor on or off.''' info = CONSOLE_CURSOR_INFO() if self.GetConsoleCursorInfo(self.hout, byref(info)): if visible is not None: @@ -585,10 +585,10 @@ class Console(object): self.SetConsoleCursorInfo(self.hout, byref(info)) def bell(self): - self.write(u'\007') + self.write('\007') def next_serial(self): - u'''Get next event serial number.''' + '''Get next event serial number.''' self.serial += 1 return self.serial @@ -598,32 +598,32 @@ for func in funcs: windll.kernel32.SetConsoleTitleW.argtypes = [c_wchar_p] windll.kernel32.GetConsoleTitleW.argtypes = [c_wchar_p,c_short] -from event import Event +from .event import Event VkKeyScan = windll.user32.VkKeyScanA class event(Event): - u'''Represent events from the console.''' + '''Represent events from the console.''' def __init__(self, console, input): '''Initialize an event from the Windows input structure.''' - self.type = u'??' + self.type = '??' self.serial = console.next_serial() self.width = 0 self.height = 0 self.x = 0 self.y = 0 - self.char = u'' + self.char = '' self.keycode = 0 - self.keysym = u'??' + self.keysym = '??' self.keyinfo = None # a tuple with (control, meta, shift, keycode) for dispatch self.width = None if input.EventType == KEY_EVENT: if input.Event.KeyEvent.bKeyDown: - self.type = u"KeyPress" + self.type = "KeyPress" else: - self.type = u"KeyRelease" + self.type = "KeyRelease" self.char = input.Event.KeyEvent.uChar.UnicodeChar self.keycode = input.Event.KeyEvent.wVirtualKeyCode self.state = input.Event.KeyEvent.dwControlKeyState @@ -631,23 +631,23 @@ class event(Event): elif input.EventType == MOUSE_EVENT: if input.Event.MouseEvent.dwEventFlags & MOUSE_MOVED: - self.type = u"Motion" + self.type = "Motion" else: - self.type = u"Button" + self.type = "Button" self.x = input.Event.MouseEvent.dwMousePosition.X self.y = input.Event.MouseEvent.dwMousePosition.Y self.state = input.Event.MouseEvent.dwButtonState elif input.EventType == WINDOW_BUFFER_SIZE_EVENT: - self.type = u"Configure" + self.type = "Configure" self.width = input.Event.WindowBufferSizeEvent.dwSize.X self.height = input.Event.WindowBufferSizeEvent.dwSize.Y elif input.EventType == FOCUS_EVENT: if input.Event.FocusEvent.bSetFocus: - self.type = u"FocusIn" + self.type = "FocusIn" else: - self.type = u"FocusOut" + self.type = "FocusOut" elif input.EventType == MENU_EVENT: - self.type = u"Menu" + self.type = "Menu" self.state = input.Event.MenuEvent.dwCommandId @@ -685,23 +685,23 @@ readline_hook = None # the python hook goes here readline_ref = None # reference to the c-callable to keep it alive def hook_wrapper_23(stdin, stdout, prompt): - u'''Wrap a Python readline so it behaves like GNU readline.''' + '''Wrap a Python readline so it behaves like GNU readline.''' try: # call the Python hook res = ensure_str(readline_hook(prompt)) # make sure it returned the right sort of thing if res and not isinstance(res, str): - raise TypeError, u'readline must return a string.' + raise TypeError('readline must return a string.') except KeyboardInterrupt: # GNU readline returns 0 on keyboard interrupt return 0 except EOFError: # It returns an empty string on EOF - res = u'' + res = '' except: - print >>sys.stderr, u'Readline internal error' + print('Readline internal error', file=sys.stderr) traceback.print_exc() - res = u'\n' + res = '\n' # we have to make a copy because the caller expects to free the result n = len(res) p = Console.PyMem_Malloc(n + 1) @@ -709,23 +709,23 @@ def hook_wrapper_23(stdin, stdout, prompt): return p def hook_wrapper(prompt): - u'''Wrap a Python readline so it behaves like GNU readline.''' + '''Wrap a Python readline so it behaves like GNU readline.''' try: # call the Python hook res = ensure_str(readline_hook(prompt)) # make sure it returned the right sort of thing if res and not isinstance(res, str): - raise TypeError, u'readline must return a string.' + raise TypeError('readline must return a string.') except KeyboardInterrupt: # GNU readline returns 0 on keyboard interrupt return 0 except EOFError: # It returns an empty string on EOF - res = u'' + res = '' except: - print >>sys.stderr, u'Readline internal error' + print('Readline internal error', file=sys.stderr) traceback.print_exc() - res = u'\n' + res = '\n' # we have to make a copy because the caller expects to free the result p = cdll.msvcrt._strdup(res) return p @@ -760,11 +760,11 @@ if __name__ == '__main__': sys.stdout = c sys.stderr = c c.page() - print p("d"), p("D") + print(p("d"), p("D")) c.pos(5, 10) c.write('hi there') - print 'some printed output' + print('some printed output') for i in range(10): q = c.getkeypress() - print q + print(q) del c diff --git a/pyreadline/console/consolebase.py b/pyreadline/console/consolebase.py index d15350e..3409ced 100644 --- a/pyreadline/console/consolebase.py +++ b/pyreadline/console/consolebase.py @@ -6,18 +6,18 @@ class baseconsole: raise NotImplementedError def pos(self, x=None, y=None): - u'''Move or query the window cursor.''' + '''Move or query the window cursor.''' raise NotImplementedError def size(self): raise NotImplementedError - def rectangle(self, rect, attr=None, fill=u' '): - u'''Fill Rectangle.''' + def rectangle(self, rect, attr=None, fill=' '): + '''Fill Rectangle.''' raise NotImplementedError def write_scrolling(self, text, attr=None): - u'''write text at current cursor position while watching for scrolling. + '''write text at current cursor position while watching for scrolling. If the window scrolls because you are at the bottom of the screen buffer, all positions that you are storing will be shifted by the @@ -33,14 +33,14 @@ class baseconsole: raise NotImplementedError def getkeypress(self): - u'''Return next key press event from the queue, ignoring others.''' + '''Return next key press event from the queue, ignoring others.''' raise NotImplementedError def write(self, text): raise NotImplementedError def page(self, attr=None, fill=' '): - u'''Fill the entire screen.''' + '''Fill the entire screen.''' raise NotImplementedError def isatty(self): diff --git a/pyreadline/console/event.py b/pyreadline/console/event.py index c03e503..2207e29 100644 --- a/pyreadline/console/event.py +++ b/pyreadline/console/event.py @@ -1,27 +1,27 @@ class Event(object): - u'''Represent events from the console.''' + '''Represent events from the console.''' def __init__(self, console, input): pass def __repr__(self): - u'''Display an event for debugging.''' - if self.type in [u'KeyPress', u'KeyRelease']: + '''Display an event for debugging.''' + if self.type in ['KeyPress', 'KeyRelease']: chr = self.char - if ord(chr) w: # newline x -= w y += 1 - elif chunk[0] == u'\007': # bell + elif chunk[0] == '\007': # bell pass - elif chunk[0] == u'\010': + elif chunk[0] == '\010': x -= 1 if x < 0: y -= 1 # backed up 1 line @@ -197,9 +197,9 @@ class Console(object): return the number of characters written. ''' - log(u'write_color("%s", %s)' % (text, attr)) + log('write_color("%s", %s)' % (text, attr)) chunks = self.terminal_escape.split(text) - log(u'chunks=%s' % repr(chunks)) + log('chunks=%s' % repr(chunks)) bg = self.savebg n = 0 # count the characters we actually write, omitting the escapes if attr is None:#use attribute from initial console @@ -222,8 +222,8 @@ class Console(object): return n def write_plain(self, text, attr=None): - u'''write text at current cursor position.''' - log(u'write("%s", %s)' %(text, attr)) + '''write text at current cursor position.''' + log('write("%s", %s)' %(text, attr)) if attr is None: attr = self.attr n = c_int(0) @@ -231,7 +231,7 @@ class Console(object): self.WriteConsoleA(self.hout, text, len(text), byref(n), None) return len(text) - if os.environ.has_key(u"EMACS"): + if "EMACS" in os.environ: def write_color(self, text, attr=None): junk = c_int(0) self.WriteFile(self.hout, text, len(text), byref(junk), None) @@ -240,7 +240,7 @@ class Console(object): # make this class look like a file object def write(self, text): - log(u'write("%s")' % text) + log('write("%s")' % text) return self.write_color(text) #write = write_scrolling @@ -251,12 +251,12 @@ class Console(object): def flush(self): pass - def page(self, attr=None, fill=u' '): - u'''Fill the entire screen.''' + def page(self, attr=None, fill=' '): + '''Fill the entire screen.''' System.Console.Clear() def text(self, x, y, text, attr=None): - u'''Write text at the given position.''' + '''Write text at the given position.''' self.pos(x, y) self.write_color(text, attr) @@ -266,12 +266,12 @@ class Console(object): pos = self.pos() w, h = self.size() length = w - pos[0] + min((lastline - pos[1] - 1), 5) * w - 1 - self.write_color(length * u" ") + self.write_color(length * " ") self.pos(*pos) self.WindowTop = oldtop - def rectangle(self, rect, attr=None, fill=u' '): - u'''Fill Rectangle.''' + def rectangle(self, rect, attr=None, fill=' '): + '''Fill Rectangle.''' oldtop = self.WindowTop oldpos = self.pos() #raise NotImplementedError @@ -281,18 +281,18 @@ class Console(object): if fill: rowfill = fill[:1] * abs(x1 - x0) else: - rowfill = u' ' * abs(x1 - x0) + rowfill = ' ' * abs(x1 - x0) for y in range(y0, y1): System.Console.SetCursorPosition(x0, y) self.write_color(rowfill, attr) self.pos(*oldpos) def scroll(self, rect, dx, dy, attr=None, fill=' '): - u'''Scroll a rectangle.''' + '''Scroll a rectangle.''' raise NotImplementedError def scroll_window(self, lines): - u'''Scroll the window by the indicated number of lines.''' + '''Scroll the window by the indicated number of lines.''' top = self.WindowTop + lines if top < 0: top = 0 @@ -301,7 +301,7 @@ class Console(object): self.WindowTop = top def getkeypress(self): - u'''Return next key press event from the queue, ignoring others.''' + '''Return next key press event from the queue, ignoring others.''' ck = System.ConsoleKey while 1: e = System.Console.ReadKey(True) @@ -309,21 +309,21 @@ class Console(object): self.scroll_window(12) elif e.Key == System.ConsoleKey.PageUp:#PageUp self.scroll_window(-12) - elif str(e.KeyChar) == u"\000":#Drop deadkeys - log(u"Deadkey: %s"%e) + elif str(e.KeyChar) == "\000":#Drop deadkeys + log("Deadkey: %s"%e) return event(self, e) else: return event(self, e) def title(self, txt=None): - u'''Set/get title.''' + '''Set/get title.''' if txt: System.Console.Title = txt else: return System.Console.Title def size(self, width=None, height=None): - u'''Set/get window size.''' + '''Set/get window size.''' sc = System.Console if width is not None and height is not None: sc.BufferWidth, sc.BufferHeight = width,height @@ -336,22 +336,22 @@ class Console(object): return sc.WindowWidth - 1, sc.WindowHeight - 1 def cursor(self, visible=True, size=None): - u'''Set cursor on or off.''' + '''Set cursor on or off.''' System.Console.CursorVisible = visible def bell(self): System.Console.Beep() def next_serial(self): - u'''Get next event serial number.''' + '''Get next event serial number.''' self.serial += 1 return self.serial class event(Event): - u'''Represent events from the console.''' + '''Represent events from the console.''' def __init__(self, console, input): - u'''Initialize an event from the Windows input structure.''' - self.type = u'??' + '''Initialize an event from the Windows input structure.''' + self.type = '??' self.serial = console.next_serial() self.width = 0 self.height = 0 @@ -360,7 +360,7 @@ class event(Event): self.char = str(input.KeyChar) self.keycode = input.Key self.state = input.Modifiers - log(u"%s,%s,%s"%(input.Modifiers, input.Key, input.KeyChar)) + log("%s,%s,%s"%(input.Modifiers, input.Key, input.KeyChar)) self.type = "KeyRelease" self.keysym = make_keysym(self.keycode) self.keyinfo = make_KeyPress(self.char, self.state, self.keycode) @@ -368,7 +368,7 @@ class event(Event): def make_event_from_keydescr(keydescr): def input(): return 1 - input.KeyChar = u"a" + input.KeyChar = "a" input.Key = System.ConsoleKey.A input.Modifiers = System.ConsoleModifiers.Shift input.next_serial = input @@ -378,17 +378,17 @@ def make_event_from_keydescr(keydescr): e.keyinfo = keyinfo return e -CTRL_C_EVENT=make_event_from_keydescr(u"Control-c") +CTRL_C_EVENT=make_event_from_keydescr("Control-c") def install_readline(hook): def hook_wrap(): try: res = hook() - except KeyboardInterrupt,x: #this exception does not seem to be caught - res = u"" + except KeyboardInterrupt as x: #this exception does not seem to be caught + res = "" except EOFError: return None - if res[-1:] == u"\n": + if res[-1:] == "\n": return res[:-1] else: return res @@ -403,22 +403,22 @@ def install_readline(hook): -if __name__ == u'__main__': +if __name__ == '__main__': import time, sys c = Console(0) sys.stdout = c sys.stderr = c c.page() c.pos(5, 10) - c.write(u'hi there') - c.title(u"Testing console") + c.write('hi there') + c.title("Testing console") # c.bell() - print - print u"size", c.size() - print u' some printed output' + print() + print("size", c.size()) + print(' some printed output') for i in range(10): e = c.getkeypress() - print e.Key, chr(e.KeyChar), ord(e.KeyChar), e.Modifiers + print(e.Key, chr(e.KeyChar), ord(e.KeyChar), e.Modifiers) del c System.Console.Clear() diff --git a/pyreadline/examples/callback_example.py b/pyreadline/examples/callback_example.py index dac6e88..a9b3c7d 100644 --- a/pyreadline/examples/callback_example.py +++ b/pyreadline/examples/callback_example.py @@ -1,10 +1,10 @@ -u''' +''' Example script using the callback interface of readline. :author: strank ''' -__docformat__ = u"restructuredtext en" +__docformat__ = "restructuredtext en" import sys import os @@ -21,33 +21,33 @@ maxlines = 10 def main(): - readline.callback_handler_install(u'Starting test, please do type:' + os.linesep, lineReceived) + readline.callback_handler_install('Starting test, please do type:' + os.linesep, lineReceived) index = 0 start = int(time.time()) while prompting: # demonstrate that async stuff is possible: if start + index < time.time(): - rl.console.title(u"NON-BLOCKING: %d" % index) + rl.console.title("NON-BLOCKING: %d" % index) index += 1 # ugly busy waiting/polling on windows, using 'select' on Unix: (or use twisted) if msvcrt.kbhit(): readline.callback_read_char() - print u"Done, index =", index + print("Done, index =", index) def lineReceived(line): global count, prompting count += 1 - print u"Got line: %s" % line + print("Got line: %s" % line) if count > maxlines: prompting = False readline.callback_handler_remove() else: - readline.callback_handler_install(u'Got %s of %s, more typing please:' % (count, maxlines) + readline.callback_handler_install('Got %s of %s, more typing please:' % (count, maxlines) + os.linesep, lineReceived) -if __name__ == u'__main__': +if __name__ == '__main__': main() diff --git a/pyreadline/examples/tk_gui.py b/pyreadline/examples/tk_gui.py index e8ef83e..7392fdd 100644 --- a/pyreadline/examples/tk_gui.py +++ b/pyreadline/examples/tk_gui.py @@ -14,7 +14,7 @@ from pyreadline.rlmain import BaseReadline from pyreadline.keysyms.common import KeyPress import pyreadline.logger as log log.sock_silent=False -import Tkinter,sys +import tkinter,sys translate={"plus":"+","minus":"-","asterisk":"*","slash":"/","exclam":"!","quotedbl":'"', "parenleft":"(","parenright":")",} @@ -41,17 +41,17 @@ def KeyPress_from_event(event): class App: def __init__(self, master): - self.frame=frame=Tkinter.Frame(master) + self.frame=frame=tkinter.Frame(master) frame.pack() self.lines=["Hello"] self.RL=BaseReadline() self.RL.read_inputrc() self.prompt=">>>" self.readline_setup(self.prompt) - self.textvar = Tkinter.StringVar() + self.textvar = tkinter.StringVar() self._update_line() - self.text=Tkinter.Label(frame, textvariable=self.textvar,width=50,height=40,justify=Tkinter.LEFT,anchor=Tkinter.NW) - self.text.pack(side=Tkinter.LEFT) + self.text=tkinter.Label(frame, textvariable=self.textvar,width=50,height=40,justify=tkinter.LEFT,anchor=tkinter.NW) + self.text.pack(side=tkinter.LEFT) master.bind("",self.handler) self.locals={} @@ -83,7 +83,7 @@ class App: -root=Tkinter.Tk() +root=tkinter.Tk() display=App(root) root.mainloop() \ No newline at end of file diff --git a/pyreadline/get_doc.py b/pyreadline/get_doc.py index b56eb95..7070a78 100644 --- a/pyreadline/get_doc.py +++ b/pyreadline/get_doc.py @@ -1,10 +1,11 @@ import sys,textwrap +import collections -rlmain = sys.modules[u"pyreadline.rlmain"] +rlmain = sys.modules["pyreadline.rlmain"] rl = rlmain.rl def get_doc(rl): - methods = [(x, getattr(rl, x)) for x in dir(rl) if callable(getattr(rl, x))] + methods = [(x, getattr(rl, x)) for x in dir(rl) if isinstance(getattr(rl, x), collections.Callable)] return [ (x, m.__doc__ )for x, m in methods if m.__doc__] @@ -13,6 +14,6 @@ def get_rest(rl): out = [] for funcname, doc in q: out.append(funcname) - out.append(u"\n".join(textwrap.wrap(doc, 80, initial_indent=u" "))) - out.append(u"") + out.append("\n".join(textwrap.wrap(doc, 80, initial_indent=" "))) + out.append("") return out \ No newline at end of file diff --git a/pyreadline/keysyms/__init__.py b/pyreadline/keysyms/__init__.py index ae3aec2..8875056 100644 --- a/pyreadline/keysyms/__init__.py +++ b/pyreadline/keysyms/__init__.py @@ -1,20 +1,20 @@ import sys success = False -in_ironpython = u"IronPython" in sys.version +in_ironpython = "IronPython" in sys.version if in_ironpython: try: - from ironpython_keysyms import * + from .ironpython_keysyms import * success = True - except ImportError, x: + except ImportError as x: raise else: try: - from keysyms import * + from .keysyms import * success = True - except ImportError, x: + except ImportError as x: pass if not success: - raise ImportError(u"Could not import keysym for local pythonversion", x) \ No newline at end of file + raise ImportError("Could not import keysym for local pythonversion", x) \ No newline at end of file diff --git a/pyreadline/keysyms/common.py b/pyreadline/keysyms/common.py index d76b356..b47f85f 100644 --- a/pyreadline/keysyms/common.py +++ b/pyreadline/keysyms/common.py @@ -1,127 +1,127 @@ -# -*- coding: utf-8 -*- -#***************************************************************************** -# Copyright (C) 2003-2006 Gary Bishop. -# Copyright (C) 2006 Jorgen Stenarson. -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** -# table for translating virtual keys to X windows key symbols - -try: - set -except NameError: - from sets import Set as set - -from pyreadline.unicode_helper import ensure_unicode - -validkey =set([u'cancel', u'backspace', u'tab', u'clear', - u'return', u'shift_l', u'control_l', u'alt_l', - u'pause', u'caps_lock', u'escape', u'space', - u'prior', u'next', u'end', u'home', - u'left', u'up', u'right', u'down', - u'select', u'print', u'execute', u'snapshot', - u'insert', u'delete', u'help', u'f1', - u'f2', u'f3', u'f4', u'f5', - u'f6', u'f7', u'f8', u'f9', - u'f10', u'f11', u'f12', u'f13', - u'f14', u'f15', u'f16', u'f17', - u'f18', u'f19', u'f20', u'f21', - u'f22', u'f23', u'f24', u'num_lock', - u'scroll_lock', u'vk_apps', u'vk_processkey',u'vk_attn', - u'vk_crsel', u'vk_exsel', u'vk_ereof', u'vk_play', - u'vk_zoom', u'vk_noname', u'vk_pa1', u'vk_oem_clear', - u'numpad0', u'numpad1', u'numpad2', u'numpad3', - u'numpad4', u'numpad5', u'numpad6', u'numpad7', - u'numpad8', u'numpad9', u'divide', u'multiply', - u'add', u'subtract', u'vk_decimal']) - -escape_sequence_to_special_key = {u"\\e[a" : u"up", u"\\e[b" : u"down", u"del" : u"delete"} - -class KeyPress(object): - def __init__(self, char=u"", shift=False, control=False, meta=False, keyname=u""): - if control or meta or shift: - char = char.upper() - self.info = dict(char=char, - shift=shift, - control=control, - meta=meta, - keyname=keyname) - - def create(name): - def get(self): - return self.info[name] - - def set(self, value): - self.info[name] = value - return property(get, set) - char = create(u"char") - shift = create(u"shift") - control = create(u"control") - meta = create(u"meta") - keyname = create(u"keyname") - - def __repr__(self): - return u"(%s,%s,%s,%s)"%tuple(map(ensure_unicode, self.tuple())) - - def tuple(self): - if self.keyname: - return (self.control, self.meta, self.shift, self.keyname) - else: - if self.control or self.meta or self.shift: - return (self.control, self.meta, self.shift, self.char.upper()) - else: - return (self.control, self.meta, self.shift, self.char) - - def __eq__(self, other): - if isinstance(other, KeyPress): - s = self.tuple() - o = other.tuple() - return s == o - else: - return False - -def make_KeyPress_from_keydescr(keydescr): - keyinfo = KeyPress() - if len(keydescr) > 2 and keydescr[:1] == u'"' and keydescr[-1:] == u'"': - keydescr = keydescr[1:-1] - - while 1: - lkeyname = keydescr.lower() - if lkeyname.startswith(u'control-'): - keyinfo.control = True - keydescr = keydescr[8:] - elif lkeyname.startswith(u'ctrl-'): - keyinfo.control = True - keydescr = keydescr[5:] - elif keydescr.lower().startswith(u'\\c-'): - keyinfo.control = True - keydescr = keydescr[3:] - elif keydescr.lower().startswith(u'\\m-'): - keyinfo.meta = True - keydescr = keydescr[3:] - elif keydescr in escape_sequence_to_special_key: - keydescr = escape_sequence_to_special_key[keydescr] - elif lkeyname.startswith(u'meta-'): - keyinfo.meta = True - keydescr = keydescr[5:] - elif lkeyname.startswith(u'alt-'): - keyinfo.meta = True - keydescr = keydescr[4:] - elif lkeyname.startswith(u'shift-'): - keyinfo.shift = True - keydescr = keydescr[6:] - else: - if len(keydescr) > 1: - if keydescr.strip().lower() in validkey: - keyinfo.keyname = keydescr.strip().lower() - keyinfo.char = "" - else: - raise IndexError(u"Not a valid key: '%s'"%keydescr) - else: - keyinfo.char = keydescr - return keyinfo - -if __name__ == u"__main__": - import startup +# -*- coding: utf-8 -*- +#***************************************************************************** +# Copyright (C) 2003-2006 Gary Bishop. +# Copyright (C) 2006 Jorgen Stenarson. +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** +# table for translating virtual keys to X windows key symbols + +try: + set +except NameError: + from sets import Set as set + +from pyreadline.unicode_helper import ensure_unicode + +validkey =set(['cancel', 'backspace', 'tab', 'clear', + 'return', 'shift_l', 'control_l', 'alt_l', + 'pause', 'caps_lock', 'escape', 'space', + 'prior', 'next', 'end', 'home', + 'left', 'up', 'right', 'down', + 'select', 'print', 'execute', 'snapshot', + 'insert', 'delete', 'help', 'f1', + 'f2', 'f3', 'f4', 'f5', + 'f6', 'f7', 'f8', 'f9', + 'f10', 'f11', 'f12', 'f13', + 'f14', 'f15', 'f16', 'f17', + 'f18', 'f19', 'f20', 'f21', + 'f22', 'f23', 'f24', 'num_lock', + 'scroll_lock', 'vk_apps', 'vk_processkey','vk_attn', + 'vk_crsel', 'vk_exsel', 'vk_ereof', 'vk_play', + 'vk_zoom', 'vk_noname', 'vk_pa1', 'vk_oem_clear', + 'numpad0', 'numpad1', 'numpad2', 'numpad3', + 'numpad4', 'numpad5', 'numpad6', 'numpad7', + 'numpad8', 'numpad9', 'divide', 'multiply', + 'add', 'subtract', 'vk_decimal']) + +escape_sequence_to_special_key = {"\\e[a" : "up", "\\e[b" : "down", "del" : "delete"} + +class KeyPress(object): + def __init__(self, char="", shift=False, control=False, meta=False, keyname=""): + if control or meta or shift: + char = char.upper() + self.info = dict(char=char, + shift=shift, + control=control, + meta=meta, + keyname=keyname) + + def create(name): + def get(self): + return self.info[name] + + def set(self, value): + self.info[name] = value + return property(get, set) + char = create("char") + shift = create("shift") + control = create("control") + meta = create("meta") + keyname = create("keyname") + + def __repr__(self): + return "(%s,%s,%s,%s)"%tuple(map(ensure_unicode, self.tuple())) + + def tuple(self): + if self.keyname: + return (self.control, self.meta, self.shift, self.keyname) + else: + if self.control or self.meta or self.shift: + return (self.control, self.meta, self.shift, self.char.upper()) + else: + return (self.control, self.meta, self.shift, self.char) + + def __eq__(self, other): + if isinstance(other, KeyPress): + s = self.tuple() + o = other.tuple() + return s == o + else: + return False + +def make_KeyPress_from_keydescr(keydescr): + keyinfo = KeyPress() + if len(keydescr) > 2 and keydescr[:1] == '"' and keydescr[-1:] == '"': + keydescr = keydescr[1:-1] + + while 1: + lkeyname = keydescr.lower() + if lkeyname.startswith('control-'): + keyinfo.control = True + keydescr = keydescr[8:] + elif lkeyname.startswith('ctrl-'): + keyinfo.control = True + keydescr = keydescr[5:] + elif keydescr.lower().startswith('\\c-'): + keyinfo.control = True + keydescr = keydescr[3:] + elif keydescr.lower().startswith('\\m-'): + keyinfo.meta = True + keydescr = keydescr[3:] + elif keydescr in escape_sequence_to_special_key: + keydescr = escape_sequence_to_special_key[keydescr] + elif lkeyname.startswith('meta-'): + keyinfo.meta = True + keydescr = keydescr[5:] + elif lkeyname.startswith('alt-'): + keyinfo.meta = True + keydescr = keydescr[4:] + elif lkeyname.startswith('shift-'): + keyinfo.shift = True + keydescr = keydescr[6:] + else: + if len(keydescr) > 1: + if keydescr.strip().lower() in validkey: + keyinfo.keyname = keydescr.strip().lower() + keyinfo.char = "" + else: + raise IndexError("Not a valid key: '%s'"%keydescr) + else: + keyinfo.char = keydescr + return keyinfo + +if __name__ == "__main__": + import startup \ No newline at end of file diff --git a/pyreadline/keysyms/ironpython_keysyms.py b/pyreadline/keysyms/ironpython_keysyms.py index 783940c..f4c74e9 100644 --- a/pyreadline/keysyms/ironpython_keysyms.py +++ b/pyreadline/keysyms/ironpython_keysyms.py @@ -1,202 +1,202 @@ -# -*- coding: utf-8 -*- -#***************************************************************************** -# Copyright (C) 2003-2006 Gary Bishop. -# Copyright (C) 2006 Jorgen Stenarson. -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** -import System -from common import validkey, KeyPress, make_KeyPress_from_keydescr - -c32 = System.ConsoleKey -Shift = System.ConsoleModifiers.Shift -Control = System.ConsoleModifiers.Control -Alt = System.ConsoleModifiers.Alt -# table for translating virtual keys to X windows key symbols -code2sym_map = {#c32.CANCEL: u'Cancel', - c32.Backspace: u'BackSpace', - c32.Tab: u'Tab', - c32.Clear: u'Clear', - c32.Enter: u'Return', -# c32.Shift: u'Shift_L', -# c32.Control: u'Control_L', -# c32.Menu: u'Alt_L', - c32.Pause: u'Pause', -# c32.Capital: u'Caps_Lock', - c32.Escape: u'Escape', -# c32.Space: u'space', - c32.PageUp: u'Prior', - c32.PageDown: u'Next', - c32.End: u'End', - c32.Home: u'Home', - c32.LeftArrow: u'Left', - c32.UpArrow: u'Up', - c32.RightArrow: u'Right', - c32.DownArrow: u'Down', - c32.Select: u'Select', - c32.Print: u'Print', - c32.Execute: u'Execute', -# c32.Snapshot: u'Snapshot', - c32.Insert: u'Insert', - c32.Delete: u'Delete', - c32.Help: u'Help', - c32.F1: u'F1', - c32.F2: u'F2', - c32.F3: u'F3', - c32.F4: u'F4', - c32.F5: u'F5', - c32.F6: u'F6', - c32.F7: u'F7', - c32.F8: u'F8', - c32.F9: u'F9', - c32.F10: u'F10', - c32.F11: u'F11', - c32.F12: u'F12', - c32.F13: u'F13', - c32.F14: u'F14', - c32.F15: u'F15', - c32.F16: u'F16', - c32.F17: u'F17', - c32.F18: u'F18', - c32.F19: u'F19', - c32.F20: u'F20', - c32.F21: u'F21', - c32.F22: u'F22', - c32.F23: u'F23', - c32.F24: u'F24', -# c32.Numlock: u'Num_Lock,', -# c32.Scroll: u'Scroll_Lock', -# c32.Apps: u'VK_APPS', -# c32.ProcesskeY: u'VK_PROCESSKEY', -# c32.Attn: u'VK_ATTN', -# c32.Crsel: u'VK_CRSEL', -# c32.Exsel: u'VK_EXSEL', -# c32.Ereof: u'VK_EREOF', -# c32.Play: u'VK_PLAY', -# c32.Zoom: u'VK_ZOOM', -# c32.Noname: u'VK_NONAME', -# c32.Pa1: u'VK_PA1', - c32.OemClear: u'VK_OEM_CLEAR', - c32.NumPad0: u'NUMPAD0', - c32.NumPad1: u'NUMPAD1', - c32.NumPad2: u'NUMPAD2', - c32.NumPad3: u'NUMPAD3', - c32.NumPad4: u'NUMPAD4', - c32.NumPad5: u'NUMPAD5', - c32.NumPad6: u'NUMPAD6', - c32.NumPad7: u'NUMPAD7', - c32.NumPad8: u'NUMPAD8', - c32.NumPad9: u'NUMPAD9', - c32.Divide: u'Divide', - c32.Multiply: u'Multiply', - c32.Add: u'Add', - c32.Subtract: u'Subtract', - c32.Decimal: u'VK_DECIMAL' - } - -# function to handle the mapping -def make_keysym(keycode): - try: - sym = code2sym_map[keycode] - except KeyError: - sym = u'' - return sym - -sym2code_map = {} -for code,sym in code2sym_map.iteritems(): - sym2code_map[sym.lower()] = code - -def key_text_to_keyinfo(keytext): - u'''Convert a GNU readline style textual description of a key to keycode with modifiers''' - if keytext.startswith('"'): # " - return keyseq_to_keyinfo(keytext[1:-1]) - else: - return keyname_to_keyinfo(keytext) - - -def char_to_keyinfo(char, control=False, meta=False, shift=False): - vk = (ord(char)) - if vk & 0xffff == 0xffff: - print u'VkKeyScan("%s") = %x' % (char, vk) - raise ValueError, u'bad key' - if vk & 0x100: - shift = True - if vk & 0x200: - control = True - if vk & 0x400: - meta = True - return (control, meta, shift, vk & 0xff) - -def keyname_to_keyinfo(keyname): - control = False - meta = False - shift = False - - while 1: - lkeyname = keyname.lower() - if lkeyname.startswith(u'control-'): - control = True - keyname = keyname[8:] - elif lkeyname.startswith(u'ctrl-'): - control = True - keyname = keyname[5:] - elif lkeyname.startswith(u'meta-'): - meta = True - keyname = keyname[5:] - elif lkeyname.startswith(u'alt-'): - meta = True - keyname = keyname[4:] - elif lkeyname.startswith(u'shift-'): - shift = True - keyname = keyname[6:] - else: - if len(keyname) > 1: - return (control, meta, shift, sym2code_map.get(keyname.lower(),u" ")) - else: - return char_to_keyinfo(keyname, control, meta, shift) - -def keyseq_to_keyinfo(keyseq): - res = [] - control = False - meta = False - shift = False - - while 1: - if keyseq.startswith(u'\\C-'): - control = True - keyseq = keyseq[3:] - elif keyseq.startswith(u'\\M-'): - meta = True - keyseq = keyseq[3:] - elif keyseq.startswith(u'\\e'): - res.append(char_to_keyinfo(u'\033', control, meta, shift)) - control = meta = shift = False - keyseq = keyseq[2:] - elif len(keyseq) >= 1: - res.append(char_to_keyinfo(keyseq[0], control, meta, shift)) - control = meta = shift = False - keyseq = keyseq[1:] - else: - return res[0] - -def make_keyinfo(keycode, state): - control = False - meta =False - shift = False - return (control, meta, shift, keycode) - - -def make_KeyPress(char, state, keycode): - - shift = bool(int(state) & int(Shift)) - control = bool(int(state) & int(Control)) - meta = bool(int(state) & int(Alt)) - keyname = code2sym_map.get(keycode, u"").lower() - if control and meta: #equivalent to altgr so clear flags - control = False - meta = False - elif control: - char = str(keycode) - return KeyPress(char, shift, control, meta, keyname) - +# -*- coding: utf-8 -*- +#***************************************************************************** +# Copyright (C) 2003-2006 Gary Bishop. +# Copyright (C) 2006 Jorgen Stenarson. +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** +import System +from .common import validkey, KeyPress, make_KeyPress_from_keydescr + +c32 = System.ConsoleKey +Shift = System.ConsoleModifiers.Shift +Control = System.ConsoleModifiers.Control +Alt = System.ConsoleModifiers.Alt +# table for translating virtual keys to X windows key symbols +code2sym_map = {#c32.CANCEL: u'Cancel', + c32.Backspace: 'BackSpace', + c32.Tab: 'Tab', + c32.Clear: 'Clear', + c32.Enter: 'Return', +# c32.Shift: u'Shift_L', +# c32.Control: u'Control_L', +# c32.Menu: u'Alt_L', + c32.Pause: 'Pause', +# c32.Capital: u'Caps_Lock', + c32.Escape: 'Escape', +# c32.Space: u'space', + c32.PageUp: 'Prior', + c32.PageDown: 'Next', + c32.End: 'End', + c32.Home: 'Home', + c32.LeftArrow: 'Left', + c32.UpArrow: 'Up', + c32.RightArrow: 'Right', + c32.DownArrow: 'Down', + c32.Select: 'Select', + c32.Print: 'Print', + c32.Execute: 'Execute', +# c32.Snapshot: u'Snapshot', + c32.Insert: 'Insert', + c32.Delete: 'Delete', + c32.Help: 'Help', + c32.F1: 'F1', + c32.F2: 'F2', + c32.F3: 'F3', + c32.F4: 'F4', + c32.F5: 'F5', + c32.F6: 'F6', + c32.F7: 'F7', + c32.F8: 'F8', + c32.F9: 'F9', + c32.F10: 'F10', + c32.F11: 'F11', + c32.F12: 'F12', + c32.F13: 'F13', + c32.F14: 'F14', + c32.F15: 'F15', + c32.F16: 'F16', + c32.F17: 'F17', + c32.F18: 'F18', + c32.F19: 'F19', + c32.F20: 'F20', + c32.F21: 'F21', + c32.F22: 'F22', + c32.F23: 'F23', + c32.F24: 'F24', +# c32.Numlock: u'Num_Lock,', +# c32.Scroll: u'Scroll_Lock', +# c32.Apps: u'VK_APPS', +# c32.ProcesskeY: u'VK_PROCESSKEY', +# c32.Attn: u'VK_ATTN', +# c32.Crsel: u'VK_CRSEL', +# c32.Exsel: u'VK_EXSEL', +# c32.Ereof: u'VK_EREOF', +# c32.Play: u'VK_PLAY', +# c32.Zoom: u'VK_ZOOM', +# c32.Noname: u'VK_NONAME', +# c32.Pa1: u'VK_PA1', + c32.OemClear: 'VK_OEM_CLEAR', + c32.NumPad0: 'NUMPAD0', + c32.NumPad1: 'NUMPAD1', + c32.NumPad2: 'NUMPAD2', + c32.NumPad3: 'NUMPAD3', + c32.NumPad4: 'NUMPAD4', + c32.NumPad5: 'NUMPAD5', + c32.NumPad6: 'NUMPAD6', + c32.NumPad7: 'NUMPAD7', + c32.NumPad8: 'NUMPAD8', + c32.NumPad9: 'NUMPAD9', + c32.Divide: 'Divide', + c32.Multiply: 'Multiply', + c32.Add: 'Add', + c32.Subtract: 'Subtract', + c32.Decimal: 'VK_DECIMAL' + } + +# function to handle the mapping +def make_keysym(keycode): + try: + sym = code2sym_map[keycode] + except KeyError: + sym = '' + return sym + +sym2code_map = {} +for code,sym in code2sym_map.items(): + sym2code_map[sym.lower()] = code + +def key_text_to_keyinfo(keytext): + '''Convert a GNU readline style textual description of a key to keycode with modifiers''' + if keytext.startswith('"'): # " + return keyseq_to_keyinfo(keytext[1:-1]) + else: + return keyname_to_keyinfo(keytext) + + +def char_to_keyinfo(char, control=False, meta=False, shift=False): + vk = (ord(char)) + if vk & 0xffff == 0xffff: + print('VkKeyScan("%s") = %x' % (char, vk)) + raise ValueError('bad key') + if vk & 0x100: + shift = True + if vk & 0x200: + control = True + if vk & 0x400: + meta = True + return (control, meta, shift, vk & 0xff) + +def keyname_to_keyinfo(keyname): + control = False + meta = False + shift = False + + while 1: + lkeyname = keyname.lower() + if lkeyname.startswith('control-'): + control = True + keyname = keyname[8:] + elif lkeyname.startswith('ctrl-'): + control = True + keyname = keyname[5:] + elif lkeyname.startswith('meta-'): + meta = True + keyname = keyname[5:] + elif lkeyname.startswith('alt-'): + meta = True + keyname = keyname[4:] + elif lkeyname.startswith('shift-'): + shift = True + keyname = keyname[6:] + else: + if len(keyname) > 1: + return (control, meta, shift, sym2code_map.get(keyname.lower()," ")) + else: + return char_to_keyinfo(keyname, control, meta, shift) + +def keyseq_to_keyinfo(keyseq): + res = [] + control = False + meta = False + shift = False + + while 1: + if keyseq.startswith('\\C-'): + control = True + keyseq = keyseq[3:] + elif keyseq.startswith('\\M-'): + meta = True + keyseq = keyseq[3:] + elif keyseq.startswith('\\e'): + res.append(char_to_keyinfo('\033', control, meta, shift)) + control = meta = shift = False + keyseq = keyseq[2:] + elif len(keyseq) >= 1: + res.append(char_to_keyinfo(keyseq[0], control, meta, shift)) + control = meta = shift = False + keyseq = keyseq[1:] + else: + return res[0] + +def make_keyinfo(keycode, state): + control = False + meta =False + shift = False + return (control, meta, shift, keycode) + + +def make_KeyPress(char, state, keycode): + + shift = bool(int(state) & int(Shift)) + control = bool(int(state) & int(Control)) + meta = bool(int(state) & int(Alt)) + keyname = code2sym_map.get(keycode, "").lower() + if control and meta: #equivalent to altgr so clear flags + control = False + meta = False + elif control: + char = str(keycode) + return KeyPress(char, shift, control, meta, keyname) + diff --git a/pyreadline/keysyms/keysyms.py b/pyreadline/keysyms/keysyms.py index fd7d0c7..0e1b813 100644 --- a/pyreadline/keysyms/keysyms.py +++ b/pyreadline/keysyms/keysyms.py @@ -1,133 +1,133 @@ -# -*- coding: utf-8 -*- -#***************************************************************************** -# Copyright (C) 2003-2006 Gary Bishop. -# Copyright (C) 2006 Jorgen Stenarson. -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** -import winconstants as c32 -from pyreadline.logger import log -from ctypes import windll -import ctypes -# table for translating virtual keys to X windows key symbols - -from common import validkey, KeyPress, make_KeyPress_from_keydescr - -code2sym_map = {c32.VK_CANCEL: u'cancel', - c32.VK_BACK: u'backspace', - c32.VK_TAB: u'tab', - c32.VK_CLEAR: u'clear', - c32.VK_RETURN: u'return', - c32.VK_SHIFT: u'shift_l', - c32.VK_CONTROL: u'control_l', - c32.VK_MENU: u'alt_l', - c32.VK_PAUSE: u'pause', - c32.VK_CAPITAL: u'caps_lock', - c32.VK_ESCAPE: u'escape', - c32.VK_SPACE: u'space', - c32.VK_PRIOR: u'prior', - c32.VK_NEXT: u'next', - c32.VK_END: u'end', - c32.VK_HOME: u'home', - c32.VK_LEFT: u'left', - c32.VK_UP: u'up', - c32.VK_RIGHT: u'right', - c32.VK_DOWN: u'down', - c32.VK_SELECT: u'select', - c32.VK_PRINT: u'print', - c32.VK_EXECUTE: u'execute', - c32.VK_SNAPSHOT: u'snapshot', - c32.VK_INSERT: u'insert', - c32.VK_DELETE: u'delete', - c32.VK_HELP: u'help', - c32.VK_F1: u'f1', - c32.VK_F2: u'f2', - c32.VK_F3: u'f3', - c32.VK_F4: u'f4', - c32.VK_F5: u'f5', - c32.VK_F6: u'f6', - c32.VK_F7: u'f7', - c32.VK_F8: u'f8', - c32.VK_F9: u'f9', - c32.VK_F10: u'f10', - c32.VK_F11: u'f11', - c32.VK_F12: u'f12', - c32.VK_F13: u'f13', - c32.VK_F14: u'f14', - c32.VK_F15: u'f15', - c32.VK_F16: u'f16', - c32.VK_F17: u'f17', - c32.VK_F18: u'f18', - c32.VK_F19: u'f19', - c32.VK_F20: u'f20', - c32.VK_F21: u'f21', - c32.VK_F22: u'f22', - c32.VK_F23: u'f23', - c32.VK_F24: u'f24', - c32.VK_NUMLOCK: u'num_lock,', - c32.VK_SCROLL: u'scroll_lock', - c32.VK_APPS: u'vk_apps', - c32.VK_PROCESSKEY: u'vk_processkey', - c32.VK_ATTN: u'vk_attn', - c32.VK_CRSEL: u'vk_crsel', - c32.VK_EXSEL: u'vk_exsel', - c32.VK_EREOF: u'vk_ereof', - c32.VK_PLAY: u'vk_play', - c32.VK_ZOOM: u'vk_zoom', - c32.VK_NONAME: u'vk_noname', - c32.VK_PA1: u'vk_pa1', - c32.VK_OEM_CLEAR: u'vk_oem_clear', - c32.VK_NUMPAD0: u'numpad0', - c32.VK_NUMPAD1: u'numpad1', - c32.VK_NUMPAD2: u'numpad2', - c32.VK_NUMPAD3: u'numpad3', - c32.VK_NUMPAD4: u'numpad4', - c32.VK_NUMPAD5: u'numpad5', - c32.VK_NUMPAD6: u'numpad6', - c32.VK_NUMPAD7: u'numpad7', - c32.VK_NUMPAD8: u'numpad8', - c32.VK_NUMPAD9: u'numpad9', - c32.VK_DIVIDE: u'divide', - c32.VK_MULTIPLY: u'multiply', - c32.VK_ADD: u'add', - c32.VK_SUBTRACT: u'subtract', - c32.VK_DECIMAL: u'vk_decimal' - } - -VkKeyScan = windll.user32.VkKeyScanA - -def char_to_keyinfo(char, control=False, meta=False, shift=False): - k=KeyPress() - vk = VkKeyScan(ord(char)) - if vk & 0xffff == 0xffff: - print u'VkKeyScan("%s") = %x' % (char, vk) - raise ValueError, u'bad key' - if vk & 0x100: - k.shift = True - if vk & 0x200: - k.control = True - if vk & 0x400: - k.meta = True - k.char=chr(vk & 0xff) - return k - -def make_KeyPress(char, state, keycode): - control = (state & (4+8)) != 0 - meta = (state & (1+2)) != 0 - shift = (state & 0x10) != 0 - if control and not meta:#Matches ctrl- chords should pass keycode as char - char = chr(keycode) - elif control and meta: #Matches alt gr and should just pass on char - control = False - meta = False - try: - keyname=code2sym_map[keycode] - except KeyError: - keyname = u"" - out = KeyPress(char, shift, control, meta, keyname) - return out - -if __name__==u"__main__": - import startup +# -*- coding: utf-8 -*- +#***************************************************************************** +# Copyright (C) 2003-2006 Gary Bishop. +# Copyright (C) 2006 Jorgen Stenarson. +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** +from . import winconstants as c32 +from pyreadline.logger import log +from ctypes import windll +import ctypes +# table for translating virtual keys to X windows key symbols + +from .common import validkey, KeyPress, make_KeyPress_from_keydescr + +code2sym_map = {c32.VK_CANCEL: 'cancel', + c32.VK_BACK: 'backspace', + c32.VK_TAB: 'tab', + c32.VK_CLEAR: 'clear', + c32.VK_RETURN: 'return', + c32.VK_SHIFT: 'shift_l', + c32.VK_CONTROL: 'control_l', + c32.VK_MENU: 'alt_l', + c32.VK_PAUSE: 'pause', + c32.VK_CAPITAL: 'caps_lock', + c32.VK_ESCAPE: 'escape', + c32.VK_SPACE: 'space', + c32.VK_PRIOR: 'prior', + c32.VK_NEXT: 'next', + c32.VK_END: 'end', + c32.VK_HOME: 'home', + c32.VK_LEFT: 'left', + c32.VK_UP: 'up', + c32.VK_RIGHT: 'right', + c32.VK_DOWN: 'down', + c32.VK_SELECT: 'select', + c32.VK_PRINT: 'print', + c32.VK_EXECUTE: 'execute', + c32.VK_SNAPSHOT: 'snapshot', + c32.VK_INSERT: 'insert', + c32.VK_DELETE: 'delete', + c32.VK_HELP: 'help', + c32.VK_F1: 'f1', + c32.VK_F2: 'f2', + c32.VK_F3: 'f3', + c32.VK_F4: 'f4', + c32.VK_F5: 'f5', + c32.VK_F6: 'f6', + c32.VK_F7: 'f7', + c32.VK_F8: 'f8', + c32.VK_F9: 'f9', + c32.VK_F10: 'f10', + c32.VK_F11: 'f11', + c32.VK_F12: 'f12', + c32.VK_F13: 'f13', + c32.VK_F14: 'f14', + c32.VK_F15: 'f15', + c32.VK_F16: 'f16', + c32.VK_F17: 'f17', + c32.VK_F18: 'f18', + c32.VK_F19: 'f19', + c32.VK_F20: 'f20', + c32.VK_F21: 'f21', + c32.VK_F22: 'f22', + c32.VK_F23: 'f23', + c32.VK_F24: 'f24', + c32.VK_NUMLOCK: 'num_lock,', + c32.VK_SCROLL: 'scroll_lock', + c32.VK_APPS: 'vk_apps', + c32.VK_PROCESSKEY: 'vk_processkey', + c32.VK_ATTN: 'vk_attn', + c32.VK_CRSEL: 'vk_crsel', + c32.VK_EXSEL: 'vk_exsel', + c32.VK_EREOF: 'vk_ereof', + c32.VK_PLAY: 'vk_play', + c32.VK_ZOOM: 'vk_zoom', + c32.VK_NONAME: 'vk_noname', + c32.VK_PA1: 'vk_pa1', + c32.VK_OEM_CLEAR: 'vk_oem_clear', + c32.VK_NUMPAD0: 'numpad0', + c32.VK_NUMPAD1: 'numpad1', + c32.VK_NUMPAD2: 'numpad2', + c32.VK_NUMPAD3: 'numpad3', + c32.VK_NUMPAD4: 'numpad4', + c32.VK_NUMPAD5: 'numpad5', + c32.VK_NUMPAD6: 'numpad6', + c32.VK_NUMPAD7: 'numpad7', + c32.VK_NUMPAD8: 'numpad8', + c32.VK_NUMPAD9: 'numpad9', + c32.VK_DIVIDE: 'divide', + c32.VK_MULTIPLY: 'multiply', + c32.VK_ADD: 'add', + c32.VK_SUBTRACT: 'subtract', + c32.VK_DECIMAL: 'vk_decimal' + } + +VkKeyScan = windll.user32.VkKeyScanA + +def char_to_keyinfo(char, control=False, meta=False, shift=False): + k=KeyPress() + vk = VkKeyScan(ord(char)) + if vk & 0xffff == 0xffff: + print('VkKeyScan("%s") = %x' % (char, vk)) + raise ValueError('bad key') + if vk & 0x100: + k.shift = True + if vk & 0x200: + k.control = True + if vk & 0x400: + k.meta = True + k.char=chr(vk & 0xff) + return k + +def make_KeyPress(char, state, keycode): + control = (state & (4+8)) != 0 + meta = (state & (1+2)) != 0 + shift = (state & 0x10) != 0 + if control and not meta:#Matches ctrl- chords should pass keycode as char + char = chr(keycode) + elif control and meta: #Matches alt gr and should just pass on char + control = False + meta = False + try: + keyname=code2sym_map[keycode] + except KeyError: + keyname = "" + out = KeyPress(char, shift, control, meta, keyname) + return out + +if __name__=="__main__": + import startup \ No newline at end of file diff --git a/pyreadline/lineeditor/history.py b/pyreadline/lineeditor/history.py index 3eae6dd..d5fbe14 100644 --- a/pyreadline/lineeditor/history.py +++ b/pyreadline/lineeditor/history.py @@ -8,12 +8,12 @@ import re, operator,string, sys,os from pyreadline.unicode_helper import ensure_unicode, ensure_str -if u"pyreadline" in sys.modules: - pyreadline = sys.modules[u"pyreadline"] +if "pyreadline" in sys.modules: + pyreadline = sys.modules["pyreadline"] else: import pyreadline -import lineobj +from . import lineobj import exceptions @@ -31,74 +31,74 @@ class LineHistory(object): self._history_cursor = 0 self.history_filename = os.path.expanduser('~/.history') #Cannot expand unicode strings correctly on python2.4 self.lastcommand = None - self.query = u"" + self.query = "" def get_current_history_length(self): - u'''Return the number of lines currently in the history. + '''Return the number of lines currently in the history. (This is different from get_history_length(), which returns the maximum number of lines that will be written to a history file.)''' value = len(self.history) - log(u"get_current_history_length:%d"%value) + log("get_current_history_length:%d"%value) return value def get_history_length(self): - u'''Return the desired length of the history file. Negative values imply + '''Return the desired length of the history file. Negative values imply unlimited history file size.''' value = self._history_length - log(u"get_history_length:%d"%value) + log("get_history_length:%d"%value) return value def get_history_item(self, index): - u'''Return the current contents of history item at index.''' + '''Return the current contents of history item at index.''' item = self.history[index] - log(u"get_history_item: index:%d item:%r"%(index, item)) + log("get_history_item: index:%d item:%r"%(index, item)) return item.get_line_text() def set_history_length(self, value): - log(u"set_history_length: old:%d new:%d"%(self._history_length, value)) + log("set_history_length: old:%d new:%d"%(self._history_length, value)) self._history_length = value def get_history_cursor(self): value = self._history_cursor - log(u"get_history_cursor:%d"%value) + log("get_history_cursor:%d"%value) return value def set_history_cursor(self, value): - log(u"set_history_cursor: old:%d new:%d"%(self._history_cursor, value)) + log("set_history_cursor: old:%d new:%d"%(self._history_cursor, value)) self._history_cursor = value history_length = property(get_history_length, set_history_length) history_cursor = property(get_history_cursor, set_history_cursor) def clear_history(self): - u'''Clear readline history.''' + '''Clear readline history.''' self.history[:] = [] self.history_cursor = 0 def read_history_file(self, filename=None): - u'''Load a readline history file.''' + '''Load a readline history file.''' if filename is None: filename = self.history_filename try: - for line in open(filename, u'r'): + for line in open(filename, 'r'): self.add_history(lineobj.ReadLineTextBuffer(ensure_unicode(line.rstrip()))) except IOError: self.history = [] self.history_cursor = 0 def write_history_file(self, filename = None): - u'''Save a readline history file.''' + '''Save a readline history file.''' if filename is None: filename = self.history_filename - fp = open(filename, u'wb') + fp = open(filename, 'wb') for line in self.history[-self.history_length:]: fp.write(ensure_str(line.get_line_text())) - fp.write(u'\n') + fp.write('\n') fp.close() def add_history(self, line): - u'''Append a line to the history buffer, as if it was the last line typed.''' + '''Append a line to the history buffer, as if it was the last line typed.''' if not hasattr(line, "get_line_text"): line = lineobj.ReadLineTextBuffer(line) if not line.get_line_text(): @@ -110,7 +110,7 @@ class LineHistory(object): self.history_cursor = len(self.history) def previous_history(self, current): # (C-p) - u'''Move back through the history list, fetching the previous command. ''' + '''Move back through the history list, fetching the previous command. ''' if self.history_cursor == len(self.history): self.history.append(current.copy()) #do not use add_history since we do not want to increment cursor @@ -120,19 +120,19 @@ class LineHistory(object): current.point = lineobj.EndOfLine def next_history(self, current): # (C-n) - u'''Move forward through the history list, fetching the next command. ''' + '''Move forward through the history list, fetching the next command. ''' if self.history_cursor < len(self.history) - 1: self.history_cursor += 1 current.set_line(self.history[self.history_cursor].get_line_text()) def beginning_of_history(self): # (M-<) - u'''Move to the first line in the history.''' + '''Move to the first line in the history.''' self.history_cursor = 0 if len(self.history) > 0: self.l_buffer = self.history[0] def end_of_history(self, current): # (M->) - u'''Move to the end of the input history, i.e., the line currently + '''Move to the end of the input history, i.e., the line currently being entered.''' self.history_cursor = len(self.history) current.set_line(self.history[-1].get_line_text()) @@ -151,7 +151,7 @@ class LineHistory(object): if res: self.history_cursor -= res[0][0] return res[0][1].get_line_text() - return u"" + return "" def forward_search_history(self, searchfor, startpos=None): if startpos is None: @@ -167,13 +167,13 @@ class LineHistory(object): if res: self.history_cursor += res[0][0] return res[0][1].get_line_text() - return u"" + return "" def _search(self, direction, partial): try: if (self.lastcommand != self.history_search_forward and self.lastcommand != self.history_search_backward): - self.query = u''.join(partial[0:partial.point].get_line_text()) + self.query = ''.join(partial[0:partial.point].get_line_text()) hcstart = max(self.history_cursor,0) hc = self.history_cursor + direction while (direction < 0 and hc >= 0) or (direction > 0 and hc < len(self.history)): @@ -192,7 +192,7 @@ class LineHistory(object): pass elif hc >= len(self.history) and not self.query: self.history_cursor = len(self.history) - return lineobj.ReadLineTextBuffer(u"", point=0) + return lineobj.ReadLineTextBuffer("", point=0) elif self.history[max(min(hcstart, len(self.history) - 1), 0)]\ .get_line_text().startswith(self.query) and self.query: return lineobj.ReadLineTextBuffer(self.history\ @@ -208,26 +208,26 @@ class LineHistory(object): raise def history_search_forward(self, partial): # () - u'''Search forward through the history for the string of characters + '''Search forward through the history for the string of characters between the start of the current line and the point. This is a non-incremental search. By default, this command is unbound.''' q= self._search(1, partial) return q def history_search_backward(self, partial): # () - u'''Search backward through the history for the string of characters + '''Search backward through the history for the string of characters between the start of the current line and the point. This is a non-incremental search. By default, this command is unbound.''' q= self._search(-1, partial) return q -if __name__==u"__main__": +if __name__=="__main__": q = LineHistory() RL = lineobj.ReadLineTextBuffer - q.add_history(RL(u"aaaa")) - q.add_history(RL(u"aaba")) - q.add_history(RL(u"aaca")) - q.add_history(RL(u"akca")) - q.add_history(RL(u"bbb")) - q.add_history(RL(u"ako")) + q.add_history(RL("aaaa")) + q.add_history(RL("aaba")) + q.add_history(RL("aaca")) + q.add_history(RL("akca")) + q.add_history(RL("bbb")) + q.add_history(RL("ako")) diff --git a/pyreadline/lineeditor/lineobj.py b/pyreadline/lineeditor/lineobj.py index 4347ffb..0129f70 100644 --- a/pyreadline/lineeditor/lineobj.py +++ b/pyreadline/lineeditor/lineobj.py @@ -7,7 +7,7 @@ #***************************************************************************** import re, operator, sys -import wordmatcher +from . import wordmatcher import pyreadline.clipboard as clipboard from pyreadline.logger import log from pyreadline.unicode_helper import ensure_unicode @@ -27,7 +27,7 @@ def quote_char(c): class LinePositioner(object): def __call__(self, line): - NotImplementedError(u"Base class !!!") + NotImplementedError("Base class !!!") class NextChar(LinePositioner): def __call__(self, line): @@ -69,7 +69,7 @@ class WordStart(LinePositioner): else: return line.point else: - raise NotAWordError(u"Point is not in a word") + raise NotAWordError("Point is not in a word") WordStart = WordStart() class WordEnd(LinePositioner): @@ -80,7 +80,7 @@ class WordEnd(LinePositioner): else: return line.point else: - raise NotAWordError(u"Point is not in a word") + raise NotAWordError("Point is not in a word") WordEnd = WordEnd() class PrevWordEnd(LinePositioner): @@ -91,10 +91,10 @@ PrevWordEnd = PrevWordEnd() class PrevSpace(LinePositioner): def __call__(self, line): point = line.point - if line[point - 1:point].get_line_text() == u" ": - while point > 0 and line[point - 1:point].get_line_text() == u" ": + if line[point - 1:point].get_line_text() == " ": + while point > 0 and line[point - 1:point].get_line_text() == " ": point -= 1 - while point > 0 and line[point - 1:point].get_line_text() != u" ": + while point > 0 and line[point - 1:point].get_line_text() != " ": point -= 1 return point PrevSpace = PrevSpace() @@ -121,7 +121,7 @@ class Mark(LinePositioner): k = Mark() all_positioners = [(value.__class__.__name__, value) - for key, value in globals().items() + for key, value in list(globals().items()) if isinstance(value, LinePositioner)] all_positioners.sort() @@ -129,7 +129,7 @@ all_positioners.sort() class LineSlice(object): def __call__(self, line): - NotImplementedError(u"Base class !!!") + NotImplementedError("Base class !!!") class CurrentWord(LineSlice): @@ -223,7 +223,7 @@ class TextLine(object): pass def __repr__(self): - return u'TextLine("%s",point=%s,mark=%s)'%(self.line_buffer, self.point, self.mark) + return 'TextLine("%s",point=%s,mark=%s)'%(self.line_buffer, self.point, self.mark) def copy(self): return self.__class__(self) @@ -243,17 +243,17 @@ class TextLine(object): def visible_line_width(self, position = Point): """Return the visible width of the text in line buffer up to position.""" extra_char_width = len([ None for c in self[:position].line_buffer if 0x2013 <= ord(c) <= 0xFFFD]) - return len(self[:position].quoted_text()) + self[:position].line_buffer.count(u"\t")*7 + extra_char_width + return len(self[:position].quoted_text()) + self[:position].line_buffer.count("\t")*7 + extra_char_width def quoted_text(self): quoted = [ quote_char(c) for c in self.line_buffer ] self.line_char_width = [ len(c) for c in quoted ] - return u''.join(map(ensure_unicode, quoted)) + return ''.join(map(ensure_unicode, quoted)) def get_line_text(self): buf = self.line_buffer - buf = map(ensure_unicode, buf) - return u''.join(buf) + buf = list(map(ensure_unicode, buf)) + return ''.join(buf) def set_line(self, text, cursor = None): self.line_buffer = [ c for c in str(text) ] @@ -307,7 +307,7 @@ class TextLine(object): elif isinstance(key, LinePositioner): return self.line_buffer[key(self)] elif isinstance(key, tuple): - raise IndexError(u"Cannot use step in line buffer indexing") #Multiple slice not allowed + raise IndexError("Cannot use step in line buffer indexing") #Multiple slice not allowed else: # return TextLine(self.line_buffer[key]) return self.line_buffer[key] @@ -387,10 +387,10 @@ class TextLine(object): return txt in self.get_line_text() -lines = [TextLine(u"abc"), - TextLine(u"abc def"), - TextLine(u"abc def ghi"), - TextLine(u" abc def "), +lines = [TextLine("abc"), + TextLine("abc def"), + TextLine("abc def ghi"), + TextLine(" abc def "), ] l = lines[2] l.point = 5 @@ -406,8 +406,8 @@ class ReadLineTextBuffer(TextLine): self.kill_ring = [] def __repr__(self): - return u'ReadLineTextBuffer'\ - u'("%s",point=%s,mark=%s,selection_mark=%s)'%\ + return 'ReadLineTextBuffer'\ + '("%s",point=%s,mark=%s,selection_mark=%s)'%\ (self.line_buffer, self.point, self.mark,self.selection_mark) @@ -712,7 +712,7 @@ class ReadLineTextBuffer(TextLine): def copy_region_to_clipboard(self): # () - u'''Copy the text in the region to the windows clipboard.''' + '''Copy the text in the region to the windows clipboard.''' if self.enable_win32_clipboard: mark = min(self.mark, len(self.line_buffer)) cursor = min(self.point, len(self.line_buffer)) @@ -720,11 +720,11 @@ class ReadLineTextBuffer(TextLine): return begin = min(cursor, mark) end = max(cursor, mark) - toclipboard = u"".join(self.line_buffer[begin:end]) + toclipboard = "".join(self.line_buffer[begin:end]) clipboard.SetClipboardText(toclipboard) def copy_selection_to_clipboard(self): # () - u'''Copy the text in the region to the windows clipboard.''' + '''Copy the text in the region to the windows clipboard.''' if self.enable_win32_clipboard and self.enable_selection and self.selection_mark >= 0: selection_mark = min(self.selection_mark,len(self.line_buffer)) cursor = min(self.point,len(self.line_buffer)) @@ -732,7 +732,7 @@ class ReadLineTextBuffer(TextLine): return begin = min(cursor, selection_mark) end = max(cursor, selection_mark) - toclipboard = u"".join(self.line_buffer[begin:end]) + toclipboard = "".join(self.line_buffer[begin:end]) clipboard.SetClipboardText(toclipboard) @@ -755,45 +755,45 @@ class ReadLineTextBuffer(TextLine): ################################################################## -q = ReadLineTextBuffer(u"asff asFArw ewrWErhg", point=8) -q = TextLine(u"asff asFArw ewrWErhg", point=8) +q = ReadLineTextBuffer("asff asFArw ewrWErhg", point=8) +q = TextLine("asff asFArw ewrWErhg", point=8) -def show_pos(buff, pos, chr = u"."): +def show_pos(buff, pos, chr = "."): l = len(buff.line_buffer) def choice(bool): if bool: return chr else: - return u" " - return u"".join([choice(pos==idx) for idx in range(l + 1)]) + return " " + return "".join([choice(pos==idx) for idx in range(l + 1)]) def test_positioner(buff, points, positioner): - print (u" %s "%positioner.__class__.__name__).center(40, u"-") + print((" %s "%positioner.__class__.__name__).center(40, "-")) buffstr = buff.line_buffer - print u'"%s"'%(buffstr) + print('"%s"'%(buffstr)) for point in points: b = TextLine(buff, point = point) - out=[u" "] * (len(buffstr) + 1) + out=[" "] * (len(buffstr) + 1) pos = positioner(b) if pos == point: - out[pos] = u"&" + out[pos] = "&" else: - out[point] = u"." - out[pos] = u"^" - print u'"%s"'%(u"".join(out)) + out[point] = "." + out[pos] = "^" + print('"%s"'%("".join(out))) if __name__ == "__main__": - print u'%-15s "%s"'%(u"Position", q.get_line_text()) - print u'%-15s "%s"'%(u"Point", show_pos(q, q.point)) + print('%-15s "%s"'%("Position", q.get_line_text())) + print('%-15s "%s"'%("Point", show_pos(q, q.point))) for name, positioner in all_positioners: pos = positioner(q) [] - print u'%-15s "%s"'%(name, show_pos(q, pos, u"^")) + print('%-15s "%s"'%(name, show_pos(q, pos, "^"))) - l = ReadLineTextBuffer(u"kjjk asads asad") + l = ReadLineTextBuffer("kjjk asads asad") l.point = EndOfLine diff --git a/pyreadline/lineeditor/wordmatcher.py b/pyreadline/lineeditor/wordmatcher.py index 7454516..a0caa8a 100644 --- a/pyreadline/lineeditor/wordmatcher.py +++ b/pyreadline/lineeditor/wordmatcher.py @@ -20,36 +20,36 @@ def str_find_all(str, ch): return result -word_pattern = re.compile(u"(x*)") +word_pattern = re.compile("(x*)") def markwords(str, iswordfun): - markers = {True : u"x", False : u"o"} + markers = {True : "x", False : "o"} return "".join([markers[iswordfun(ch)] for ch in str]) def split_words(str, iswordfun): - return [x for x in word_pattern.split(markwords(str,iswordfun)) if x != u""] + return [x for x in word_pattern.split(markwords(str,iswordfun)) if x != ""] def mark_start_segment(str, is_segment): def mark_start(s): - if s[0:1] == u"x": - return u"s" + s[1:] + if s[0:1] == "x": + return "s" + s[1:] else: return s - return u"".join(map(mark_start, split_words(str, is_segment))) + return "".join(map(mark_start, split_words(str, is_segment))) def mark_end_segment(str, is_segment): def mark_start(s): - if s[0:1] == u"x": - return s[:-1] + u"s" + if s[0:1] == "x": + return s[:-1] + "s" else: return s - return u"".join(map(mark_start, split_words(str, is_segment))) + return "".join(map(mark_start, split_words(str, is_segment))) def mark_start_segment_index(str, is_segment): - return str_find_all(mark_start_segment(str, is_segment), u"s") + return str_find_all(mark_start_segment(str, is_segment), "s") def mark_end_segment_index(str, is_segment): - return [x + 1 for x in str_find_all(mark_end_segment(str, is_segment), u"s")] + return [x + 1 for x in str_find_all(mark_end_segment(str, is_segment), "s")] ################ Following are used in lineobj ########################### @@ -58,13 +58,13 @@ def is_word_token(str): return not is_non_word_token(str) def is_non_word_token(str): - if len(str) != 1 or str in u" \t\n": + if len(str) != 1 or str in " \t\n": return True else: return False def next_start_segment(str, is_segment): - str = u"".join(str) + str = "".join(str) result = [] for start in mark_start_segment_index(str, is_segment): result[len(result):start] = [start for x in range(start - len(result))] @@ -72,7 +72,7 @@ def next_start_segment(str, is_segment): return result def next_end_segment(str, is_segment): - str = u"".join(str) + str = "".join(str) result = [] for start in mark_end_segment_index(str, is_segment): result[len(result):start] = [start for x in range(start - len(result))] @@ -81,7 +81,7 @@ def next_end_segment(str, is_segment): def prev_start_segment(str, is_segment): - str = u"".join(str) + str = "".join(str) result = [] prev = 0 for start in mark_start_segment_index(str, is_segment): @@ -91,7 +91,7 @@ def prev_start_segment(str, is_segment): return result def prev_end_segment(str, is_segment): - str = u"".join(str) + str = "".join(str) result = [] prev = 0 for start in mark_end_segment_index(str, is_segment): diff --git a/pyreadline/logger.py b/pyreadline/logger.py index 81e3dc4..0c42acb 100644 --- a/pyreadline/logger.py +++ b/pyreadline/logger.py @@ -9,11 +9,11 @@ import socket, logging, logging.handlers from pyreadline.unicode_helper import ensure_str -host = u"localhost" +host = "localhost" port = logging.handlers.DEFAULT_TCP_LOGGING_PORT -pyreadline_logger = logging.getLogger(u'PYREADLINE') +pyreadline_logger = logging.getLogger('PYREADLINE') pyreadline_logger.setLevel(logging.DEBUG) pyreadline_logger.propagate = False formatter = logging.Formatter('%(message)s') @@ -64,7 +64,7 @@ def stop_file_log(): file_handler = None def stop_logging(): - log(u"STOPING LOG") + log("STOPING LOG") stop_file_log() stop_socket_log() diff --git a/pyreadline/logserver.py b/pyreadline/logserver.py index df2f365..5692bce 100644 --- a/pyreadline/logserver.py +++ b/pyreadline/logserver.py @@ -5,21 +5,21 @@ # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #***************************************************************************** -import cPickle +import pickle import logging import logging.handlers -import SocketServer +import socketserver import struct,socket try: import msvcrt except ImportError: msvcrt = None - print u"problem" + print("problem") port = logging.handlers.DEFAULT_TCP_LOGGING_PORT -host = u'localhost' +host = 'localhost' def check_key(): if msvcrt is None: @@ -28,30 +28,30 @@ def check_key(): if msvcrt.kbhit() != 0: q = msvcrt.getch() return q - return u"" + return "" singleline=False def main(): - print u"Starting TCP logserver on port:", port - print u"Press q to quit logserver", port - print u"Press c to clear screen", port + print("Starting TCP logserver on port:", port) + print("Press q to quit logserver", port) + print("Press c to clear screen", port) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.bind((u"", port)) + s.bind(("", port)) s.settimeout(1) while 1: try: data, addr = s.recvfrom(100000) - print data, + print(data, end=' ') except socket.timeout: key = check_key().lower() - if u"q" == key: - print u"Quitting logserver" + if "q" == key: + print("Quitting logserver") break - elif u"c" == key: - print u"\n" * 100 + elif "c" == key: + print("\n" * 100) -if __name__ == u"__main__": +if __name__ == "__main__": main() \ No newline at end of file diff --git a/pyreadline/modes/__init__.py b/pyreadline/modes/__init__.py index b4d6544..ae3e61a 100644 --- a/pyreadline/modes/__init__.py +++ b/pyreadline/modes/__init__.py @@ -1,5 +1,5 @@ __all__=["emacs","notemacs","vi"] -import emacs,notemacs,vi +from . import emacs,notemacs,vi editingmodes=[emacs.EmacsMode,notemacs.NotEmacsMode,vi.ViMode] #add check to ensure all modes have unique mode names \ No newline at end of file diff --git a/pyreadline/modes/basemode.py b/pyreadline/modes/basemode.py index df1147d..cc8704f 100644 --- a/pyreadline/modes/basemode.py +++ b/pyreadline/modes/basemode.py @@ -15,10 +15,11 @@ import pyreadline.lineeditor.history as history import pyreadline.clipboard as clipboard from pyreadline.error import ReadlineError,GetSetError from pyreadline.unicode_helper import ensure_str, ensure_unicode -in_ironpython=u"IronPython" in sys.version +import collections +in_ironpython="IronPython" in sys.version class BaseMode(object): - mode=u"base" + mode="base" def __init__(self,rlobj): self.argument=0 self.rlobj=rlobj @@ -28,10 +29,10 @@ class BaseMode(object): self.prevargument=None self.l_buffer=lineobj.ReadLineTextBuffer("") self._history=history.LineHistory() - self.completer_delims = u" \t\n\"\\'`@$><=;|&{(" - self.show_all_if_ambiguous = u'off' - self.mark_directories = u'on' - self.complete_filesystem = u'off' + self.completer_delims = " \t\n\"\\'`@$><=;|&{(" + self.show_all_if_ambiguous = 'off' + self.mark_directories = 'on' + self.complete_filesystem = 'off' self.completer = None self.begidx = 0 self.endidx = 0 @@ -41,7 +42,7 @@ class BaseMode(object): self.first_prompt = True self.cursor_size=25 - self.prompt = u">>> " + self.prompt = ">>> " #Paste settings #assumes data on clipboard is path if shorter than 300 characters and doesn't contain \t or \n @@ -58,7 +59,7 @@ class BaseMode(object): def __repr__(self): - return u"" + return "" def _gs(x): def g(self): @@ -81,29 +82,29 @@ class BaseMode(object): argument_reset=property(_argreset) #used in readline - ctrl_c_tap_time_interval=property(*_gs(u"ctrl_c_tap_time_interval")) - allow_ctrl_c=property(*_gs(u"allow_ctrl_c")) - _print_prompt=property(_g(u"_print_prompt")) - _update_line=property(_g(u"_update_line")) - console=property(_g(u"console")) - prompt_begin_pos=property(_g(u"prompt_begin_pos")) - prompt_end_pos=property(_g(u"prompt_end_pos")) + ctrl_c_tap_time_interval=property(*_gs("ctrl_c_tap_time_interval")) + allow_ctrl_c=property(*_gs("allow_ctrl_c")) + _print_prompt=property(_g("_print_prompt")) + _update_line=property(_g("_update_line")) + console=property(_g("console")) + prompt_begin_pos=property(_g("prompt_begin_pos")) + prompt_end_pos=property(_g("prompt_end_pos")) #used in completer _completions # completer_delims=property(*_gs("completer_delims")) - _bell=property(_g(u"_bell")) - bell_style=property(_g(u"bell_style")) + _bell=property(_g("_bell")) + bell_style=property(_g("bell_style")) #used in emacs - _clear_after=property(_g(u"_clear_after")) - _update_prompt_pos=property(_g(u"_update_prompt_pos")) + _clear_after=property(_g("_clear_after")) + _update_prompt_pos=property(_g("_update_prompt_pos")) #not used in basemode or emacs def process_keyevent(self, keyinfo): raise NotImplementedError - def readline_setup(self, prompt=u''): + def readline_setup(self, prompt=''): self.l_buffer.selection_mark=-1 if self.first_prompt: self.first_prompt = False @@ -111,7 +112,7 @@ class BaseMode(object): try: self.startup_hook() except: - print u'startup hook failed' + print('startup hook failed') traceback.print_exc() self.l_buffer.reset_line() @@ -121,7 +122,7 @@ class BaseMode(object): try: self.pre_input_hook() except: - print u'pre_input_hook failed' + print('pre_input_hook failed') traceback.print_exc() self.pre_input_hook = None @@ -130,7 +131,7 @@ class BaseMode(object): def finalize(self): - u"""Every bindable command should call this function for cleanup. + """Every bindable command should call this function for cleanup. Except those that want to set argument to a non-zero value. """ self.argument=0 @@ -142,13 +143,13 @@ class BaseMode(object): #Create key bindings: def rl_settings_to_string(self): - out=[u"%-20s: %s"%(u"show all if ambigous",self.show_all_if_ambiguous)] - out.append(u"%-20s: %s"%(u"mark_directories",self.mark_directories)) - out.append(u"%-20s: %s"%(u"bell_style",self.bell_style)) - out.append(u"------------- key bindings ------------") - tablepat=u"%-7s %-7s %-7s %-15s %-15s " - out.append(tablepat%(u"Control",u"Meta",u"Shift",u"Keycode/char",u"Function")) - bindings=[(k[0],k[1],k[2],k[3],v.__name__) for k,v in self.key_dispatch.iteritems()] + out=["%-20s: %s"%("show all if ambigous",self.show_all_if_ambiguous)] + out.append("%-20s: %s"%("mark_directories",self.mark_directories)) + out.append("%-20s: %s"%("bell_style",self.bell_style)) + out.append("------------- key bindings ------------") + tablepat="%-7s %-7s %-7s %-15s %-15s " + out.append(tablepat%("Control","Meta","Shift","Keycode/char","Function")) + bindings=[(k[0],k[1],k[2],k[3],v.__name__) for k,v in self.key_dispatch.items()] bindings.sort() for key in bindings: out.append(tablepat%(key)) @@ -156,16 +157,16 @@ class BaseMode(object): def _bind_key(self, key, func): - u"""setup the mapping from key to call the function.""" - if not callable(func): - print u"Trying to bind non method to keystroke:%s,%s"%(key,func) - raise ReadlineError(u"Trying to bind non method to keystroke:%s,%s,%s,%s"%(key,func,type(func),type(self._bind_key))) + """setup the mapping from key to call the function.""" + if not isinstance(func, collections.Callable): + print("Trying to bind non method to keystroke:%s,%s"%(key,func)) + raise ReadlineError("Trying to bind non method to keystroke:%s,%s,%s,%s"%(key,func,type(func),type(self._bind_key))) keyinfo = make_KeyPress_from_keydescr(key.lower()).tuple() - log(u">>>%s -> %s<<<"%(keyinfo,func.__name__)) + log(">>>%s -> %s<<<"%(keyinfo,func.__name__)) self.key_dispatch[keyinfo] = func def _bind_exit_key(self, key): - u"""setup the mapping from key to call the function.""" + """setup the mapping from key to call the function.""" keyinfo = make_KeyPress_from_keydescr(key.lower()).tuple() self.exit_dispatch[keyinfo] = None @@ -190,8 +191,8 @@ class BaseMode(object): if buf[self.begidx] in self.completer_delims: self.begidx += 1 break - text = ensure_str(u''.join(buf[self.begidx:self.endidx])) - log(u'complete text="%s"' % ensure_unicode(text)) + text = ensure_str(''.join(buf[self.begidx:self.endidx])) + log('complete text="%s"' % ensure_unicode(text)) i = 0 while 1: try: @@ -205,18 +206,18 @@ class BaseMode(object): completions.append(r) else: pass - log(u'text completions=<%s>' % map(ensure_unicode, completions)) + log('text completions=<%s>' % list(map(ensure_unicode, completions))) if (self.complete_filesystem == "on") and not completions: # get the filename to complete while self.begidx > 0: self.begidx -= 1 - if buf[self.begidx] in u' \t\n': + if buf[self.begidx] in ' \t\n': self.begidx += 1 break - text = ensure_str(u''.join(buf[self.begidx:self.endidx])) - log(u'file complete text="%s"' % ensure_unicode(text)) - completions = map(ensure_unicode, glob.glob(os.path.expanduser(text) + '*')) - if self.mark_directories == u'on': + text = ensure_str(''.join(buf[self.begidx:self.endidx])) + log('file complete text="%s"' % ensure_unicode(text)) + completions = list(map(ensure_unicode, glob.glob(os.path.expanduser(text) + '*'))) + if self.mark_directories == 'on': mc = [] for f in completions: if os.path.isdir(f): @@ -224,32 +225,32 @@ class BaseMode(object): else: mc.append(f) completions = mc - log(u'fnames=<%s>' % map(ensure_unicode, completions)) + log('fnames=<%s>' % list(map(ensure_unicode, completions))) return completions def _display_completions(self, completions): if not completions: return - self.console.write(u'\n') - wmax = max(map(len, completions)) + self.console.write('\n') + wmax = max(list(map(len, completions))) w, h = self.console.size() cols = max(1, int((w-1) / (wmax+1))) rows = int(math.ceil(float(len(completions)) / cols)) for row in range(rows): - s = u'' + s = '' for col in range(cols): i = col*rows + row if i < len(completions): self.console.write(completions[i].ljust(wmax+1)) - self.console.write(u'\n') + self.console.write('\n') if in_ironpython: self.prompt=sys.ps1 self._print_prompt() def complete(self, e): # (TAB) - u"""Attempt to perform completion on the text before point. The + """Attempt to perform completion on the text before point. The actual completion performed is application-specific. The default is filename completion.""" completions = self._get_completions() @@ -261,7 +262,7 @@ class BaseMode(object): self.l_buffer[self.begidx:self.endidx] = rep self.l_buffer.point = point + len(rep) - (self.endidx - self.begidx) if len(completions) > 1: - if self.show_all_if_ambiguous == u'on': + if self.show_all_if_ambiguous == 'on': self._display_completions(completions) else: self._bell() @@ -270,13 +271,13 @@ class BaseMode(object): self.finalize() def possible_completions(self, e): # (M-?) - u"""List the possible completions of the text before point. """ + """List the possible completions of the text before point. """ completions = self._get_completions() self._display_completions(completions) self.finalize() def insert_completions(self, e): # (M-*) - u"""Insert all completions of the text before point that would have + """Insert all completions of the text before point that would have been generated by possible-completions.""" completions = self._get_completions() b = self.begidx @@ -291,7 +292,7 @@ class BaseMode(object): self.finalize() def menu_complete(self, e): # () - u"""Similar to complete, but replaces the word to be completed with a + """Similar to complete, but replaces the word to be completed with a single match from the list of possible completions. Repeated execution of menu-complete steps through the list of possible completions, inserting each match in turn. At the end of the list of @@ -306,95 +307,95 @@ class BaseMode(object): def insert_text(self, string): - u"""Insert text into the command line.""" + """Insert text into the command line.""" self.l_buffer.insert_text(string, self.argument_reset) self.finalize() def beginning_of_line(self, e): # (C-a) - u"""Move to the start of the current line. """ + """Move to the start of the current line. """ self.l_buffer.beginning_of_line() self.finalize() def end_of_line(self, e): # (C-e) - u"""Move to the end of the line. """ + """Move to the end of the line. """ self.l_buffer.end_of_line() self.finalize() def forward_char(self, e): # (C-f) - u"""Move forward a character. """ + """Move forward a character. """ self.l_buffer.forward_char(self.argument_reset) self.finalize() def backward_char(self, e): # (C-b) - u"""Move back a character. """ + """Move back a character. """ self.l_buffer.backward_char(self.argument_reset) self.finalize() def forward_word(self, e): # (M-f) - u"""Move forward to the end of the next word. Words are composed of + """Move forward to the end of the next word. Words are composed of letters and digits.""" self.l_buffer.forward_word(self.argument_reset) self.finalize() def backward_word(self, e): # (M-b) - u"""Move back to the start of the current or previous word. Words are + """Move back to the start of the current or previous word. Words are composed of letters and digits.""" self.l_buffer.backward_word(self.argument_reset) self.finalize() def forward_word_end(self, e): # () - u"""Move forward to the end of the next word. Words are composed of + """Move forward to the end of the next word. Words are composed of letters and digits.""" self.l_buffer.forward_word_end(self.argument_reset) self.finalize() def backward_word_end(self, e): # () - u"""Move forward to the end of the next word. Words are composed of + """Move forward to the end of the next word. Words are composed of letters and digits.""" self.l_buffer.backward_word_end(self.argument_reset) self.finalize() ### Movement with extend selection def beginning_of_line_extend_selection(self, e): # - u"""Move to the start of the current line. """ + """Move to the start of the current line. """ self.l_buffer.beginning_of_line_extend_selection() self.finalize() def end_of_line_extend_selection(self, e): # - u"""Move to the end of the line. """ + """Move to the end of the line. """ self.l_buffer.end_of_line_extend_selection() self.finalize() def forward_char_extend_selection(self, e): # - u"""Move forward a character. """ + """Move forward a character. """ self.l_buffer.forward_char_extend_selection(self.argument_reset) self.finalize() def backward_char_extend_selection(self, e): # - u"""Move back a character. """ + """Move back a character. """ self.l_buffer.backward_char_extend_selection(self.argument_reset) self.finalize() def forward_word_extend_selection(self, e): # - u"""Move forward to the end of the next word. Words are composed of + """Move forward to the end of the next word. Words are composed of letters and digits.""" self.l_buffer.forward_word_extend_selection(self.argument_reset) self.finalize() def backward_word_extend_selection(self, e): # - u"""Move back to the start of the current or previous word. Words are + """Move back to the start of the current or previous word. Words are composed of letters and digits.""" self.l_buffer.backward_word_extend_selection(self.argument_reset) self.finalize() def forward_word_end_extend_selection(self, e): # - u"""Move forward to the end of the next word. Words are composed of + """Move forward to the end of the next word. Words are composed of letters and digits.""" self.l_buffer.forward_word_end_extend_selection(self.argument_reset) self.finalize() def backward_word_end_extend_selection(self, e): # - u"""Move forward to the end of the next word. Words are composed of + """Move forward to the end of the next word. Words are composed of letters and digits.""" self.l_buffer.forward_word_end_extend_selection(self.argument_reset) self.finalize() @@ -403,19 +404,19 @@ class BaseMode(object): ######## Change case def upcase_word(self, e): # (M-u) - u"""Uppercase the current (or following) word. With a negative + """Uppercase the current (or following) word. With a negative argument, uppercase the previous word, but do not move the cursor.""" self.l_buffer.upcase_word() self.finalize() def downcase_word(self, e): # (M-l) - u"""Lowercase the current (or following) word. With a negative + """Lowercase the current (or following) word. With a negative argument, lowercase the previous word, but do not move the cursor.""" self.l_buffer.downcase_word() self.finalize() def capitalize_word(self, e): # (M-c) - u"""Capitalize the current (or following) word. With a negative + """Capitalize the current (or following) word. With a negative argument, capitalize the previous word, but do not move the cursor.""" self.l_buffer.capitalize_word() self.finalize() @@ -423,17 +424,17 @@ class BaseMode(object): ######## def clear_screen(self, e): # (C-l) - u"""Clear the screen and redraw the current line, leaving the current + """Clear the screen and redraw the current line, leaving the current line at the top of the screen.""" self.console.page() self.finalize() def redraw_current_line(self, e): # () - u"""Refresh the current line. By default, this is unbound.""" + """Refresh the current line. By default, this is unbound.""" self.finalize() def accept_line(self, e): # (Newline or Return) - u"""Accept the line regardless of where the cursor is. If this line + """Accept the line regardless of where the cursor is. If this line is non-empty, it may be added to the history list for future recall with add_history(). If this line is a modified history line, the history line is restored to its original state.""" @@ -441,37 +442,37 @@ class BaseMode(object): return True def delete_char(self, e): # (C-d) - u"""Delete the character at point. If point is at the beginning of + """Delete the character at point. If point is at the beginning of the line, there are no characters in the line, and the last character typed was not bound to delete-char, then return EOF.""" self.l_buffer.delete_char(self.argument_reset) self.finalize() def backward_delete_char(self, e): # (Rubout) - u"""Delete the character behind the cursor. A numeric argument means + """Delete the character behind the cursor. A numeric argument means to kill the characters instead of deleting them.""" self.l_buffer.backward_delete_char(self.argument_reset) self.finalize() def backward_delete_word(self, e): # (Control-Rubout) - u"""Delete the character behind the cursor. A numeric argument means + """Delete the character behind the cursor. A numeric argument means to kill the characters instead of deleting them.""" self.l_buffer.backward_delete_word(self.argument_reset) self.finalize() def forward_delete_word(self, e): # (Control-Delete) - u"""Delete the character behind the cursor. A numeric argument means + """Delete the character behind the cursor. A numeric argument means to kill the characters instead of deleting them.""" self.l_buffer.forward_delete_word(self.argument_reset) self.finalize() def delete_horizontal_space(self, e): # () - u"""Delete all spaces and tabs around point. By default, this is unbound. """ + """Delete all spaces and tabs around point. By default, this is unbound. """ self.l_buffer.delete_horizontal_space() self.finalize() def self_insert(self, e): # (a, b, A, 1, !, ...) - u"""Insert yourself. """ + """Insert yourself. """ if e.char and ord(e.char)!=0: #don't insert null character in buffer, can happen with dead keys. self.insert_text(e.char) self.finalize() @@ -480,17 +481,17 @@ class BaseMode(object): # Paste from clipboard def paste(self,e): - u"""Paste windows clipboard. + """Paste windows clipboard. Assume single line strip other lines and end of line markers and trailing spaces""" #(Control-v) if self.enable_win32_clipboard: txt=clipboard.get_clipboard_text_and_convert(False) txt=txt.split("\n")[0].strip("\r").strip("\n") - log("paste: >%s<"%map(ord,txt)) + log("paste: >%s<"%list(map(ord,txt))) self.insert_text(txt) self.finalize() def paste_mulitline_code(self,e): - u"""Paste windows clipboard as multiline code. + """Paste windows clipboard as multiline code. Removes any empty lines in the code""" reg=re.compile("\r?\n") if self.enable_win32_clipboard: @@ -508,7 +509,7 @@ class BaseMode(object): self.finalize() def ipython_paste(self,e): - u"""Paste windows clipboard. If enable_ipython_paste_list_of_lists is + """Paste windows clipboard. If enable_ipython_paste_list_of_lists is True then try to convert tabseparated data to repr of list of lists or repr of array. If enable_ipython_paste_for_paths==True then change \\ to / and spaces to \space""" @@ -523,39 +524,39 @@ class BaseMode(object): def copy_region_to_clipboard(self, e): # () - u"""Copy the text in the region to the windows clipboard.""" + """Copy the text in the region to the windows clipboard.""" self.l_buffer.copy_region_to_clipboard() self.finalize() def copy_selection_to_clipboard(self, e): # () - u"""Copy the text in the region to the windows clipboard.""" + """Copy the text in the region to the windows clipboard.""" self.l_buffer.copy_selection_to_clipboard() self.finalize() def cut_selection_to_clipboard(self, e): # () - u"""Copy the text in the region to the windows clipboard.""" + """Copy the text in the region to the windows clipboard.""" self.l_buffer.cut_selection_to_clipboard() self.finalize() def dump_functions(self, e): # () - u"""Print all of the functions and their key bindings to the Readline + """Print all of the functions and their key bindings to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.""" - print + print() txt="\n".join(self.rl_settings_to_string()) - print txt + print(txt) self._print_prompt() self.finalize() def commonprefix(m): - u"Given a list of pathnames, returns the longest common leading component" - if not m: return u'' + "Given a list of pathnames, returns the longest common leading component" + if not m: return '' prefix = m[0] for item in m: for i in range(len(prefix)): if prefix[:i+1].lower() != item[:i+1].lower(): prefix = prefix[:i] - if i == 0: return u'' + if i == 0: return '' break return prefix diff --git a/pyreadline/modes/emacs.py b/pyreadline/modes/emacs.py index a388b91..80b4837 100644 --- a/pyreadline/modes/emacs.py +++ b/pyreadline/modes/emacs.py @@ -12,7 +12,7 @@ from pyreadline.logger import log from pyreadline.lineeditor.lineobj import Point import pyreadline.lineeditor.lineobj as lineobj import pyreadline.lineeditor.history as history -import basemode +from . import basemode from pyreadline.unicode_helper import ensure_unicode @@ -21,9 +21,9 @@ def format(keyinfo): k = keyinfo + (-1,) else: k = keyinfo + (ord(keyinfo[-1]),) - return u"(%s,%s,%s,%s,%x)"%k + return "(%s,%s,%s,%s,%x)"%k -in_ironpython = u"IronPython" in sys.version +in_ironpython = "IronPython" in sys.version class IncrementalSearchPromptMode(object): @@ -32,20 +32,20 @@ class IncrementalSearchPromptMode(object): def _process_incremental_search_keyevent(self, keyinfo): keytuple = keyinfo.tuple() - log(u"IncrementalSearchPromptMode %s %s"%(keyinfo, keytuple)) - if keyinfo.keyname == u'backspace': + log("IncrementalSearchPromptMode %s %s"%(keyinfo, keytuple)) + if keyinfo.keyname == 'backspace': self.subsearch_query = self.subsearch_query[:-1] if len(self.subsearch_query) > 0: self.line = self.subsearch_fun(self.subsearch_query) else: self._bell() self.line = "" # empty query means no search result - elif keyinfo.keyname in [u'return', u'escape']: + elif keyinfo.keyname in ['return', 'escape']: self._bell() self.prompt = self.subsearch_oldprompt self.process_keyevent_queue = self.process_keyevent_queue[:-1] self._history.history_cursor = len(self._history.history) - if keyinfo.keyname == u'escape': + if keyinfo.keyname == 'escape': self.l_buffer.set_line(self.subsearch_old_line) return False elif keyinfo.keyname: @@ -62,11 +62,11 @@ class IncrementalSearchPromptMode(object): self.l_buffer.set_line(self.line) def _init_incremental_search(self, searchfun, direction, init_event): - u"""Initialize search prompt + """Initialize search prompt """ self.subsearch_init_event = init_event.tuple() self.subsearch_direction = direction - self.subsearch_query = u'' + self.subsearch_query = '' self.subsearch_fun = searchfun self.subsearch_old_line = self.l_buffer.get_line_text() @@ -80,16 +80,16 @@ class IncrementalSearchPromptMode(object): self.subsearch_query = self.l_buffer[0:Point].get_line_text() if self.subsearch_direction < 0: - self.subsearch_prompt = u"reverse-i-search`%s': " + self.subsearch_prompt = "reverse-i-search`%s': " else: - self.subsearch_prompt = u"forward-i-search`%s': " + self.subsearch_prompt = "forward-i-search`%s': " self.prompt = self.subsearch_prompt%"" if self.subsearch_query: self.line = self._process_incremental_search_keyevent(init_event) else: - self.line = u"" + self.line = "" class SearchPromptMode(object): @@ -98,12 +98,12 @@ class SearchPromptMode(object): def _process_non_incremental_search_keyevent(self, keyinfo): keytuple = keyinfo.tuple() - log(u"SearchPromptMode %s %s"%(keyinfo, keytuple)) + log("SearchPromptMode %s %s"%(keyinfo, keytuple)) history = self._history - if keyinfo.keyname == u'backspace': + if keyinfo.keyname == 'backspace': self.non_inc_query = self.non_inc_query[:-1] - elif keyinfo.keyname in [u'return', u'escape']: + elif keyinfo.keyname in ['return', 'escape']: if self.non_inc_query: if self.non_inc_direction == -1: res = history.reverse_search_history(self.non_inc_query) @@ -114,7 +114,7 @@ class SearchPromptMode(object): self.prompt = self.non_inc_oldprompt self.process_keyevent_queue = self.process_keyevent_queue[:-1] self._history.history_cursor = len(self._history.history) - if keyinfo.keyname == u'escape': + if keyinfo.keyname == 'escape': self.l_buffer = self.non_inc_oldline else: self.l_buffer.set_line(res) @@ -125,26 +125,26 @@ class SearchPromptMode(object): self.non_inc_query += keyinfo.char else: pass - self.prompt = self.non_inc_oldprompt + u":" + self.non_inc_query + self.prompt = self.non_inc_oldprompt + ":" + self.non_inc_query def _init_non_i_search(self, direction): self.non_inc_direction = direction - self.non_inc_query = u"" + self.non_inc_query = "" self.non_inc_oldprompt = self.prompt self.non_inc_oldline = self.l_buffer.copy() self.l_buffer.reset_line() - self.prompt = self.non_inc_oldprompt + u":" + self.prompt = self.non_inc_oldprompt + ":" queue = self.process_keyevent_queue queue.append(self._process_non_incremental_search_keyevent) def non_incremental_reverse_search_history(self, e): # (M-p) - u'''Search backward starting at the current line and moving up + '''Search backward starting at the current line and moving up through the history as necessary using a non-incremental search for a string supplied by the user.''' return self._init_non_i_search(-1) def non_incremental_forward_search_history(self, e): # (M-n) - u'''Search forward starting at the current line and moving down + '''Search forward starting at the current line and moving down through the the history as necessary using a non-incremental search for a string supplied by the user.''' return self._init_non_i_search(1) @@ -159,24 +159,24 @@ class DigitArgumentMode(object): pass def _process_digit_argument_keyevent(self, keyinfo): - log(u"DigitArgumentMode.keyinfo %s"%keyinfo) + log("DigitArgumentMode.keyinfo %s"%keyinfo) keytuple = keyinfo.tuple() - log(u"DigitArgumentMode.keytuple %s %s"%(keyinfo, keytuple)) + log("DigitArgumentMode.keytuple %s %s"%(keyinfo, keytuple)) if keyinfo.keyname in ['return']: self.prompt = self._digit_argument_oldprompt self.process_keyevent_queue = self.process_keyevent_queue[:-1] return True elif keyinfo.keyname: pass - elif (keyinfo.char in u"0123456789" and + elif (keyinfo.char in "0123456789" and keyinfo.control == False and keyinfo.meta == False): - log(u"arg %s %s"%(self.argument, keyinfo.char)) + log("arg %s %s"%(self.argument, keyinfo.char)) self.argument = self.argument * 10 + int(keyinfo.char) else: self.prompt = self._digit_argument_oldprompt raise LeaveModeTryNext - self.prompt = u"(arg: %s) "%self.argument + self.prompt = "(arg: %s) "%self.argument def _init_digit_argument(self, keyinfo): """Initialize search prompt @@ -190,11 +190,11 @@ class DigitArgumentMode(object): if keyinfo.char == "-": self.argument = -1 - elif keyinfo.char in u"0123456789": + elif keyinfo.char in "0123456789": self.argument = int(keyinfo.char) - log(u"<%s> %s"%(self.argument, type(self.argument))) - self.prompt = u"(arg: %s) "%self.argument - log(u"arg-init %s %s"%(self.argument, keyinfo.char)) + log("<%s> %s"%(self.argument, type(self.argument))) + self.prompt = "(arg: %s) "%self.argument + log("arg-init %s %s"%(self.argument, keyinfo.char)) class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, @@ -208,18 +208,18 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, DigitArgumentMode.__init__(self, rlobj) self._keylog = (lambda x, y: None) self.previous_func = None - self.prompt = u">>> " + self.prompt = ">>> " self._insert_verbatim = False self.next_meta = False # True to force meta on next character self.process_keyevent_queue = [self._process_keyevent] def __repr__(self): - return u"" + return "" def add_key_logger(self, logfun): - u"""logfun should be function that takes disp_fun and line_"""\ - u"""buffer object """ + """logfun should be function that takes disp_fun and line_"""\ + """buffer object """ self._keylog = logfun def process_keyevent(self, keyinfo): @@ -234,10 +234,10 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, return False def _process_keyevent(self, keyinfo): - u"""return True when line is final + """return True when line is final """ #Process exit keys. Only exit on empty line - log(u"_process_keyevent <%s>"%keyinfo) + log("_process_keyevent <%s>"%keyinfo) def nop(e): pass @@ -254,7 +254,7 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, if keytuple in self.exit_dispatch: pars = (self.l_buffer, lineobj.EndOfLine(self.l_buffer)) - log(u"exit_dispatch:<%s, %s>"%pars) + log("exit_dispatch:<%s, %s>"%pars) if lineobj.EndOfLine(self.l_buffer) == 0: raise EOFError if keyinfo.keyname or keyinfo.control or keyinfo.meta: @@ -263,7 +263,7 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, default = self.self_insert dispatch_func = self.key_dispatch.get(keytuple, default) - log(u"readline from keyboard:<%s,%s>"%(keytuple, dispatch_func)) + log("readline from keyboard:<%s,%s>"%(keytuple, dispatch_func)) r = None if dispatch_func: @@ -276,38 +276,38 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, ######### History commands def previous_history(self, e): # (C-p) - u'''Move back through the history list, fetching the previous + '''Move back through the history list, fetching the previous command. ''' self._history.previous_history(self.l_buffer) self.l_buffer.point = lineobj.EndOfLine self.finalize() def next_history(self, e): # (C-n) - u'''Move forward through the history list, fetching the next + '''Move forward through the history list, fetching the next command. ''' self._history.next_history(self.l_buffer) self.finalize() def beginning_of_history(self, e): # (M-<) - u'''Move to the first line in the history.''' + '''Move to the first line in the history.''' self._history.beginning_of_history() self.finalize() def end_of_history(self, e): # (M->) - u'''Move to the end of the input history, i.e., the line currently + '''Move to the end of the input history, i.e., the line currently being entered.''' self._history.end_of_history(self.l_buffer) self.finalize() def reverse_search_history(self, e): # (C-r) - u'''Search backward starting at the current line and moving up + '''Search backward starting at the current line and moving up through the history as necessary. This is an incremental search.''' self._init_incremental_search(self._history.reverse_search_history, -1, e) self.finalize() def forward_search_history(self, e): # (C-s) - u'''Search forward starting at the current line and moving down + '''Search forward starting at the current line and moving down through the the history as necessary. This is an incremental search.''' self._init_incremental_search(self._history.forward_search_history, @@ -315,7 +315,7 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def history_search_forward(self, e): # () - u'''Search forward through the history for the string of characters + '''Search forward through the history for the string of characters between the start of the current line and the point. This is a non-incremental search. By default, this command is unbound.''' if (self.previous_func and @@ -330,7 +330,7 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def history_search_backward(self, e): # () - u'''Search backward through the history for the string of characters + '''Search backward through the history for the string of characters between the start of the current line and the point. This is a non-incremental search. By default, this command is unbound.''' if (self.previous_func and @@ -345,7 +345,7 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def yank_nth_arg(self, e): # (M-C-y) - u'''Insert the first argument to the previous command (usually the + '''Insert the first argument to the previous command (usually the second word on the previous line) at point. With an argument n, insert the nth word from the previous command (the words in the previous command begin with word 0). A negative argument inserts the @@ -353,33 +353,33 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def yank_last_arg(self, e): # (M-. or M-_) - u'''Insert last argument to the previous command (the last word of + '''Insert last argument to the previous command (the last word of the previous history entry). With an argument, behave exactly like yank-nth-arg. Successive calls to yank-last-arg move back through the history list, inserting the last argument of each line in turn.''' self.finalize() def forward_backward_delete_char(self, e): # () - u'''Delete the character under the cursor, unless the cursor is at + '''Delete the character under the cursor, unless the cursor is at the end of the line, in which case the character behind the cursor is deleted. By default, this is not bound to a key.''' self.finalize() def quoted_insert(self, e): # (C-q or C-v) - u'''Add the next character typed to the line verbatim. This is how to + '''Add the next character typed to the line verbatim. This is how to insert key sequences like C-q, for example.''' self._insert_verbatim = True self.finalize() def tab_insert(self, e): # (M-TAB) - u'''Insert a tab character. ''' + '''Insert a tab character. ''' cursor = min(self.l_buffer.point, len(self.l_buffer.line_buffer)) ws = ' ' * (self.tabstop - (cursor % self.tabstop)) self.insert_text(ws) self.finalize() def transpose_chars(self, e): # (C-t) - u'''Drag the character before the cursor forward over the character + '''Drag the character before the cursor forward over the character at the cursor, moving the cursor forward as well. If the insertion point is at the end of the line, then this transposes the last two characters of the line. Negative arguments have no effect.''' @@ -387,14 +387,14 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def transpose_words(self, e): # (M-t) - u'''Drag the word before point past the word after point, moving + '''Drag the word before point past the word after point, moving point past that word as well. If the insertion point is at the end of the line, this transposes the last two words on the line.''' self.l_buffer.transpose_words() self.finalize() def overwrite_mode(self, e): # () - u'''Toggle overwrite mode. With an explicit positive numeric + '''Toggle overwrite mode. With an explicit positive numeric argument, switches to overwrite mode. With an explicit non-positive numeric argument, switches to insert mode. This command affects only emacs mode; vi mode does overwrite differently. Each call to @@ -405,30 +405,30 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def kill_line(self, e): # (C-k) - u'''Kill the text from point to the end of the line. ''' + '''Kill the text from point to the end of the line. ''' self.l_buffer.kill_line() self.finalize() def backward_kill_line(self, e): # (C-x Rubout) - u'''Kill backward to the beginning of the line. ''' + '''Kill backward to the beginning of the line. ''' self.l_buffer.backward_kill_line() self.finalize() def unix_line_discard(self, e): # (C-u) - u'''Kill backward from the cursor to the beginning of the current + '''Kill backward from the cursor to the beginning of the current line. ''' # how is this different from backward_kill_line? self.l_buffer.unix_line_discard() self.finalize() def kill_whole_line(self, e): # () - u'''Kill all characters on the current line, no matter where point + '''Kill all characters on the current line, no matter where point is. By default, this is unbound.''' self.l_buffer.kill_whole_line() self.finalize() def kill_word(self, e): # (M-d) - u'''Kill from point to the end of the current word, or if between + '''Kill from point to the end of the current word, or if between words, to the end of the next word. Word boundaries are the same as forward-word.''' self.l_buffer.kill_word() @@ -437,133 +437,133 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, forward_kill_word = kill_word def backward_kill_word(self, e): # (M-DEL) - u'''Kill the word behind point. Word boundaries are the same as + '''Kill the word behind point. Word boundaries are the same as backward-word. ''' self.l_buffer.backward_kill_word() self.finalize() def unix_word_rubout(self, e): # (C-w) - u'''Kill the word behind point, using white space as a word + '''Kill the word behind point, using white space as a word boundary. The killed text is saved on the kill-ring.''' self.l_buffer.unix_word_rubout() self.finalize() def kill_region(self, e): # () - u'''Kill the text in the current region. By default, this command is + '''Kill the text in the current region. By default, this command is unbound. ''' self.finalize() def copy_region_as_kill(self, e): # () - u'''Copy the text in the region to the kill buffer, so it can be + '''Copy the text in the region to the kill buffer, so it can be yanked right away. By default, this command is unbound.''' self.finalize() def copy_backward_word(self, e): # () - u'''Copy the word before point to the kill buffer. The word + '''Copy the word before point to the kill buffer. The word boundaries are the same as backward-word. By default, this command is unbound.''' self.finalize() def copy_forward_word(self, e): # () - u'''Copy the word following point to the kill buffer. The word + '''Copy the word following point to the kill buffer. The word boundaries are the same as forward-word. By default, this command is unbound.''' self.finalize() def yank(self, e): # (C-y) - u'''Yank the top of the kill ring into the buffer at point. ''' + '''Yank the top of the kill ring into the buffer at point. ''' self.l_buffer.yank() self.finalize() def yank_pop(self, e): # (M-y) - u'''Rotate the kill-ring, and yank the new top. You can only do this + '''Rotate the kill-ring, and yank the new top. You can only do this if the prior command is yank or yank-pop.''' self.l_buffer.yank_pop() self.finalize() def delete_char_or_list(self, e): # () - u'''Deletes the character under the cursor if not at the beginning or + '''Deletes the character under the cursor if not at the beginning or end of the line (like delete-char). If at the end of the line, behaves identically to possible-completions. This command is unbound by default.''' self.finalize() def start_kbd_macro(self, e): # (C-x () - u'''Begin saving the characters typed into the current keyboard + '''Begin saving the characters typed into the current keyboard macro. ''' self.finalize() def end_kbd_macro(self, e): # (C-x )) - u'''Stop saving the characters typed into the current keyboard macro + '''Stop saving the characters typed into the current keyboard macro and save the definition.''' self.finalize() def call_last_kbd_macro(self, e): # (C-x e) - u'''Re-execute the last keyboard macro defined, by making the + '''Re-execute the last keyboard macro defined, by making the characters in the macro appear as if typed at the keyboard.''' self.finalize() def re_read_init_file(self, e): # (C-x C-r) - u'''Read in the contents of the inputrc file, and incorporate any + '''Read in the contents of the inputrc file, and incorporate any bindings or variable assignments found there.''' self.finalize() def abort(self, e): # (C-g) - u'''Abort the current editing command and ring the terminals bell + '''Abort the current editing command and ring the terminals bell (subject to the setting of bell-style).''' self._bell() self.finalize() def do_uppercase_version(self, e): # (M-a, M-b, M-x, ...) - u'''If the metafied character x is lowercase, run the command that is + '''If the metafied character x is lowercase, run the command that is bound to the corresponding uppercase character.''' self.finalize() def prefix_meta(self, e): # (ESC) - u'''Metafy the next character typed. This is for keyboards without a + '''Metafy the next character typed. This is for keyboards without a meta key. Typing ESC f is equivalent to typing M-f. ''' self.next_meta = True self.finalize() def undo(self, e): # (C-_ or C-x C-u) - u'''Incremental undo, separately remembered for each line.''' + '''Incremental undo, separately remembered for each line.''' self.l_buffer.pop_undo() self.finalize() def revert_line(self, e): # (M-r) - u'''Undo all changes made to this line. This is like executing the + '''Undo all changes made to this line. This is like executing the undo command enough times to get back to the beginning.''' self.finalize() def tilde_expand(self, e): # (M-~) - u'''Perform tilde expansion on the current word.''' + '''Perform tilde expansion on the current word.''' self.finalize() def set_mark(self, e): # (C-@) - u'''Set the mark to the point. If a numeric argument is supplied, the + '''Set the mark to the point. If a numeric argument is supplied, the mark is set to that position.''' self.l_buffer.set_mark() self.finalize() def exchange_point_and_mark(self, e): # (C-x C-x) - u'''Swap the point with the mark. The current cursor position is set + '''Swap the point with the mark. The current cursor position is set to the saved position, and the old cursor position is saved as the mark.''' self.finalize() def character_search(self, e): # (C-]) - u'''A character is read and point is moved to the next occurrence of + '''A character is read and point is moved to the next occurrence of that character. A negative count searches for previous occurrences.''' self.finalize() def character_search_backward(self, e): # (M-C-]) - u'''A character is read and point is moved to the previous occurrence + '''A character is read and point is moved to the previous occurrence of that character. A negative count searches for subsequent occurrences.''' self.finalize() def insert_comment(self, e): # (M-#) - u'''Without a numeric argument, the value of the comment-begin + '''Without a numeric argument, the value of the comment-begin variable is inserted at the beginning of the current line. If a numeric argument is supplied, this command acts as a toggle: if the characters at the beginning of the line do not match the value of @@ -573,27 +573,27 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def dump_variables(self, e): # () - u'''Print all of the settable variables and their values to the + '''Print all of the settable variables and their values to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.''' self.finalize() def dump_macros(self, e): # () - u'''Print all of the Readline key sequences bound to macros and the + '''Print all of the Readline key sequences bound to macros and the strings they output. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.''' self.finalize() def digit_argument(self, e): # (M-0, M-1, ... M--) - u'''Add this digit to the argument already accumulating, or start a + '''Add this digit to the argument already accumulating, or start a new argument. M-- starts a negative argument.''' self._init_digit_argument(e) #Should not finalize def universal_argument(self, e): # () - u'''This is another way to specify an argument. If this command is + '''This is another way to specify an argument. If this command is followed by one or more digits, optionally with a leading minus sign, those digits define the argument. If the command is followed by digits, executing universal-argument again ends the numeric @@ -608,99 +608,99 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, #Create key bindings: def init_editing_mode(self, e): # (C-e) - u'''When in vi command mode, this causes a switch to emacs editing + '''When in vi command mode, this causes a switch to emacs editing mode.''' - self._bind_exit_key(u'Control-d') - self._bind_exit_key(u'Control-z') + self._bind_exit_key('Control-d') + self._bind_exit_key('Control-z') # I often accidentally hold the shift or control while typing space - self._bind_key(u'space', self.self_insert) - self._bind_key(u'Shift-space', self.self_insert) - self._bind_key(u'Control-space', self.self_insert) - self._bind_key(u'Return', self.accept_line) - self._bind_key(u'Left', self.backward_char) - self._bind_key(u'Control-b', self.backward_char) - self._bind_key(u'Right', self.forward_char) - self._bind_key(u'Control-f', self.forward_char) - self._bind_key(u'Control-h', self.backward_delete_char) - self._bind_key(u'BackSpace', self.backward_delete_char) - self._bind_key(u'Control-BackSpace', self.backward_delete_word) + self._bind_key('space', self.self_insert) + self._bind_key('Shift-space', self.self_insert) + self._bind_key('Control-space', self.self_insert) + self._bind_key('Return', self.accept_line) + self._bind_key('Left', self.backward_char) + self._bind_key('Control-b', self.backward_char) + self._bind_key('Right', self.forward_char) + self._bind_key('Control-f', self.forward_char) + self._bind_key('Control-h', self.backward_delete_char) + self._bind_key('BackSpace', self.backward_delete_char) + self._bind_key('Control-BackSpace', self.backward_delete_word) - self._bind_key(u'Home', self.beginning_of_line) - self._bind_key(u'End', self.end_of_line) - self._bind_key(u'Delete', self.delete_char) - self._bind_key(u'Control-d', self.delete_char) - self._bind_key(u'Clear', self.clear_screen) - self._bind_key(u'Alt-f', self.forward_word) - self._bind_key(u'Alt-b', self.backward_word) - self._bind_key(u'Control-l', self.clear_screen) - self._bind_key(u'Control-p', self.previous_history) - self._bind_key(u'Up', self.history_search_backward) - self._bind_key(u'Control-n', self.next_history) - self._bind_key(u'Down', self.history_search_forward) - self._bind_key(u'Control-a', self.beginning_of_line) - self._bind_key(u'Control-e', self.end_of_line) - self._bind_key(u'Alt-<', self.beginning_of_history) - self._bind_key(u'Alt->', self.end_of_history) - self._bind_key(u'Control-r', self.reverse_search_history) - self._bind_key(u'Control-s', self.forward_search_history) - self._bind_key(u'Alt-p', + self._bind_key('Home', self.beginning_of_line) + self._bind_key('End', self.end_of_line) + self._bind_key('Delete', self.delete_char) + self._bind_key('Control-d', self.delete_char) + self._bind_key('Clear', self.clear_screen) + self._bind_key('Alt-f', self.forward_word) + self._bind_key('Alt-b', self.backward_word) + self._bind_key('Control-l', self.clear_screen) + self._bind_key('Control-p', self.previous_history) + self._bind_key('Up', self.history_search_backward) + self._bind_key('Control-n', self.next_history) + self._bind_key('Down', self.history_search_forward) + self._bind_key('Control-a', self.beginning_of_line) + self._bind_key('Control-e', self.end_of_line) + self._bind_key('Alt-<', self.beginning_of_history) + self._bind_key('Alt->', self.end_of_history) + self._bind_key('Control-r', self.reverse_search_history) + self._bind_key('Control-s', self.forward_search_history) + self._bind_key('Alt-p', self.non_incremental_reverse_search_history) - self._bind_key(u'Alt-n', + self._bind_key('Alt-n', self.non_incremental_forward_search_history) - self._bind_key(u'Control-z', self.undo) - self._bind_key(u'Control-_', self.undo) - self._bind_key(u'Escape', self.kill_whole_line) - self._bind_key(u'Meta-d', self.kill_word) - self._bind_key(u'Control-Delete', self.forward_delete_word) - self._bind_key(u'Control-w', self.unix_word_rubout) + self._bind_key('Control-z', self.undo) + self._bind_key('Control-_', self.undo) + self._bind_key('Escape', self.kill_whole_line) + self._bind_key('Meta-d', self.kill_word) + self._bind_key('Control-Delete', self.forward_delete_word) + self._bind_key('Control-w', self.unix_word_rubout) #self._bind_key('Control-Shift-v', self.quoted_insert) - self._bind_key(u'Control-v', self.paste) - self._bind_key(u'Alt-v', self.ipython_paste) - self._bind_key(u'Control-y', self.yank) - self._bind_key(u'Control-k', self.kill_line) - self._bind_key(u'Control-m', self.set_mark) - self._bind_key(u'Control-q', self.copy_region_to_clipboard) + self._bind_key('Control-v', self.paste) + self._bind_key('Alt-v', self.ipython_paste) + self._bind_key('Control-y', self.yank) + self._bind_key('Control-k', self.kill_line) + self._bind_key('Control-m', self.set_mark) + self._bind_key('Control-q', self.copy_region_to_clipboard) # self._bind_key('Control-shift-k', self.kill_whole_line) - self._bind_key(u'Control-Shift-v', self.paste_mulitline_code) - self._bind_key(u"Control-Right", self.forward_word_end) - self._bind_key(u"Control-Left", self.backward_word) - self._bind_key(u"Shift-Right", + self._bind_key('Control-Shift-v', self.paste_mulitline_code) + self._bind_key("Control-Right", self.forward_word_end) + self._bind_key("Control-Left", self.backward_word) + self._bind_key("Shift-Right", self.forward_char_extend_selection) - self._bind_key(u"Shift-Left", + self._bind_key("Shift-Left", self.backward_char_extend_selection) - self._bind_key(u"Shift-Control-Right", + self._bind_key("Shift-Control-Right", self.forward_word_end_extend_selection) - self._bind_key(u"Shift-Control-Left", + self._bind_key("Shift-Control-Left", self.backward_word_extend_selection) - self._bind_key(u"Shift-Home", + self._bind_key("Shift-Home", self.beginning_of_line_extend_selection) - self._bind_key(u"Shift-End", + self._bind_key("Shift-End", self.end_of_line_extend_selection) - self._bind_key(u"numpad0", self.self_insert) - self._bind_key(u"numpad1", self.self_insert) - self._bind_key(u"numpad2", self.self_insert) - self._bind_key(u"numpad3", self.self_insert) - self._bind_key(u"numpad4", self.self_insert) - self._bind_key(u"numpad5", self.self_insert) - self._bind_key(u"numpad6", self.self_insert) - self._bind_key(u"numpad7", self.self_insert) - self._bind_key(u"numpad8", self.self_insert) - self._bind_key(u"numpad9", self.self_insert) - self._bind_key(u"add", self.self_insert) - self._bind_key(u"subtract", self.self_insert) - self._bind_key(u"multiply", self.self_insert) - self._bind_key(u"divide", self.self_insert) - self._bind_key(u"vk_decimal", self.self_insert) - log(u"RUNNING INIT EMACS") + self._bind_key("numpad0", self.self_insert) + self._bind_key("numpad1", self.self_insert) + self._bind_key("numpad2", self.self_insert) + self._bind_key("numpad3", self.self_insert) + self._bind_key("numpad4", self.self_insert) + self._bind_key("numpad5", self.self_insert) + self._bind_key("numpad6", self.self_insert) + self._bind_key("numpad7", self.self_insert) + self._bind_key("numpad8", self.self_insert) + self._bind_key("numpad9", self.self_insert) + self._bind_key("add", self.self_insert) + self._bind_key("subtract", self.self_insert) + self._bind_key("multiply", self.self_insert) + self._bind_key("divide", self.self_insert) + self._bind_key("vk_decimal", self.self_insert) + log("RUNNING INIT EMACS") for i in range(0, 10): - self._bind_key(u"alt-%d"%i, self.digit_argument) - self._bind_key(u"alt--", self.digit_argument) + self._bind_key("alt-%d"%i, self.digit_argument) + self._bind_key("alt--", self.digit_argument) # make it case insensitive def commonprefix(m): - u"Given a list of pathnames, returns the longest common leading component" + "Given a list of pathnames, returns the longest common leading component" if not m: return '' prefix = m[0] @@ -709,6 +709,6 @@ def commonprefix(m): if prefix[:i + 1].lower() != item[:i + 1].lower(): prefix = prefix[:i] if i == 0: - return u'' + return '' break return prefix diff --git a/pyreadline/modes/notemacs.py b/pyreadline/modes/notemacs.py index 0e08e2a..e425847 100644 --- a/pyreadline/modes/notemacs.py +++ b/pyreadline/modes/notemacs.py @@ -11,15 +11,15 @@ import pyreadline.logger as logger from pyreadline.logger import log import pyreadline.lineeditor.lineobj as lineobj import pyreadline.lineeditor.history as history -import basemode +from . import basemode class NotEmacsMode(basemode.BaseMode): - mode=u"notemacs" + mode="notemacs" def __init__(self,rlobj): super(NotEmacsMode,self).__init__(rlobj) def __repr__(self): - return u"" + return "" def _readline_from_keyboard(self): c=self.console @@ -37,7 +37,7 @@ class NotEmacsMode(basemode.BaseMode): raise EOFError dispatch_func = self.key_dispatch.get(event.keyinfo,self.self_insert) - log(u"readline from keyboard:%s"%(event.keyinfo,)) + log("readline from keyboard:%s"%(event.keyinfo,)) r = None if dispatch_func: r = dispatch_func(event) @@ -49,7 +49,7 @@ class NotEmacsMode(basemode.BaseMode): break def readline(self, prompt=''): - u'''Try to act like GNU readline.''' + '''Try to act like GNU readline.''' # handle startup_hook if self.first_prompt: self.first_prompt = False @@ -57,7 +57,7 @@ class NotEmacsMode(basemode.BaseMode): try: self.startup_hook() except: - print u'startup hook failed' + print('startup hook failed') traceback.print_exc() c = self.console @@ -69,64 +69,64 @@ class NotEmacsMode(basemode.BaseMode): try: self.pre_input_hook() except: - print u'pre_input_hook failed' + print('pre_input_hook failed') traceback.print_exc() self.pre_input_hook = None - log(u"in readline: %s"%self.paste_line_buffer) + log("in readline: %s"%self.paste_line_buffer) if len(self.paste_line_buffer)>0: self.l_buffer=lineobj.ReadlineTextBuffer(self.paste_line_buffer[0]) self._update_line() self.paste_line_buffer=self.paste_line_buffer[1:] - c.write(u'\r\n') + c.write('\r\n') else: self._readline_from_keyboard() - c.write(u'\r\n') + c.write('\r\n') self.add_history(self.l_buffer.copy()) - log(u'returning(%s)' % self.l_buffer.get_line_text()) + log('returning(%s)' % self.l_buffer.get_line_text()) return self.l_buffer.get_line_text() + '\n' ### Methods below here are bindable emacs functions def beginning_of_line(self, e): # (C-a) - u'''Move to the start of the current line. ''' + '''Move to the start of the current line. ''' self.l_buffer.beginning_of_line() def end_of_line(self, e): # (C-e) - u'''Move to the end of the line. ''' + '''Move to the end of the line. ''' self.l_buffer.end_of_line() def forward_char(self, e): # (C-f) - u'''Move forward a character. ''' + '''Move forward a character. ''' self.l_buffer.forward_char() def backward_char(self, e): # (C-b) - u'''Move back a character. ''' + '''Move back a character. ''' self.l_buffer.backward_char() def forward_word(self, e): # (M-f) - u'''Move forward to the end of the next word. Words are composed of + '''Move forward to the end of the next word. Words are composed of letters and digits.''' self.l_buffer.forward_word() def backward_word(self, e): # (M-b) - u'''Move back to the start of the current or previous word. Words are + '''Move back to the start of the current or previous word. Words are composed of letters and digits.''' self.l_buffer.backward_word() def clear_screen(self, e): # (C-l) - u'''Clear the screen and redraw the current line, leaving the current + '''Clear the screen and redraw the current line, leaving the current line at the top of the screen.''' self.console.page() def redraw_current_line(self, e): # () - u'''Refresh the current line. By default, this is unbound.''' + '''Refresh the current line. By default, this is unbound.''' pass def accept_line(self, e): # (Newline or Return) - u'''Accept the line regardless of where the cursor is. If this line + '''Accept the line regardless of where the cursor is. If this line is non-empty, it may be added to the history list for future recall with add_history(). If this line is a modified history line, the history line is restored to its original state.''' @@ -134,47 +134,47 @@ class NotEmacsMode(basemode.BaseMode): ######### History commands def previous_history(self, e): # (C-p) - u'''Move back through the history list, fetching the previous command. ''' + '''Move back through the history list, fetching the previous command. ''' self._history.previous_history(self.l_buffer) def next_history(self, e): # (C-n) - u'''Move forward through the history list, fetching the next command. ''' + '''Move forward through the history list, fetching the next command. ''' self._history.next_history(self.l_buffer) def beginning_of_history(self, e): # (M-<) - u'''Move to the first line in the history.''' + '''Move to the first line in the history.''' self._history.beginning_of_history() def end_of_history(self, e): # (M->) - u'''Move to the end of the input history, i.e., the line currently + '''Move to the end of the input history, i.e., the line currently being entered.''' self._history.end_of_history(self.l_buffer) def _i_search(self, searchfun, direction, init_event): c = self.console line = self.get_line_buffer() - query = u'' + query = '' hc_start = self._history.history_cursor #+ direction while 1: x, y = self.prompt_end_pos c.pos(0, y) if direction < 0: - prompt = u'reverse-i-search' + prompt = 'reverse-i-search' else: - prompt = u'forward-i-search' + prompt = 'forward-i-search' - scroll = c.write_scrolling(u"%s`%s': %s" % (prompt, query, line)) + scroll = c.write_scrolling("%s`%s': %s" % (prompt, query, line)) self._update_prompt_pos(scroll) self._clear_after() event = c.getkeypress() - if event.keysym == u'BackSpace': + if event.keysym == 'BackSpace': if len(query) > 0: query = query[:-1] self._history.history_cursor = hc_start else: self._bell() - elif event.char in string.letters + string.digits + string.punctuation + u' ': + elif event.char in string.letters + string.digits + string.punctuation + ' ': self._history.history_cursor = hc_start query += event.char elif event.keyinfo == init_event.keyinfo: @@ -182,7 +182,7 @@ class NotEmacsMode(basemode.BaseMode): line=searchfun(query) pass else: - if event.keysym != u'Return': + if event.keysym != 'Return': self._bell() break line=searchfun(query) @@ -194,14 +194,14 @@ class NotEmacsMode(basemode.BaseMode): self._history.history_cursor=len(self._history.history) def reverse_search_history(self, e): # (C-r) - u'''Search backward starting at the current line and moving up + '''Search backward starting at the current line and moving up through the history as necessary. This is an incremental search.''' # print "HEJ" # self.console.bell() self._i_search(self._history.reverse_search_history, -1, e) def forward_search_history(self, e): # (C-s) - u'''Search forward starting at the current line and moving down + '''Search forward starting at the current line and moving down through the the history as necessary. This is an incremental search.''' # print "HEJ" # self.console.bell() @@ -209,31 +209,31 @@ class NotEmacsMode(basemode.BaseMode): def non_incremental_reverse_search_history(self, e): # (M-p) - u'''Search backward starting at the current line and moving up + '''Search backward starting at the current line and moving up through the history as necessary using a non-incremental search for a string supplied by the user.''' self._history.non_incremental_reverse_search_history(self.l_buffer) def non_incremental_forward_search_history(self, e): # (M-n) - u'''Search forward starting at the current line and moving down + '''Search forward starting at the current line and moving down through the the history as necessary using a non-incremental search for a string supplied by the user.''' self._history.non_incremental_reverse_search_history(self.l_buffer) def history_search_forward(self, e): # () - u'''Search forward through the history for the string of characters + '''Search forward through the history for the string of characters between the start of the current line and the point. This is a non-incremental search. By default, this command is unbound.''' self.l_buffer=self._history.history_search_forward(self.l_buffer) def history_search_backward(self, e): # () - u'''Search backward through the history for the string of characters + '''Search backward through the history for the string of characters between the start of the current line and the point. This is a non-incremental search. By default, this command is unbound.''' self.l_buffer=self._history.history_search_backward(self.l_buffer) def yank_nth_arg(self, e): # (M-C-y) - u'''Insert the first argument to the previous command (usually the + '''Insert the first argument to the previous command (usually the second word on the previous line) at point. With an argument n, insert the nth word from the previous command (the words in the previous command begin with word 0). A negative argument inserts the @@ -241,76 +241,76 @@ class NotEmacsMode(basemode.BaseMode): pass def yank_last_arg(self, e): # (M-. or M-_) - u'''Insert last argument to the previous command (the last word of + '''Insert last argument to the previous command (the last word of the previous history entry). With an argument, behave exactly like yank-nth-arg. Successive calls to yank-last-arg move back through the history list, inserting the last argument of each line in turn.''' pass def delete_char(self, e): # (C-d) - u'''Delete the character at point. If point is at the beginning of + '''Delete the character at point. If point is at the beginning of the line, there are no characters in the line, and the last character typed was not bound to delete-char, then return EOF.''' self.l_buffer.delete_char() def backward_delete_char(self, e): # (Rubout) - u'''Delete the character behind the cursor. A numeric argument means + '''Delete the character behind the cursor. A numeric argument means to kill the characters instead of deleting them.''' self.l_buffer.backward_delete_char() def forward_backward_delete_char(self, e): # () - u'''Delete the character under the cursor, unless the cursor is at + '''Delete the character under the cursor, unless the cursor is at the end of the line, in which case the character behind the cursor is deleted. By default, this is not bound to a key.''' pass def quoted_insert(self, e): # (C-q or C-v) - u'''Add the next character typed to the line verbatim. This is how to + '''Add the next character typed to the line verbatim. This is how to insert key sequences like C-q, for example.''' e = self.console.getkeypress() self.insert_text(e.char) def tab_insert(self, e): # (M-TAB) - u'''Insert a tab character. ''' + '''Insert a tab character. ''' cursor = min(self.l_buffer.point, len(self.l_buffer.line_buffer)) ws = ' ' * (self.tabstop - (cursor % self.tabstop)) self.insert_text(ws) def self_insert(self, e): # (a, b, A, 1, !, ...) - u'''Insert yourself. ''' + '''Insert yourself. ''' if ord(e.char)!=0: #don't insert null character in buffer, can happen with dead keys. self.insert_text(e.char) def transpose_chars(self, e): # (C-t) - u'''Drag the character before the cursor forward over the character + '''Drag the character before the cursor forward over the character at the cursor, moving the cursor forward as well. If the insertion point is at the end of the line, then this transposes the last two characters of the line. Negative arguments have no effect.''' self.l_buffer.transpose_chars() def transpose_words(self, e): # (M-t) - u'''Drag the word before point past the word after point, moving + '''Drag the word before point past the word after point, moving point past that word as well. If the insertion point is at the end of the line, this transposes the last two words on the line.''' self.l_buffer.transpose_words() def upcase_word(self, e): # (M-u) - u'''Uppercase the current (or following) word. With a negative + '''Uppercase the current (or following) word. With a negative argument, uppercase the previous word, but do not move the cursor.''' self.l_buffer.upcase_word() def downcase_word(self, e): # (M-l) - u'''Lowercase the current (or following) word. With a negative + '''Lowercase the current (or following) word. With a negative argument, lowercase the previous word, but do not move the cursor.''' self.l_buffer.downcase_word() def capitalize_word(self, e): # (M-c) - u'''Capitalize the current (or following) word. With a negative + '''Capitalize the current (or following) word. With a negative argument, capitalize the previous word, but do not move the cursor.''' self.l_buffer.capitalize_word() def overwrite_mode(self, e): # () - u'''Toggle overwrite mode. With an explicit positive numeric + '''Toggle overwrite mode. With an explicit positive numeric argument, switches to overwrite mode. With an explicit non-positive numeric argument, switches to insert mode. This command affects only emacs mode; vi mode does overwrite differently. Each call to @@ -321,54 +321,54 @@ class NotEmacsMode(basemode.BaseMode): pass def kill_line(self, e): # (C-k) - u'''Kill the text from point to the end of the line. ''' + '''Kill the text from point to the end of the line. ''' self.l_buffer.kill_line() def backward_kill_line(self, e): # (C-x Rubout) - u'''Kill backward to the beginning of the line. ''' + '''Kill backward to the beginning of the line. ''' self.l_buffer.backward_kill_line() def unix_line_discard(self, e): # (C-u) - u'''Kill backward from the cursor to the beginning of the current line. ''' + '''Kill backward from the cursor to the beginning of the current line. ''' # how is this different from backward_kill_line? self.l_buffer.unix_line_discard() def kill_whole_line(self, e): # () - u'''Kill all characters on the current line, no matter where point + '''Kill all characters on the current line, no matter where point is. By default, this is unbound.''' self.l_buffer.kill_whole_line() def kill_word(self, e): # (M-d) - u'''Kill from point to the end of the current word, or if between + '''Kill from point to the end of the current word, or if between words, to the end of the next word. Word boundaries are the same as forward-word.''' self.l_buffer.kill_word() def backward_kill_word(self, e): # (M-DEL) - u'''Kill the word behind point. Word boundaries are the same as + '''Kill the word behind point. Word boundaries are the same as backward-word. ''' self.l_buffer.backward_kill_word() def unix_word_rubout(self, e): # (C-w) - u'''Kill the word behind point, using white space as a word + '''Kill the word behind point, using white space as a word boundary. The killed text is saved on the kill-ring.''' self.l_buffer.unix_word_rubout() def delete_horizontal_space(self, e): # () - u'''Delete all spaces and tabs around point. By default, this is unbound. ''' + '''Delete all spaces and tabs around point. By default, this is unbound. ''' pass def kill_region(self, e): # () - u'''Kill the text in the current region. By default, this command is unbound. ''' + '''Kill the text in the current region. By default, this command is unbound. ''' pass def copy_region_as_kill(self, e): # () - u'''Copy the text in the region to the kill buffer, so it can be + '''Copy the text in the region to the kill buffer, so it can be yanked right away. By default, this command is unbound.''' pass def copy_region_to_clipboard(self, e): # () - u'''Copy the text in the region to the windows clipboard.''' + '''Copy the text in the region to the windows clipboard.''' if self.enable_win32_clipboard: mark=min(self.l_buffer.mark,len(self.l_buffer.line_buffer)) cursor=min(self.l_buffer.point,len(self.l_buffer.line_buffer)) @@ -376,72 +376,72 @@ class NotEmacsMode(basemode.BaseMode): return begin=min(cursor,mark) end=max(cursor,mark) - toclipboard=u"".join(self.l_buffer.line_buffer[begin:end]) + toclipboard="".join(self.l_buffer.line_buffer[begin:end]) clipboard.SetClipboardText(str(toclipboard)) def copy_backward_word(self, e): # () - u'''Copy the word before point to the kill buffer. The word + '''Copy the word before point to the kill buffer. The word boundaries are the same as backward-word. By default, this command is unbound.''' pass def copy_forward_word(self, e): # () - u'''Copy the word following point to the kill buffer. The word + '''Copy the word following point to the kill buffer. The word boundaries are the same as forward-word. By default, this command is unbound.''' pass def paste(self,e): - u'''Paste windows clipboard''' + '''Paste windows clipboard''' if self.enable_win32_clipboard: txt=clipboard.get_clipboard_text_and_convert(False) self.insert_text(txt) def paste_mulitline_code(self,e): - u'''Paste windows clipboard''' - reg=re.compile(u"\r?\n") + '''Paste windows clipboard''' + reg=re.compile("\r?\n") if self.enable_win32_clipboard: txt=clipboard.get_clipboard_text_and_convert(False) t=reg.split(txt) - t=[row for row in t if row.strip()!=u""] #remove empty lines - if t!=[u""]: + t=[row for row in t if row.strip()!=""] #remove empty lines + if t!=[""]: self.insert_text(t[0]) self.add_history(self.l_buffer.copy()) self.paste_line_buffer=t[1:] - log(u"multi: %s"%self.paste_line_buffer) + log("multi: %s"%self.paste_line_buffer) return True else: return False def ipython_paste(self,e): - u'''Paste windows clipboard. If enable_ipython_paste_list_of_lists is + '''Paste windows clipboard. If enable_ipython_paste_list_of_lists is True then try to convert tabseparated data to repr of list of lists or repr of array''' if self.enable_win32_clipboard: txt=clipboard.get_clipboard_text_and_convert( self.enable_ipython_paste_list_of_lists) if self.enable_ipython_paste_for_paths: - if len(txt)<300 and (u"\t" not in txt) and (u"\n" not in txt): - txt=txt.replace(u"\\", u"/").replace(u" ", ur"\ ") + if len(txt)<300 and ("\t" not in txt) and ("\n" not in txt): + txt=txt.replace("\\", "/").replace(" ", r"\ ") self.insert_text(txt) def yank(self, e): # (C-y) - u'''Yank the top of the kill ring into the buffer at point. ''' + '''Yank the top of the kill ring into the buffer at point. ''' pass def yank_pop(self, e): # (M-y) - u'''Rotate the kill-ring, and yank the new top. You can only do this + '''Rotate the kill-ring, and yank the new top. You can only do this if the prior command is yank or yank-pop.''' pass def digit_argument(self, e): # (M-0, M-1, ... M--) - u'''Add this digit to the argument already accumulating, or start a + '''Add this digit to the argument already accumulating, or start a new argument. M-- starts a negative argument.''' pass def universal_argument(self, e): # () - u'''This is another way to specify an argument. If this command is + '''This is another way to specify an argument. If this command is followed by one or more digits, optionally with a leading minus sign, those digits define the argument. If the command is followed by digits, executing universal-argument again ends the numeric @@ -455,83 +455,83 @@ class NotEmacsMode(basemode.BaseMode): pass def delete_char_or_list(self, e): # () - u'''Deletes the character under the cursor if not at the beginning or + '''Deletes the character under the cursor if not at the beginning or end of the line (like delete-char). If at the end of the line, behaves identically to possible-completions. This command is unbound by default.''' pass def start_kbd_macro(self, e): # (C-x () - u'''Begin saving the characters typed into the current keyboard macro. ''' + '''Begin saving the characters typed into the current keyboard macro. ''' pass def end_kbd_macro(self, e): # (C-x )) - u'''Stop saving the characters typed into the current keyboard macro + '''Stop saving the characters typed into the current keyboard macro and save the definition.''' pass def call_last_kbd_macro(self, e): # (C-x e) - u'''Re-execute the last keyboard macro defined, by making the + '''Re-execute the last keyboard macro defined, by making the characters in the macro appear as if typed at the keyboard.''' pass def re_read_init_file(self, e): # (C-x C-r) - u'''Read in the contents of the inputrc file, and incorporate any + '''Read in the contents of the inputrc file, and incorporate any bindings or variable assignments found there.''' pass def abort(self, e): # (C-g) - u'''Abort the current editing command and ring the terminals bell + '''Abort the current editing command and ring the terminals bell (subject to the setting of bell-style).''' self._bell() def do_uppercase_version(self, e): # (M-a, M-b, M-x, ...) - u'''If the metafied character x is lowercase, run the command that is + '''If the metafied character x is lowercase, run the command that is bound to the corresponding uppercase character.''' pass def prefix_meta(self, e): # (ESC) - u'''Metafy the next character typed. This is for keyboards without a + '''Metafy the next character typed. This is for keyboards without a meta key. Typing ESC f is equivalent to typing M-f. ''' self.next_meta = True def undo(self, e): # (C-_ or C-x C-u) - u'''Incremental undo, separately remembered for each line.''' + '''Incremental undo, separately remembered for each line.''' self.l_buffer.pop_undo() def revert_line(self, e): # (M-r) - u'''Undo all changes made to this line. This is like executing the + '''Undo all changes made to this line. This is like executing the undo command enough times to get back to the beginning.''' pass def tilde_expand(self, e): # (M-~) - u'''Perform tilde expansion on the current word.''' + '''Perform tilde expansion on the current word.''' pass def set_mark(self, e): # (C-@) - u'''Set the mark to the point. If a numeric argument is supplied, the + '''Set the mark to the point. If a numeric argument is supplied, the mark is set to that position.''' self.l_buffer.set_mark() def exchange_point_and_mark(self, e): # (C-x C-x) - u'''Swap the point with the mark. The current cursor position is set + '''Swap the point with the mark. The current cursor position is set to the saved position, and the old cursor position is saved as the mark.''' pass def character_search(self, e): # (C-]) - u'''A character is read and point is moved to the next occurrence of + '''A character is read and point is moved to the next occurrence of that character. A negative count searches for previous occurrences.''' pass def character_search_backward(self, e): # (M-C-]) - u'''A character is read and point is moved to the previous occurrence + '''A character is read and point is moved to the previous occurrence of that character. A negative count searches for subsequent occurrences.''' pass def insert_comment(self, e): # (M-#) - u'''Without a numeric argument, the value of the comment-begin + '''Without a numeric argument, the value of the comment-begin variable is inserted at the beginning of the current line. If a numeric argument is supplied, this command acts as a toggle: if the characters at the beginning of the line do not match the value of @@ -541,21 +541,21 @@ class NotEmacsMode(basemode.BaseMode): pass def dump_functions(self, e): # () - u'''Print all of the functions and their key bindings to the Readline + '''Print all of the functions and their key bindings to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.''' pass def dump_variables(self, e): # () - u'''Print all of the settable variables and their values to the + '''Print all of the settable variables and their values to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.''' pass def dump_macros(self, e): # () - u'''Print all of the Readline key sequences bound to macros and the + '''Print all of the Readline key sequences bound to macros and the strings they output. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.''' @@ -565,38 +565,38 @@ class NotEmacsMode(basemode.BaseMode): #Create key bindings: def init_editing_mode(self, e): # (C-e) - u'''When in vi command mode, this causes a switch to emacs editing + '''When in vi command mode, this causes a switch to emacs editing mode.''' - self._bind_exit_key(u'Control-d') - self._bind_exit_key(u'Control-z') + self._bind_exit_key('Control-d') + self._bind_exit_key('Control-z') # I often accidentally hold the shift or control while typing space - self._bind_key(u'Shift-space', self.self_insert) - self._bind_key(u'Control-space', self.self_insert) - self._bind_key(u'Return', self.accept_line) - self._bind_key(u'Left', self.backward_char) - self._bind_key(u'Control-b', self.backward_char) - self._bind_key(u'Right', self.forward_char) - self._bind_key(u'Control-f', self.forward_char) - self._bind_key(u'BackSpace', self.backward_delete_char) - self._bind_key(u'Home', self.beginning_of_line) - self._bind_key(u'End', self.end_of_line) - self._bind_key(u'Delete', self.delete_char) - self._bind_key(u'Control-d', self.delete_char) - self._bind_key(u'Clear', self.clear_screen) + self._bind_key('Shift-space', self.self_insert) + self._bind_key('Control-space', self.self_insert) + self._bind_key('Return', self.accept_line) + self._bind_key('Left', self.backward_char) + self._bind_key('Control-b', self.backward_char) + self._bind_key('Right', self.forward_char) + self._bind_key('Control-f', self.forward_char) + self._bind_key('BackSpace', self.backward_delete_char) + self._bind_key('Home', self.beginning_of_line) + self._bind_key('End', self.end_of_line) + self._bind_key('Delete', self.delete_char) + self._bind_key('Control-d', self.delete_char) + self._bind_key('Clear', self.clear_screen) # make it case insensitive def commonprefix(m): - u"Given a list of pathnames, returns the longest common leading component" - if not m: return u'' + "Given a list of pathnames, returns the longest common leading component" + if not m: return '' prefix = m[0] for item in m: for i in range(len(prefix)): if prefix[:i+1].lower() != item[:i+1].lower(): prefix = prefix[:i] - if i == 0: return u'' + if i == 0: return '' break return prefix diff --git a/pyreadline/modes/vi.py b/pyreadline/modes/vi.py index b228727..bfac168 100644 --- a/pyreadline/modes/vi.py +++ b/pyreadline/modes/vi.py @@ -1,1174 +1,1174 @@ -# -*- coding: utf-8 -*- -#***************************************************************************** -# Copyright (C) 2003-2006 Gary Bishop. -# Copyright (C) 2006 Michael Graz. -# Copyright (C) 2006 Jorgen Stenarson. -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** -import os -import pyreadline.logger as logger -from pyreadline.logger import log -import pyreadline.lineeditor.lineobj as lineobj -import pyreadline.lineeditor.history as history -import basemode - -class ViMode(basemode.BaseMode): - mode="vi" - def __init__(self,rlobj): - super(ViMode,self).__init__(rlobj) - self.__vi_insert_mode = None - - def __repr__(self): - return "" - - def process_keyevent(self, keyinfo): - def nop(e): - pass - keytuple=keyinfo.tuple() - - #Process exit keys. Only exit on empty line - if keytuple in self.exit_dispatch: - if lineobj.EndOfLine(self.l_buffer) == 0: - raise EOFError - - dispatch_func = self.key_dispatch.get(keytuple,self.vi_key) - log("readline from keyboard:%s->%s"%(keytuple,dispatch_func)) - r = None - if dispatch_func: - r = dispatch_func(keyinfo) - self.l_buffer.push_undo() - - self.previous_func = dispatch_func - if r: - self._update_line() - return True - return False - - ### Methods below here are bindable emacs functions - - def init_editing_mode(self, e): # (M-C-j) - '''Initialize vi editingmode''' - self.show_all_if_ambiguous = 'on' - self.key_dispatch = {} - self.__vi_insert_mode = None - self._vi_command = None - self._vi_command_edit = None - self._vi_key_find_char = None - self._vi_key_find_direction = True - self._vi_yank_buffer = None - self._vi_multiplier1 = '' - self._vi_multiplier2 = '' - self._vi_undo_stack = [] - self._vi_undo_cursor = -1 - self._vi_current = None - self._vi_search_text = '' - self.vi_save_line () - self.vi_set_insert_mode (True) - # make ' ' to ~ self insert - for c in range(ord(' '), 127): - self._bind_key('%s' % chr(c), self.vi_key) - self._bind_key('BackSpace', self.vi_backspace) - self._bind_key('Escape', self.vi_escape) - self._bind_key('Return', self.vi_accept_line) - - self._bind_key('Left', self.backward_char) - self._bind_key('Right', self.forward_char) - self._bind_key('Home', self.beginning_of_line) - self._bind_key('End', self.end_of_line) - self._bind_key('Delete', self.delete_char) - - self._bind_key('Control-d', self.vi_eof) - self._bind_key('Control-z', self.vi_eof) - self._bind_key('Control-r', self.vi_redo) - self._bind_key('Up', self.vi_arrow_up) - self._bind_key('Control-p', self.vi_up) - self._bind_key('Down', self.vi_arrow_down) - self._bind_key('Control-n', self.vi_down) - self._bind_key('Tab', self.vi_complete) -# self._bind_key('Control-e', self.emacs) - - def vi_key (self, e): - if not self._vi_command: - self._vi_command = ViCommand (self) - elif self._vi_command.is_end: - if self._vi_command.is_edit: - self._vi_command_edit = self._vi_command - self._vi_command = ViCommand (self) - self._vi_command.add_char (e.char) - - def vi_error (self): - self._bell () - - def vi_get_is_insert_mode (self): - return self.__vi_insert_mode - vi_is_insert_mode = property (vi_get_is_insert_mode) - - def vi_escape (self, e): - if self.vi_is_insert_mode: - if self._vi_command: - self._vi_command.add_char (e.char) - else: - self._vi_command = ViCommand (self) - self.vi_set_insert_mode (False) - self.l_buffer.point=lineobj.PrevChar - elif self._vi_command and self._vi_command.is_replace_one: - self._vi_command.add_char (e.char) - else: - self.vi_error () - - def vi_backspace (self, e): - if self._vi_command: - self._vi_command.add_char (e.char) - else: - self._vi_do_backspace (self._vi_command) - - def _vi_do_backspace (self, vi_cmd): - if self.vi_is_insert_mode or (self._vi_command and self._vi_command.is_search): - if self.l_buffer.point > 0: - self.l_buffer.point -= 1 - if self.l_buffer.overwrite: - try: - prev = self._vi_undo_stack [self._vi_undo_cursor][1][self.l_buffer.point ] - self.l_buffer.line_buffer [self.l_buffer.point] = prev - except IndexError: - del self.l_buffer.line_buffer [self.l_buffer.point ] - else: - self.vi_save_line () - del self.l_buffer.line_buffer [self.l_buffer.point ] - - def vi_accept_line (self, e): - if self._vi_command and self._vi_command.is_search: - self._vi_command.do_search () - return False - self._vi_command = None - self.vi_set_insert_mode (True) - self._vi_undo_stack = [] - self._vi_undo_cursor = -1 - self._vi_current = None - return self.accept_line (e) - - def vi_eof (self, e): - raise EOFError - - def vi_set_insert_mode (self, value): - if self.__vi_insert_mode == value: - return - self.__vi_insert_mode = value - if value: - self.vi_save_line () - self.cursor_size=25 - else: - self.cursor_size=100 - - def vi_undo_restart (self): - tpl_undo = (self.l_buffer.point, self.l_buffer.line_buffer[:], ) - self._vi_undo_stack = [tpl_undo] - self._vi_undo_cursor = 0 - - def vi_save_line (self): - if self._vi_undo_stack and self._vi_undo_cursor >= 0: - del self._vi_undo_stack [self._vi_undo_cursor + 1 : ] - # tpl_undo = (self.l_buffer.point, self.l_buffer[:], ) - tpl_undo = (self.l_buffer.point, self.l_buffer.line_buffer[:], ) - if not self._vi_undo_stack or self._vi_undo_stack[self._vi_undo_cursor][1] != tpl_undo[1]: - self._vi_undo_stack.append (tpl_undo) - self._vi_undo_cursor += 1 - - def vi_undo_prepare (self): - if self._vi_undo_cursor == len(self._vi_undo_stack)-1: - self.vi_save_line () - - def vi_undo (self, do_pop=True): - self.vi_undo_prepare () - if not self._vi_undo_stack or self._vi_undo_cursor <= 0: - self.vi_error () - return - self._vi_undo_cursor -= 1 - self.vi_undo_assign () - - def vi_undo_all (self): - self.vi_undo_prepare () - if self._vi_undo_cursor > 0: - self._vi_undo_cursor = 0 - self.vi_undo_assign () - else: - self.vi_error () - - def vi_undo_assign (self): - tpl_undo = self._vi_undo_stack [self._vi_undo_cursor] - self.l_buffer.line_buffer = tpl_undo [1][:] - self.l_buffer.point = tpl_undo [0] - - def vi_redo (self, e): - if self._vi_undo_cursor >= len(self._vi_undo_stack)-1: - self.vi_error () - return - self._vi_undo_cursor += 1 - self.vi_undo_assign () - - def vi_search (self, rng): - for i in rng: - line_history = self._history.history [i] - pos = line_history.get_line_text().find (self._vi_search_text) - if pos >= 0: - self._history.history_cursor = i - self.l_buffer.line_buffer = list (line_history.line_buffer) - self.l_buffer.point = pos - self.vi_undo_restart () - return True - self._bell () - return False - - def vi_search_first (self): - text = ''.join (self.l_buffer.line_buffer [1:]) - if text: - self._vi_search_text = text - position = len (self._history.history) - 1 - elif self._vi_search_text: - position = self._history.history_cursor - 1 - else: - self.vi_error () - self.vi_undo () - return - if not self.vi_search (range (position, -1, -1)): - # Here: search text not found - self.vi_undo () - - def vi_search_again_backward (self): - self.vi_search (range (self._history.history_cursor-1, -1, -1)) - - def vi_search_again_forward (self): - self.vi_search (range (self._history.history_cursor+1, len(self._history.history))) - - def vi_up (self, e): - if self._history.history_cursor == len(self._history.history): - self._vi_current = self.l_buffer.line_buffer [:] - # self._history.previous_history (e) - self._history.previous_history (self.l_buffer) - if self.vi_is_insert_mode: - self.end_of_line (e) - else: - self.beginning_of_line (e) - self.vi_undo_restart () - - def vi_down (self, e): - if self._history.history_cursor >= len(self._history.history): - self.vi_error () - return - if self._history.history_cursor < len(self._history.history) - 1: - # self._history.next_history (e) - self._history.next_history (self.l_buffer) - if self.vi_is_insert_mode: - self.end_of_line (e) - else: - self.beginning_of_line (e) - self.vi_undo_restart () - elif self._vi_current is not None: - self._history.history_cursor = len(self._history.history) - self.l_buffer.line_buffer = self._vi_current - self.end_of_line (e) - if not self.vi_is_insert_mode and self.l_buffer.point > 0: - self.l_buffer.point -= 1 - self._vi_current = None - else: - self.vi_error () - return - - def vi_arrow_up (self, e): - self.vi_set_insert_mode (True) - self.vi_up (e) - self.vi_save_line () - - def vi_arrow_down (self, e): - self.vi_set_insert_mode (True) - self.vi_down (e) - self.vi_save_line () - - def vi_complete (self, e): - text = self.l_buffer.get_line_text () - if text and not text.isspace (): - return self.complete (e) - else: - return self.vi_key (e) - -# vi input states -# sequence of possible states are in the order below -_VI_BEGIN = 'vi_begin' -_VI_MULTI1 = 'vi_multi1' -_VI_ACTION = 'vi_action' -_VI_MULTI2 = 'vi_multi2' -_VI_MOTION = 'vi_motion' -_VI_MOTION_ARGUMENT = 'vi_motion_argument' -_VI_REPLACE_ONE = 'vi_replace_one' -_VI_TEXT = 'vi_text' -_VI_SEARCH = 'vi_search' -_VI_END = 'vi_end' - -# vi helper class -class ViCommand: - def __init__ (self, readline): - self.readline = readline - self.lst_char = [] - self.state = _VI_BEGIN - self.action = self.movement - self.motion = None - self.motion_argument = None - self.text = None - self.pos_motion = None - self.is_edit = False - self.is_overwrite = False - self.is_error = False - self.is_star = False - self.delete_left = 0 - self.delete_right = 0 - self.readline._vi_multiplier1 = '' - self.readline._vi_multiplier2 = '' - self.set_override_multiplier (0) - self.skip_multipler = False - self.tabstop = 4 - self.dct_fcn = { - ord('$') : self.key_dollar, - ord('^') : self.key_hat, - ord(';') : self.key_semicolon, - ord(',') : self.key_comma, - ord('%') : self.key_percent, - ord('.') : self.key_dot, - ord('/') : self.key_slash, - ord('*') : self.key_star, - ord('|') : self.key_bar, - ord('~') : self.key_tilde, - 8 : self.key_backspace, - } - - def add_char (self, char): - self.lst_char.append (char) - if self.state == _VI_BEGIN and self.readline.vi_is_insert_mode: - self.readline.vi_save_line () - self.state = _VI_TEXT - if self.state == _VI_SEARCH: - if char == '\x08': # backspace - self.key_backspace (char) - else: - self.set_text (char) - return - if self.state == _VI_TEXT: - if char == '\x1b': # escape - self.escape (char) - elif char == '\x09': # tab - ts = self.tabstop - ws = ' ' * (ts - (self.readline.l_buffer.point%ts)) - self.set_text (ws) - elif char == '\x08': # backspace - self.key_backspace (char) - else: - self.set_text (char) - return - if self.state == _VI_MOTION_ARGUMENT: - self.set_motion_argument (char) - return - if self.state == _VI_REPLACE_ONE: - self.replace_one (char) - return - try: - fcn_instance = self.dct_fcn [ord(char)] - except: - fcn_instance = getattr (self, 'key_%s' % char, None) - if fcn_instance: - fcn_instance (char) - return - if char.isdigit (): - self.key_digit (char) - return - # Here: could not process key - self.error () - - def set_text (self, text): - if self.text is None: - self.text = text - else: - self.text += text - self.set_buffer (text) - - def set_buffer (self, text): - for char in text: - if not self.char_isprint (char): - continue -# self.readline.l_buffer.insert_text(char) -# continue -# #overwrite in l_buffer obj - if self.is_overwrite: - if self.readline.l_buffer.point < len (self.readline.l_buffer.line_buffer): - # self.readline.l_buffer[self.l_buffer.point]=char - self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] = char - else: - # self.readline.l_buffer.insert_text(char) - self.readline.l_buffer.line_buffer.append (char) - else: - # self.readline.l_buffer.insert_text(char) - self.readline.l_buffer.line_buffer.insert (self.readline.l_buffer.point, char) - self.readline.l_buffer.point += 1 - - def replace_one (self, char): - if char == '\x1b': # escape - self.end () - return - self.is_edit = True - self.readline.vi_save_line () - times = self.get_multiplier () - cursor = self.readline.l_buffer.point - self.readline.l_buffer.line_buffer [cursor : cursor + times] = char * times - if times > 1: - self.readline.l_buffer.point += (times - 1) - self.end () - - def char_isprint (self, char): - return ord(char) >= ord(' ') and ord(char) <= ord('~') - - def key_dollar (self, char): - self.motion = self.motion_end_in_line - self.delete_right = 1 - self.state = _VI_MOTION - self.apply () - - def key_hat (self, char): - self.motion = self.motion_beginning_of_line - self.state = _VI_MOTION - self.apply () - - def key_0 (self, char): - if self.state in [_VI_BEGIN, _VI_ACTION]: - self.key_hat (char) - else: - self.key_digit (char) - - def key_digit (self, char): - if self.state in [_VI_BEGIN, _VI_MULTI1]: - self.readline._vi_multiplier1 += char - self.readline._vi_multiplier2 = '' - self.state = _VI_MULTI1 - elif self.state in [_VI_ACTION, _VI_MULTI2]: - self.readline._vi_multiplier2 += char - self.state = _VI_MULTI2 - - def key_w (self, char): - if self.action == self.change: - self.key_e (char) - return - self.motion = self.motion_word_short - self.state = _VI_MOTION - self.apply () - - def key_W (self, char): - if self.action == self.change: - self.key_E (char) - return - self.motion = self.motion_word_long - self.state = _VI_MOTION - self.apply () - - def key_e (self, char): - self.motion = self.motion_end_short - self.state = _VI_MOTION - self.delete_right = 1 - self.apply () - - def key_E (self, char): - self.motion = self.motion_end_long - self.state = _VI_MOTION - self.delete_right = 1 - self.apply () - - def key_b (self, char): - self.motion = self.motion_back_short - self.state = _VI_MOTION - self.apply () - - def key_B (self, char): - self.motion = self.motion_back_long - self.state = _VI_MOTION - self.apply () - - def key_f (self, char): - self.readline._vi_key_find_direction = True - self.motion = self.motion_find_char_forward - self.delete_right = 1 - self.state = _VI_MOTION_ARGUMENT - - def key_F (self, char): - self.readline._vi_key_find_direction = False - self.motion = self.motion_find_char_backward - self.delete_left = 1 - self.state = _VI_MOTION_ARGUMENT - - def key_t (self, char): - self.motion = self.motion_to_char_forward - self.delete_right = 1 - self.state = _VI_MOTION_ARGUMENT - - def key_T (self, char): - self.motion = self.motion_to_char_backward - self.state = _VI_MOTION_ARGUMENT - - def key_j (self, char): - self.readline.vi_down (ViEvent (char)) - self.state = _VI_END - - def key_k (self, char): - self.readline.vi_up (ViEvent (char)) - self.state = _VI_END - - def key_semicolon (self, char): - if self.readline._vi_key_find_char is None: - self.error () - return - if self.readline._vi_key_find_direction: - self.motion = self.motion_find_char_forward - else: - self.motion = self.motion_find_char_backward - self.set_motion_argument (self.readline._vi_key_find_char) - - def key_comma (self, char): - if self.readline._vi_key_find_char is None: - self.error () - return - if self.readline._vi_key_find_direction: - self.motion = self.motion_find_char_backward - else: - self.motion = self.motion_find_char_forward - self.set_motion_argument (self.readline._vi_key_find_char) - - def key_percent (self, char): - '''find matching <([{}])>''' - self.motion = self.motion_matching - self.delete_right = 1 - self.state = _VI_MOTION - self.apply () - - def key_dot (self, char): - vi_cmd_edit = self.readline._vi_command_edit - if not vi_cmd_edit: - return - if vi_cmd_edit.is_star: - self.key_star (char) - return - if self.has_multiplier (): - count = self.get_multiplier () - else: - count = 0 - # Create the ViCommand object after getting multipler from self - # Side effect of the ViCommand creation is resetting of global multipliers - vi_cmd = ViCommand (self.readline) - if count >= 1: - vi_cmd.set_override_multiplier (count) - vi_cmd_edit.set_override_multiplier (count) - elif vi_cmd_edit.override_multiplier: - vi_cmd.set_override_multiplier (vi_cmd_edit.override_multiplier) - for char in vi_cmd_edit.lst_char: - vi_cmd.add_char (char) - if vi_cmd_edit.is_overwrite and self.readline.l_buffer.point > 0: - self.readline.l_buffer.point -= 1 - self.readline.vi_set_insert_mode (False) - self.end () - - def key_slash (self, char): - self.readline.vi_save_line () - self.readline.l_buffer.line_buffer=['/'] - self.readline.l_buffer.point= 1 - self.state = _VI_SEARCH - - def key_star (self, char): - self.is_star = True - self.is_edit = True - self.readline.vi_save_line () - completions = self.readline._get_completions() - if completions: - text = ' '.join (completions) + ' ' - self.readline.l_buffer.line_buffer [self.readline.begidx : self.readline.endidx + 1] = list (text) - prefix_len = self.readline.endidx - self.readline.begidx - self.readline.l_buffer.point += len(text) - prefix_len - self.readline.vi_set_insert_mode (True) - else: - self.error () - self.state = _VI_TEXT - - def key_bar (self, char): - self.motion = self.motion_column - self.state = _VI_MOTION - self.apply () - - def key_tilde (self, char): - self.is_edit = True - self.readline.vi_save_line () - for i in range (self.get_multiplier()): - try: - c = self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] - if c.isupper (): - self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] = c.lower() - elif c.islower (): - self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] = c.upper() - self.readline.l_buffer.point += 1 - except IndexError: - break - self.end () - - def key_h (self, char): - self.motion = self.motion_left - self.state = _VI_MOTION - self.apply () - - def key_backspace (self, char): - if self.state in [_VI_TEXT, _VI_SEARCH]: - if self.text and len(self.text): - self.text = self.text [:-1] - try: - # Remove backspaces for potential dot command - self.lst_char.pop () - self.lst_char.pop () - except IndexError: - pass - else: - self.key_h (char) - self.readline._vi_do_backspace (self) - if self.state == _VI_SEARCH and not (self.readline.l_buffer.line_buffer): - self.state = _VI_BEGIN - - def key_l (self, char): - self.motion = self.motion_right - self.state = _VI_MOTION - self.apply () - - def key_i (self, char): - self.is_edit = True - self.state = _VI_TEXT - self.readline.vi_set_insert_mode (True) - - def key_I (self, char): - self.is_edit = True - self.state = _VI_TEXT - self.readline.vi_set_insert_mode (True) - self.readline.l_buffer.point = 0 - - def key_a (self, char): - self.is_edit = True - self.state = _VI_TEXT - self.readline.vi_set_insert_mode (True) - if len (self.readline.l_buffer.line_buffer): - self.readline.l_buffer.point += 1 - - def key_A (self, char): - self.is_edit = True - self.state = _VI_TEXT - self.readline.vi_set_insert_mode (True) - self.readline.l_buffer.point = len (self.readline.l_buffer.line_buffer) - - def key_d (self, char): - self.is_edit = True - self.state = _VI_ACTION - self.action = self.delete - - def key_D (self, char): - self.is_edit = True - self.state = _VI_ACTION - self.action = self.delete_end_of_line - self.apply () - - def key_x (self, char): - self.is_edit = True - self.state = _VI_ACTION - self.action = self.delete_char - self.apply () - - def key_X (self, char): - self.is_edit = True - self.state = _VI_ACTION - self.action = self.delete_prev_char - self.apply () - - def key_s (self, char): - self.is_edit = True - i1 = self.readline.l_buffer.point - i2 = self.readline.l_buffer.point + self.get_multiplier () - self.skip_multipler = True - self.readline.vi_set_insert_mode (True) - del self.readline.l_buffer.line_buffer [i1 : i2] - self.state = _VI_TEXT - - def key_S (self, char): - self.is_edit = True - self.readline.vi_set_insert_mode (True) - self.readline.l_buffer.line_buffer = [] - self.readline.l_buffer.point = 0 - self.state = _VI_TEXT - - def key_c (self, char): - self.is_edit = True - self.state = _VI_ACTION - self.action = self.change - - def key_C (self, char): - self.is_edit = True - self.readline.vi_set_insert_mode (True) - del self.readline.l_buffer.line_buffer [self.readline.l_buffer.point : ] - self.state = _VI_TEXT - - def key_r (self, char): - self.state = _VI_REPLACE_ONE - - def key_R (self, char): - self.is_edit = True - self.is_overwrite = True - self.readline.l_buffer.overwrite=True - self.readline.vi_set_insert_mode (True) - self.state = _VI_TEXT - - def key_y (self, char): - self._state = _VI_ACTION - self.action = self.yank - - def key_Y (self, char): - self.readline._vi_yank_buffer = self.readline.l_buffer.get_line_text() - self.end () - - def key_p (self, char): - if not self.readline._vi_yank_buffer: - return - self.is_edit = True - self.readline.vi_save_line () - self.readline.l_buffer.point += 1 - self.readline.l_buffer.insert_text (self.readline._vi_yank_buffer * self.get_multiplier ()) - self.readline.l_buffer.point -= 1 - self.state = _VI_END - - def key_P (self, char): - if not self.readline._vi_yank_buffer: - return - self.is_edit = True - self.readline.vi_save_line () - self.readline.l_buffer.insert_text (self.readline._vi_yank_buffer * self.get_multiplier ()) - self.readline.l_buffer.point -= 1 - self.state = _VI_END - - def key_u (self, char): - self.readline.vi_undo () - self.state = _VI_END - - def key_U (self, char): - self.readline.vi_undo_all () - self.state = _VI_END - - def key_v (self, char): - editor = ViExternalEditor (self.readline.l_buffer.line_buffer) - self.readline.l_buffer.line_buffer = list (editor.result) - self.readline.l_buffer.point = 0 - self.is_edit = True - self.state = _VI_END - - def error (self): - self.readline._bell () - self.is_error = True - - def state_is_end (self): - return self.state == _VI_END - is_end = property (state_is_end) - - def state_is_search (self): - return self.state == _VI_SEARCH - is_search = property (state_is_search) - - def state_is_replace_one (self): - return self.state == _VI_REPLACE_ONE - is_replace_one = property (state_is_replace_one) - - def do_search (self): - self.readline.vi_search_first () - self.state = _VI_END - - def key_n (self, char): - self.readline.vi_search_again_backward () - self.state = _VI_END - - def key_N (self, char): - self.readline.vi_search_again_forward () - self.state = _VI_END - - def motion_beginning_of_line (self, line, index=0, count=1, **kw): - return 0 - - def motion_end_in_line (self, line, index=0, count=1, **kw): - return max (0, len (self.readline.l_buffer.line_buffer)-1) - - def motion_word_short (self, line, index=0, count=1, **kw): - return vi_pos_word_short (line, index, count) - - def motion_word_long (self, line, index=0, count=1, **kw): - return vi_pos_word_long (line, index, count) - - def motion_end_short (self, line, index=0, count=1, **kw): - return vi_pos_end_short (line, index, count) - - def motion_end_long (self, line, index=0, count=1, **kw): - return vi_pos_end_long (line, index, count) - - def motion_back_short (self, line, index=0, count=1, **kw): - return vi_pos_back_short (line, index, count) - - def motion_back_long (self, line, index=0, count=1, **kw): - return vi_pos_back_long (line, index, count) - - def motion_find_char_forward (self, line, index=0, count=1, char=None): - self.readline._vi_key_find_char = char - return vi_pos_find_char_forward (line, char, index, count) - - def motion_find_char_backward (self, line, index=0, count=1, char=None): - self.readline._vi_key_find_char = char - return vi_pos_find_char_backward (line, char, index, count) - - def motion_to_char_forward (self, line, index=0, count=1, char=None): - return vi_pos_to_char_forward (line, char, index, count) - - def motion_to_char_backward (self, line, index=0, count=1, char=None): - return vi_pos_to_char_backward (line, char, index, count) - - def motion_left (self, line, index=0, count=1, char=None): - return max (0, index - count) - - def motion_right (self, line, index=0, count=1, char=None): - return min (len(line), index + count) - - def motion_matching (self, line, index=0, count=1, char=None): - return vi_pos_matching (line, index) - - def motion_column (self, line, index=0, count=1, char=None): - return max (0, count-1) - - def has_multiplier (self): - return self.override_multiplier or self.readline._vi_multiplier1 or self.readline._vi_multiplier2 - - def get_multiplier (self): - if self.override_multiplier: - return int (self.override_multiplier) - if self.readline._vi_multiplier1 == '': m1 = 1 - else: m1 = int(self.readline._vi_multiplier1) - if self.readline._vi_multiplier2 == '': m2 = 1 - else: m2 = int(self.readline._vi_multiplier2) - return m1 * m2 - - def set_override_multiplier (self, count): - self.override_multiplier = count - - def apply (self): - if self.motion: - self.pos_motion = self.motion (self.readline.l_buffer.line_buffer, self.readline.l_buffer.point, - self.get_multiplier(), char=self.motion_argument) - if self.pos_motion < 0: - self.error () - return - self.action () - if self.state != _VI_TEXT: - self.end () - - def movement (self): - if self.pos_motion <= len(self.readline.l_buffer.line_buffer): - self.readline.l_buffer.point = self.pos_motion - else: - self.readline.l_buffer.point = len(self.readline.l_buffer.line_buffer) - 1 - - def yank (self): - if self.pos_motion > self.readline.l_buffer.point: - s = self.readline.l_buffer.line_buffer [self.readline.l_buffer.point : self.pos_motion + self.delete_right] - else: - index = max (0, self.pos_motion - self.delete_left) - s = self.readline.l_buffer.line_buffer [index : self.readline.l_buffer.point + self.delete_right] - self.readline._vi_yank_buffer = s - - def delete (self): - self.readline.vi_save_line () - self.yank () -# point=lineobj.Point(self.readline.l_buffer) -# pm=self.pos_motion -# del self.readline.l_buffer[point:pm] -# return - if self.pos_motion > self.readline.l_buffer.point: - del self.readline.l_buffer.line_buffer [self.readline.l_buffer.point : self.pos_motion + self.delete_right] - if self.readline.l_buffer.point > len (self.readline.l_buffer.line_buffer): - self.readline.l_buffer.point = len (self.readline.l_buffer.line_buffer) - else: - index = max (0, self.pos_motion - self.delete_left) - del self.readline.l_buffer.line_buffer [index : self.readline.l_buffer.point + self.delete_right] - self.readline.l_buffer.point = index - - def delete_end_of_line (self): - self.readline.vi_save_line () - # del self.readline.l_buffer [self.readline.l_buffer.point : ] - line_text = self.readline.l_buffer.get_line_text () - line_text = line_text [ : self.readline.l_buffer.point] - self.readline.l_buffer.set_line (line_text) - if self.readline.l_buffer.point > 0: - self.readline.l_buffer.point -= 1 - - def delete_char (self): -# point=lineobj.Point(self.readline.l_buffer) -# del self.readline.l_buffer[point:point+self.get_multiplier ()] -# return - self.pos_motion = self.readline.l_buffer.point + self.get_multiplier () - self.delete () - end = max (0, len (self.readline.l_buffer) - 1) - if self.readline.l_buffer.point > end: - self.readline.l_buffer.point = end - - def delete_prev_char (self): - self.pos_motion = self.readline.l_buffer.point - self.get_multiplier () - self.delete () - - def change (self): - self.readline.vi_set_insert_mode (True) - self.delete () - self.skip_multipler = True - self.state = _VI_TEXT - - def escape (self, char): - if self.state == _VI_TEXT: - if not self.skip_multipler: - times = self.get_multiplier () - if times > 1 and self.text: - extra = self.text * (times - 1) - self.set_buffer (extra) - self.state = _VI_END - - def set_motion_argument (self, char): - self.motion_argument = char - self.apply () - - def end (self): - self.state = _VI_END - if self.readline.l_buffer.point >= len(self.readline.l_buffer.line_buffer): - self.readline.l_buffer.point = max (0, len(self.readline.l_buffer.line_buffer) - 1) - -class ViExternalEditor: - def __init__ (self, line): - if type(line) is type([]): - line = ''.join (line) - file_tmp = self.get_tempfile () - fp_tmp = self.file_open (file_tmp, 'w') - fp_tmp.write (line) - fp_tmp.close () - self.run_editor (file_tmp) - fp_tmp = self.file_open (file_tmp, 'r') - self.result = fp_tmp.read () - fp_tmp.close () - self.file_remove (file_tmp) - - def get_tempfile (self): - import tempfile - return tempfile.mktemp (prefix='readline-', suffix='.py') - - def file_open (self, filename, mode): - return file (filename, mode) - - def file_remove (self, filename): - os.remove (filename) - - def get_editor (self): - try: - return os.environ ['EDITOR'] - except KeyError: - return 'notepad' # ouch - - def run_editor (self, filename): - cmd = '%s %s' % (self.get_editor(), filename, ) - self.run_command (cmd) - - def run_command (self, command): - os.system (command) - -class ViEvent: - def __init__ (self, char): - self.char = char - -# vi standalone functions -def vi_is_word (char): - log ('xx vi_is_word: type(%s), %s' % (type(char), char, )) - return char.isalpha() or char.isdigit() or char == '_' - -def vi_is_space (char): - return char.isspace () - -def vi_is_word_or_space (char): - return vi_is_word (char) or vi_is_space (char) - -def vi_pos_word_short (line, index=0, count=1): - try: - for i in range(count): - in_word = vi_is_word (line[index]) - if not in_word: - while not vi_is_word (line[index]): - index += 1 - else: - while vi_is_word (line[index]): - index += 1 - while vi_is_space (line[index]): - index += 1 - return index - except IndexError: - return len(line) - -def vi_pos_word_long (line, index=0, count=1): - try: - for i in range(count): - in_space = vi_is_space (line[index]) - if not in_space: - while not vi_is_space (line[index]): - index += 1 - while vi_is_space (line[index]): - index += 1 - return index - except IndexError: - return len(line) - -def vi_pos_end_short (line, index=0, count=1): - try: - for i in range(count): - index += 1 - while vi_is_space (line[index]): - index += 1 - in_word = vi_is_word (line[index]) - if not in_word: - while not vi_is_word_or_space (line[index]): - index += 1 - else: - while vi_is_word (line[index]): - index += 1 - return index - 1 - except IndexError: - return max (0, len(line)-1) - -def vi_pos_end_long (line, index=0, count=1): - try: - for i in range(count): - index += 1 - while vi_is_space (line[index]): - index += 1 - while not vi_is_space (line[index]): - index += 1 - return index - 1 - except IndexError: - return max (0, len(line)-1) - -class vi_list (list): - '''This is a list that cannot have a negative index''' - def __getitem__ (self, key): - try: - if int(key) < 0: - raise IndexError - except ValueError: - pass - return list.__getitem__ (self, key) - -def vi_pos_back_short (line, index=0, count=1): - line = vi_list (line) - try: - for i in range(count): - index -= 1 - while vi_is_space (line[index]): - index -= 1 - in_word = vi_is_word (line[index]) - if in_word: - while vi_is_word (line[index]): - index -= 1 - else: - while not vi_is_word_or_space (line[index]): - index -= 1 - return index + 1 - except IndexError: - return 0 - -def vi_pos_back_long (line, index=0, count=1): - line = vi_list (line) - try: - for i in range(count): - index -= 1 - while vi_is_space (line[index]): - index -= 1 - while not vi_is_space (line[index]): - index -= 1 - return index + 1 - except IndexError: - return 0 - -def vi_pos_find_char_forward (line, char, index=0, count=1): - try: - for i in range(count): - index += 1 - while line [index] != char: - index += 1 - return index - except IndexError: - return -1 - -def vi_pos_find_char_backward (line, char, index=0, count=1): - try: - for i in range(count): - index -= 1 - while 1: - if index < 0: - return -1 - if line[index] == char: - break - index -= 1 - return index - except IndexError: - return -1 - -def vi_pos_to_char_forward (line, char, index=0, count=1): - index = vi_pos_find_char_forward (line, char, index, count) - if index > 0: - return index - 1 - return index - -def vi_pos_to_char_backward (line, char, index=0, count=1): - index = vi_pos_find_char_backward (line, char, index, count) - if index >= 0: - return index + 1 - return index - -_vi_dct_matching = { - '<': ('>', +1), '>': ('<', -1), - '(': (')', +1), ')': ('(', -1), - '[': (']', +1), ']': ('[', -1), - '{': ('}', +1), '}': ('{', -1), -} - -def vi_pos_matching (line, index=0): - '''find matching <([{}])>''' - anchor = None - target = None - delta = 1 - count = 0 - try: - while 1: - if anchor is None: - # first find anchor - try: - target, delta = _vi_dct_matching [line [index]] - anchor = line [index] - count = 1 - except KeyError: - index += 1 - continue - else: - # Here the anchor has been found - # Need to get corresponding target - if index < 0: - return -1 - if line [index] == anchor: - count += 1 - elif line [index] == target: - count -= 1 - if count == 0: - return index - index += delta - except IndexError: - return -1 - +# -*- coding: utf-8 -*- +#***************************************************************************** +# Copyright (C) 2003-2006 Gary Bishop. +# Copyright (C) 2006 Michael Graz. +# Copyright (C) 2006 Jorgen Stenarson. +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** +import os +import pyreadline.logger as logger +from pyreadline.logger import log +import pyreadline.lineeditor.lineobj as lineobj +import pyreadline.lineeditor.history as history +from . import basemode + +class ViMode(basemode.BaseMode): + mode="vi" + def __init__(self,rlobj): + super(ViMode,self).__init__(rlobj) + self.__vi_insert_mode = None + + def __repr__(self): + return "" + + def process_keyevent(self, keyinfo): + def nop(e): + pass + keytuple=keyinfo.tuple() + + #Process exit keys. Only exit on empty line + if keytuple in self.exit_dispatch: + if lineobj.EndOfLine(self.l_buffer) == 0: + raise EOFError + + dispatch_func = self.key_dispatch.get(keytuple,self.vi_key) + log("readline from keyboard:%s->%s"%(keytuple,dispatch_func)) + r = None + if dispatch_func: + r = dispatch_func(keyinfo) + self.l_buffer.push_undo() + + self.previous_func = dispatch_func + if r: + self._update_line() + return True + return False + + ### Methods below here are bindable emacs functions + + def init_editing_mode(self, e): # (M-C-j) + '''Initialize vi editingmode''' + self.show_all_if_ambiguous = 'on' + self.key_dispatch = {} + self.__vi_insert_mode = None + self._vi_command = None + self._vi_command_edit = None + self._vi_key_find_char = None + self._vi_key_find_direction = True + self._vi_yank_buffer = None + self._vi_multiplier1 = '' + self._vi_multiplier2 = '' + self._vi_undo_stack = [] + self._vi_undo_cursor = -1 + self._vi_current = None + self._vi_search_text = '' + self.vi_save_line () + self.vi_set_insert_mode (True) + # make ' ' to ~ self insert + for c in range(ord(' '), 127): + self._bind_key('%s' % chr(c), self.vi_key) + self._bind_key('BackSpace', self.vi_backspace) + self._bind_key('Escape', self.vi_escape) + self._bind_key('Return', self.vi_accept_line) + + self._bind_key('Left', self.backward_char) + self._bind_key('Right', self.forward_char) + self._bind_key('Home', self.beginning_of_line) + self._bind_key('End', self.end_of_line) + self._bind_key('Delete', self.delete_char) + + self._bind_key('Control-d', self.vi_eof) + self._bind_key('Control-z', self.vi_eof) + self._bind_key('Control-r', self.vi_redo) + self._bind_key('Up', self.vi_arrow_up) + self._bind_key('Control-p', self.vi_up) + self._bind_key('Down', self.vi_arrow_down) + self._bind_key('Control-n', self.vi_down) + self._bind_key('Tab', self.vi_complete) +# self._bind_key('Control-e', self.emacs) + + def vi_key (self, e): + if not self._vi_command: + self._vi_command = ViCommand (self) + elif self._vi_command.is_end: + if self._vi_command.is_edit: + self._vi_command_edit = self._vi_command + self._vi_command = ViCommand (self) + self._vi_command.add_char (e.char) + + def vi_error (self): + self._bell () + + def vi_get_is_insert_mode (self): + return self.__vi_insert_mode + vi_is_insert_mode = property (vi_get_is_insert_mode) + + def vi_escape (self, e): + if self.vi_is_insert_mode: + if self._vi_command: + self._vi_command.add_char (e.char) + else: + self._vi_command = ViCommand (self) + self.vi_set_insert_mode (False) + self.l_buffer.point=lineobj.PrevChar + elif self._vi_command and self._vi_command.is_replace_one: + self._vi_command.add_char (e.char) + else: + self.vi_error () + + def vi_backspace (self, e): + if self._vi_command: + self._vi_command.add_char (e.char) + else: + self._vi_do_backspace (self._vi_command) + + def _vi_do_backspace (self, vi_cmd): + if self.vi_is_insert_mode or (self._vi_command and self._vi_command.is_search): + if self.l_buffer.point > 0: + self.l_buffer.point -= 1 + if self.l_buffer.overwrite: + try: + prev = self._vi_undo_stack [self._vi_undo_cursor][1][self.l_buffer.point ] + self.l_buffer.line_buffer [self.l_buffer.point] = prev + except IndexError: + del self.l_buffer.line_buffer [self.l_buffer.point ] + else: + self.vi_save_line () + del self.l_buffer.line_buffer [self.l_buffer.point ] + + def vi_accept_line (self, e): + if self._vi_command and self._vi_command.is_search: + self._vi_command.do_search () + return False + self._vi_command = None + self.vi_set_insert_mode (True) + self._vi_undo_stack = [] + self._vi_undo_cursor = -1 + self._vi_current = None + return self.accept_line (e) + + def vi_eof (self, e): + raise EOFError + + def vi_set_insert_mode (self, value): + if self.__vi_insert_mode == value: + return + self.__vi_insert_mode = value + if value: + self.vi_save_line () + self.cursor_size=25 + else: + self.cursor_size=100 + + def vi_undo_restart (self): + tpl_undo = (self.l_buffer.point, self.l_buffer.line_buffer[:], ) + self._vi_undo_stack = [tpl_undo] + self._vi_undo_cursor = 0 + + def vi_save_line (self): + if self._vi_undo_stack and self._vi_undo_cursor >= 0: + del self._vi_undo_stack [self._vi_undo_cursor + 1 : ] + # tpl_undo = (self.l_buffer.point, self.l_buffer[:], ) + tpl_undo = (self.l_buffer.point, self.l_buffer.line_buffer[:], ) + if not self._vi_undo_stack or self._vi_undo_stack[self._vi_undo_cursor][1] != tpl_undo[1]: + self._vi_undo_stack.append (tpl_undo) + self._vi_undo_cursor += 1 + + def vi_undo_prepare (self): + if self._vi_undo_cursor == len(self._vi_undo_stack)-1: + self.vi_save_line () + + def vi_undo (self, do_pop=True): + self.vi_undo_prepare () + if not self._vi_undo_stack or self._vi_undo_cursor <= 0: + self.vi_error () + return + self._vi_undo_cursor -= 1 + self.vi_undo_assign () + + def vi_undo_all (self): + self.vi_undo_prepare () + if self._vi_undo_cursor > 0: + self._vi_undo_cursor = 0 + self.vi_undo_assign () + else: + self.vi_error () + + def vi_undo_assign (self): + tpl_undo = self._vi_undo_stack [self._vi_undo_cursor] + self.l_buffer.line_buffer = tpl_undo [1][:] + self.l_buffer.point = tpl_undo [0] + + def vi_redo (self, e): + if self._vi_undo_cursor >= len(self._vi_undo_stack)-1: + self.vi_error () + return + self._vi_undo_cursor += 1 + self.vi_undo_assign () + + def vi_search (self, rng): + for i in rng: + line_history = self._history.history [i] + pos = line_history.get_line_text().find (self._vi_search_text) + if pos >= 0: + self._history.history_cursor = i + self.l_buffer.line_buffer = list (line_history.line_buffer) + self.l_buffer.point = pos + self.vi_undo_restart () + return True + self._bell () + return False + + def vi_search_first (self): + text = ''.join (self.l_buffer.line_buffer [1:]) + if text: + self._vi_search_text = text + position = len (self._history.history) - 1 + elif self._vi_search_text: + position = self._history.history_cursor - 1 + else: + self.vi_error () + self.vi_undo () + return + if not self.vi_search (list(range(position, -1, -1))): + # Here: search text not found + self.vi_undo () + + def vi_search_again_backward (self): + self.vi_search (list(range(self._history.history_cursor-1, -1, -1))) + + def vi_search_again_forward (self): + self.vi_search (list(range(self._history.history_cursor+1, len(self._history.history)))) + + def vi_up (self, e): + if self._history.history_cursor == len(self._history.history): + self._vi_current = self.l_buffer.line_buffer [:] + # self._history.previous_history (e) + self._history.previous_history (self.l_buffer) + if self.vi_is_insert_mode: + self.end_of_line (e) + else: + self.beginning_of_line (e) + self.vi_undo_restart () + + def vi_down (self, e): + if self._history.history_cursor >= len(self._history.history): + self.vi_error () + return + if self._history.history_cursor < len(self._history.history) - 1: + # self._history.next_history (e) + self._history.next_history (self.l_buffer) + if self.vi_is_insert_mode: + self.end_of_line (e) + else: + self.beginning_of_line (e) + self.vi_undo_restart () + elif self._vi_current is not None: + self._history.history_cursor = len(self._history.history) + self.l_buffer.line_buffer = self._vi_current + self.end_of_line (e) + if not self.vi_is_insert_mode and self.l_buffer.point > 0: + self.l_buffer.point -= 1 + self._vi_current = None + else: + self.vi_error () + return + + def vi_arrow_up (self, e): + self.vi_set_insert_mode (True) + self.vi_up (e) + self.vi_save_line () + + def vi_arrow_down (self, e): + self.vi_set_insert_mode (True) + self.vi_down (e) + self.vi_save_line () + + def vi_complete (self, e): + text = self.l_buffer.get_line_text () + if text and not text.isspace (): + return self.complete (e) + else: + return self.vi_key (e) + +# vi input states +# sequence of possible states are in the order below +_VI_BEGIN = 'vi_begin' +_VI_MULTI1 = 'vi_multi1' +_VI_ACTION = 'vi_action' +_VI_MULTI2 = 'vi_multi2' +_VI_MOTION = 'vi_motion' +_VI_MOTION_ARGUMENT = 'vi_motion_argument' +_VI_REPLACE_ONE = 'vi_replace_one' +_VI_TEXT = 'vi_text' +_VI_SEARCH = 'vi_search' +_VI_END = 'vi_end' + +# vi helper class +class ViCommand: + def __init__ (self, readline): + self.readline = readline + self.lst_char = [] + self.state = _VI_BEGIN + self.action = self.movement + self.motion = None + self.motion_argument = None + self.text = None + self.pos_motion = None + self.is_edit = False + self.is_overwrite = False + self.is_error = False + self.is_star = False + self.delete_left = 0 + self.delete_right = 0 + self.readline._vi_multiplier1 = '' + self.readline._vi_multiplier2 = '' + self.set_override_multiplier (0) + self.skip_multipler = False + self.tabstop = 4 + self.dct_fcn = { + ord('$') : self.key_dollar, + ord('^') : self.key_hat, + ord(';') : self.key_semicolon, + ord(',') : self.key_comma, + ord('%') : self.key_percent, + ord('.') : self.key_dot, + ord('/') : self.key_slash, + ord('*') : self.key_star, + ord('|') : self.key_bar, + ord('~') : self.key_tilde, + 8 : self.key_backspace, + } + + def add_char (self, char): + self.lst_char.append (char) + if self.state == _VI_BEGIN and self.readline.vi_is_insert_mode: + self.readline.vi_save_line () + self.state = _VI_TEXT + if self.state == _VI_SEARCH: + if char == '\x08': # backspace + self.key_backspace (char) + else: + self.set_text (char) + return + if self.state == _VI_TEXT: + if char == '\x1b': # escape + self.escape (char) + elif char == '\x09': # tab + ts = self.tabstop + ws = ' ' * (ts - (self.readline.l_buffer.point%ts)) + self.set_text (ws) + elif char == '\x08': # backspace + self.key_backspace (char) + else: + self.set_text (char) + return + if self.state == _VI_MOTION_ARGUMENT: + self.set_motion_argument (char) + return + if self.state == _VI_REPLACE_ONE: + self.replace_one (char) + return + try: + fcn_instance = self.dct_fcn [ord(char)] + except: + fcn_instance = getattr (self, 'key_%s' % char, None) + if fcn_instance: + fcn_instance (char) + return + if char.isdigit (): + self.key_digit (char) + return + # Here: could not process key + self.error () + + def set_text (self, text): + if self.text is None: + self.text = text + else: + self.text += text + self.set_buffer (text) + + def set_buffer (self, text): + for char in text: + if not self.char_isprint (char): + continue +# self.readline.l_buffer.insert_text(char) +# continue +# #overwrite in l_buffer obj + if self.is_overwrite: + if self.readline.l_buffer.point < len (self.readline.l_buffer.line_buffer): + # self.readline.l_buffer[self.l_buffer.point]=char + self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] = char + else: + # self.readline.l_buffer.insert_text(char) + self.readline.l_buffer.line_buffer.append (char) + else: + # self.readline.l_buffer.insert_text(char) + self.readline.l_buffer.line_buffer.insert (self.readline.l_buffer.point, char) + self.readline.l_buffer.point += 1 + + def replace_one (self, char): + if char == '\x1b': # escape + self.end () + return + self.is_edit = True + self.readline.vi_save_line () + times = self.get_multiplier () + cursor = self.readline.l_buffer.point + self.readline.l_buffer.line_buffer [cursor : cursor + times] = char * times + if times > 1: + self.readline.l_buffer.point += (times - 1) + self.end () + + def char_isprint (self, char): + return ord(char) >= ord(' ') and ord(char) <= ord('~') + + def key_dollar (self, char): + self.motion = self.motion_end_in_line + self.delete_right = 1 + self.state = _VI_MOTION + self.apply () + + def key_hat (self, char): + self.motion = self.motion_beginning_of_line + self.state = _VI_MOTION + self.apply () + + def key_0 (self, char): + if self.state in [_VI_BEGIN, _VI_ACTION]: + self.key_hat (char) + else: + self.key_digit (char) + + def key_digit (self, char): + if self.state in [_VI_BEGIN, _VI_MULTI1]: + self.readline._vi_multiplier1 += char + self.readline._vi_multiplier2 = '' + self.state = _VI_MULTI1 + elif self.state in [_VI_ACTION, _VI_MULTI2]: + self.readline._vi_multiplier2 += char + self.state = _VI_MULTI2 + + def key_w (self, char): + if self.action == self.change: + self.key_e (char) + return + self.motion = self.motion_word_short + self.state = _VI_MOTION + self.apply () + + def key_W (self, char): + if self.action == self.change: + self.key_E (char) + return + self.motion = self.motion_word_long + self.state = _VI_MOTION + self.apply () + + def key_e (self, char): + self.motion = self.motion_end_short + self.state = _VI_MOTION + self.delete_right = 1 + self.apply () + + def key_E (self, char): + self.motion = self.motion_end_long + self.state = _VI_MOTION + self.delete_right = 1 + self.apply () + + def key_b (self, char): + self.motion = self.motion_back_short + self.state = _VI_MOTION + self.apply () + + def key_B (self, char): + self.motion = self.motion_back_long + self.state = _VI_MOTION + self.apply () + + def key_f (self, char): + self.readline._vi_key_find_direction = True + self.motion = self.motion_find_char_forward + self.delete_right = 1 + self.state = _VI_MOTION_ARGUMENT + + def key_F (self, char): + self.readline._vi_key_find_direction = False + self.motion = self.motion_find_char_backward + self.delete_left = 1 + self.state = _VI_MOTION_ARGUMENT + + def key_t (self, char): + self.motion = self.motion_to_char_forward + self.delete_right = 1 + self.state = _VI_MOTION_ARGUMENT + + def key_T (self, char): + self.motion = self.motion_to_char_backward + self.state = _VI_MOTION_ARGUMENT + + def key_j (self, char): + self.readline.vi_down (ViEvent (char)) + self.state = _VI_END + + def key_k (self, char): + self.readline.vi_up (ViEvent (char)) + self.state = _VI_END + + def key_semicolon (self, char): + if self.readline._vi_key_find_char is None: + self.error () + return + if self.readline._vi_key_find_direction: + self.motion = self.motion_find_char_forward + else: + self.motion = self.motion_find_char_backward + self.set_motion_argument (self.readline._vi_key_find_char) + + def key_comma (self, char): + if self.readline._vi_key_find_char is None: + self.error () + return + if self.readline._vi_key_find_direction: + self.motion = self.motion_find_char_backward + else: + self.motion = self.motion_find_char_forward + self.set_motion_argument (self.readline._vi_key_find_char) + + def key_percent (self, char): + '''find matching <([{}])>''' + self.motion = self.motion_matching + self.delete_right = 1 + self.state = _VI_MOTION + self.apply () + + def key_dot (self, char): + vi_cmd_edit = self.readline._vi_command_edit + if not vi_cmd_edit: + return + if vi_cmd_edit.is_star: + self.key_star (char) + return + if self.has_multiplier (): + count = self.get_multiplier () + else: + count = 0 + # Create the ViCommand object after getting multipler from self + # Side effect of the ViCommand creation is resetting of global multipliers + vi_cmd = ViCommand (self.readline) + if count >= 1: + vi_cmd.set_override_multiplier (count) + vi_cmd_edit.set_override_multiplier (count) + elif vi_cmd_edit.override_multiplier: + vi_cmd.set_override_multiplier (vi_cmd_edit.override_multiplier) + for char in vi_cmd_edit.lst_char: + vi_cmd.add_char (char) + if vi_cmd_edit.is_overwrite and self.readline.l_buffer.point > 0: + self.readline.l_buffer.point -= 1 + self.readline.vi_set_insert_mode (False) + self.end () + + def key_slash (self, char): + self.readline.vi_save_line () + self.readline.l_buffer.line_buffer=['/'] + self.readline.l_buffer.point= 1 + self.state = _VI_SEARCH + + def key_star (self, char): + self.is_star = True + self.is_edit = True + self.readline.vi_save_line () + completions = self.readline._get_completions() + if completions: + text = ' '.join (completions) + ' ' + self.readline.l_buffer.line_buffer [self.readline.begidx : self.readline.endidx + 1] = list (text) + prefix_len = self.readline.endidx - self.readline.begidx + self.readline.l_buffer.point += len(text) - prefix_len + self.readline.vi_set_insert_mode (True) + else: + self.error () + self.state = _VI_TEXT + + def key_bar (self, char): + self.motion = self.motion_column + self.state = _VI_MOTION + self.apply () + + def key_tilde (self, char): + self.is_edit = True + self.readline.vi_save_line () + for i in range (self.get_multiplier()): + try: + c = self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] + if c.isupper (): + self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] = c.lower() + elif c.islower (): + self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] = c.upper() + self.readline.l_buffer.point += 1 + except IndexError: + break + self.end () + + def key_h (self, char): + self.motion = self.motion_left + self.state = _VI_MOTION + self.apply () + + def key_backspace (self, char): + if self.state in [_VI_TEXT, _VI_SEARCH]: + if self.text and len(self.text): + self.text = self.text [:-1] + try: + # Remove backspaces for potential dot command + self.lst_char.pop () + self.lst_char.pop () + except IndexError: + pass + else: + self.key_h (char) + self.readline._vi_do_backspace (self) + if self.state == _VI_SEARCH and not (self.readline.l_buffer.line_buffer): + self.state = _VI_BEGIN + + def key_l (self, char): + self.motion = self.motion_right + self.state = _VI_MOTION + self.apply () + + def key_i (self, char): + self.is_edit = True + self.state = _VI_TEXT + self.readline.vi_set_insert_mode (True) + + def key_I (self, char): + self.is_edit = True + self.state = _VI_TEXT + self.readline.vi_set_insert_mode (True) + self.readline.l_buffer.point = 0 + + def key_a (self, char): + self.is_edit = True + self.state = _VI_TEXT + self.readline.vi_set_insert_mode (True) + if len (self.readline.l_buffer.line_buffer): + self.readline.l_buffer.point += 1 + + def key_A (self, char): + self.is_edit = True + self.state = _VI_TEXT + self.readline.vi_set_insert_mode (True) + self.readline.l_buffer.point = len (self.readline.l_buffer.line_buffer) + + def key_d (self, char): + self.is_edit = True + self.state = _VI_ACTION + self.action = self.delete + + def key_D (self, char): + self.is_edit = True + self.state = _VI_ACTION + self.action = self.delete_end_of_line + self.apply () + + def key_x (self, char): + self.is_edit = True + self.state = _VI_ACTION + self.action = self.delete_char + self.apply () + + def key_X (self, char): + self.is_edit = True + self.state = _VI_ACTION + self.action = self.delete_prev_char + self.apply () + + def key_s (self, char): + self.is_edit = True + i1 = self.readline.l_buffer.point + i2 = self.readline.l_buffer.point + self.get_multiplier () + self.skip_multipler = True + self.readline.vi_set_insert_mode (True) + del self.readline.l_buffer.line_buffer [i1 : i2] + self.state = _VI_TEXT + + def key_S (self, char): + self.is_edit = True + self.readline.vi_set_insert_mode (True) + self.readline.l_buffer.line_buffer = [] + self.readline.l_buffer.point = 0 + self.state = _VI_TEXT + + def key_c (self, char): + self.is_edit = True + self.state = _VI_ACTION + self.action = self.change + + def key_C (self, char): + self.is_edit = True + self.readline.vi_set_insert_mode (True) + del self.readline.l_buffer.line_buffer [self.readline.l_buffer.point : ] + self.state = _VI_TEXT + + def key_r (self, char): + self.state = _VI_REPLACE_ONE + + def key_R (self, char): + self.is_edit = True + self.is_overwrite = True + self.readline.l_buffer.overwrite=True + self.readline.vi_set_insert_mode (True) + self.state = _VI_TEXT + + def key_y (self, char): + self._state = _VI_ACTION + self.action = self.yank + + def key_Y (self, char): + self.readline._vi_yank_buffer = self.readline.l_buffer.get_line_text() + self.end () + + def key_p (self, char): + if not self.readline._vi_yank_buffer: + return + self.is_edit = True + self.readline.vi_save_line () + self.readline.l_buffer.point += 1 + self.readline.l_buffer.insert_text (self.readline._vi_yank_buffer * self.get_multiplier ()) + self.readline.l_buffer.point -= 1 + self.state = _VI_END + + def key_P (self, char): + if not self.readline._vi_yank_buffer: + return + self.is_edit = True + self.readline.vi_save_line () + self.readline.l_buffer.insert_text (self.readline._vi_yank_buffer * self.get_multiplier ()) + self.readline.l_buffer.point -= 1 + self.state = _VI_END + + def key_u (self, char): + self.readline.vi_undo () + self.state = _VI_END + + def key_U (self, char): + self.readline.vi_undo_all () + self.state = _VI_END + + def key_v (self, char): + editor = ViExternalEditor (self.readline.l_buffer.line_buffer) + self.readline.l_buffer.line_buffer = list (editor.result) + self.readline.l_buffer.point = 0 + self.is_edit = True + self.state = _VI_END + + def error (self): + self.readline._bell () + self.is_error = True + + def state_is_end (self): + return self.state == _VI_END + is_end = property (state_is_end) + + def state_is_search (self): + return self.state == _VI_SEARCH + is_search = property (state_is_search) + + def state_is_replace_one (self): + return self.state == _VI_REPLACE_ONE + is_replace_one = property (state_is_replace_one) + + def do_search (self): + self.readline.vi_search_first () + self.state = _VI_END + + def key_n (self, char): + self.readline.vi_search_again_backward () + self.state = _VI_END + + def key_N (self, char): + self.readline.vi_search_again_forward () + self.state = _VI_END + + def motion_beginning_of_line (self, line, index=0, count=1, **kw): + return 0 + + def motion_end_in_line (self, line, index=0, count=1, **kw): + return max (0, len (self.readline.l_buffer.line_buffer)-1) + + def motion_word_short (self, line, index=0, count=1, **kw): + return vi_pos_word_short (line, index, count) + + def motion_word_long (self, line, index=0, count=1, **kw): + return vi_pos_word_long (line, index, count) + + def motion_end_short (self, line, index=0, count=1, **kw): + return vi_pos_end_short (line, index, count) + + def motion_end_long (self, line, index=0, count=1, **kw): + return vi_pos_end_long (line, index, count) + + def motion_back_short (self, line, index=0, count=1, **kw): + return vi_pos_back_short (line, index, count) + + def motion_back_long (self, line, index=0, count=1, **kw): + return vi_pos_back_long (line, index, count) + + def motion_find_char_forward (self, line, index=0, count=1, char=None): + self.readline._vi_key_find_char = char + return vi_pos_find_char_forward (line, char, index, count) + + def motion_find_char_backward (self, line, index=0, count=1, char=None): + self.readline._vi_key_find_char = char + return vi_pos_find_char_backward (line, char, index, count) + + def motion_to_char_forward (self, line, index=0, count=1, char=None): + return vi_pos_to_char_forward (line, char, index, count) + + def motion_to_char_backward (self, line, index=0, count=1, char=None): + return vi_pos_to_char_backward (line, char, index, count) + + def motion_left (self, line, index=0, count=1, char=None): + return max (0, index - count) + + def motion_right (self, line, index=0, count=1, char=None): + return min (len(line), index + count) + + def motion_matching (self, line, index=0, count=1, char=None): + return vi_pos_matching (line, index) + + def motion_column (self, line, index=0, count=1, char=None): + return max (0, count-1) + + def has_multiplier (self): + return self.override_multiplier or self.readline._vi_multiplier1 or self.readline._vi_multiplier2 + + def get_multiplier (self): + if self.override_multiplier: + return int (self.override_multiplier) + if self.readline._vi_multiplier1 == '': m1 = 1 + else: m1 = int(self.readline._vi_multiplier1) + if self.readline._vi_multiplier2 == '': m2 = 1 + else: m2 = int(self.readline._vi_multiplier2) + return m1 * m2 + + def set_override_multiplier (self, count): + self.override_multiplier = count + + def apply (self): + if self.motion: + self.pos_motion = self.motion (self.readline.l_buffer.line_buffer, self.readline.l_buffer.point, + self.get_multiplier(), char=self.motion_argument) + if self.pos_motion < 0: + self.error () + return + self.action () + if self.state != _VI_TEXT: + self.end () + + def movement (self): + if self.pos_motion <= len(self.readline.l_buffer.line_buffer): + self.readline.l_buffer.point = self.pos_motion + else: + self.readline.l_buffer.point = len(self.readline.l_buffer.line_buffer) - 1 + + def yank (self): + if self.pos_motion > self.readline.l_buffer.point: + s = self.readline.l_buffer.line_buffer [self.readline.l_buffer.point : self.pos_motion + self.delete_right] + else: + index = max (0, self.pos_motion - self.delete_left) + s = self.readline.l_buffer.line_buffer [index : self.readline.l_buffer.point + self.delete_right] + self.readline._vi_yank_buffer = s + + def delete (self): + self.readline.vi_save_line () + self.yank () +# point=lineobj.Point(self.readline.l_buffer) +# pm=self.pos_motion +# del self.readline.l_buffer[point:pm] +# return + if self.pos_motion > self.readline.l_buffer.point: + del self.readline.l_buffer.line_buffer [self.readline.l_buffer.point : self.pos_motion + self.delete_right] + if self.readline.l_buffer.point > len (self.readline.l_buffer.line_buffer): + self.readline.l_buffer.point = len (self.readline.l_buffer.line_buffer) + else: + index = max (0, self.pos_motion - self.delete_left) + del self.readline.l_buffer.line_buffer [index : self.readline.l_buffer.point + self.delete_right] + self.readline.l_buffer.point = index + + def delete_end_of_line (self): + self.readline.vi_save_line () + # del self.readline.l_buffer [self.readline.l_buffer.point : ] + line_text = self.readline.l_buffer.get_line_text () + line_text = line_text [ : self.readline.l_buffer.point] + self.readline.l_buffer.set_line (line_text) + if self.readline.l_buffer.point > 0: + self.readline.l_buffer.point -= 1 + + def delete_char (self): +# point=lineobj.Point(self.readline.l_buffer) +# del self.readline.l_buffer[point:point+self.get_multiplier ()] +# return + self.pos_motion = self.readline.l_buffer.point + self.get_multiplier () + self.delete () + end = max (0, len (self.readline.l_buffer) - 1) + if self.readline.l_buffer.point > end: + self.readline.l_buffer.point = end + + def delete_prev_char (self): + self.pos_motion = self.readline.l_buffer.point - self.get_multiplier () + self.delete () + + def change (self): + self.readline.vi_set_insert_mode (True) + self.delete () + self.skip_multipler = True + self.state = _VI_TEXT + + def escape (self, char): + if self.state == _VI_TEXT: + if not self.skip_multipler: + times = self.get_multiplier () + if times > 1 and self.text: + extra = self.text * (times - 1) + self.set_buffer (extra) + self.state = _VI_END + + def set_motion_argument (self, char): + self.motion_argument = char + self.apply () + + def end (self): + self.state = _VI_END + if self.readline.l_buffer.point >= len(self.readline.l_buffer.line_buffer): + self.readline.l_buffer.point = max (0, len(self.readline.l_buffer.line_buffer) - 1) + +class ViExternalEditor: + def __init__ (self, line): + if type(line) is type([]): + line = ''.join (line) + file_tmp = self.get_tempfile () + fp_tmp = self.file_open (file_tmp, 'w') + fp_tmp.write (line) + fp_tmp.close () + self.run_editor (file_tmp) + fp_tmp = self.file_open (file_tmp, 'r') + self.result = fp_tmp.read () + fp_tmp.close () + self.file_remove (file_tmp) + + def get_tempfile (self): + import tempfile + return tempfile.mktemp (prefix='readline-', suffix='.py') + + def file_open (self, filename, mode): + return file (filename, mode) + + def file_remove (self, filename): + os.remove (filename) + + def get_editor (self): + try: + return os.environ ['EDITOR'] + except KeyError: + return 'notepad' # ouch + + def run_editor (self, filename): + cmd = '%s %s' % (self.get_editor(), filename, ) + self.run_command (cmd) + + def run_command (self, command): + os.system (command) + +class ViEvent: + def __init__ (self, char): + self.char = char + +# vi standalone functions +def vi_is_word (char): + log ('xx vi_is_word: type(%s), %s' % (type(char), char, )) + return char.isalpha() or char.isdigit() or char == '_' + +def vi_is_space (char): + return char.isspace () + +def vi_is_word_or_space (char): + return vi_is_word (char) or vi_is_space (char) + +def vi_pos_word_short (line, index=0, count=1): + try: + for i in range(count): + in_word = vi_is_word (line[index]) + if not in_word: + while not vi_is_word (line[index]): + index += 1 + else: + while vi_is_word (line[index]): + index += 1 + while vi_is_space (line[index]): + index += 1 + return index + except IndexError: + return len(line) + +def vi_pos_word_long (line, index=0, count=1): + try: + for i in range(count): + in_space = vi_is_space (line[index]) + if not in_space: + while not vi_is_space (line[index]): + index += 1 + while vi_is_space (line[index]): + index += 1 + return index + except IndexError: + return len(line) + +def vi_pos_end_short (line, index=0, count=1): + try: + for i in range(count): + index += 1 + while vi_is_space (line[index]): + index += 1 + in_word = vi_is_word (line[index]) + if not in_word: + while not vi_is_word_or_space (line[index]): + index += 1 + else: + while vi_is_word (line[index]): + index += 1 + return index - 1 + except IndexError: + return max (0, len(line)-1) + +def vi_pos_end_long (line, index=0, count=1): + try: + for i in range(count): + index += 1 + while vi_is_space (line[index]): + index += 1 + while not vi_is_space (line[index]): + index += 1 + return index - 1 + except IndexError: + return max (0, len(line)-1) + +class vi_list (list): + '''This is a list that cannot have a negative index''' + def __getitem__ (self, key): + try: + if int(key) < 0: + raise IndexError + except ValueError: + pass + return list.__getitem__ (self, key) + +def vi_pos_back_short (line, index=0, count=1): + line = vi_list (line) + try: + for i in range(count): + index -= 1 + while vi_is_space (line[index]): + index -= 1 + in_word = vi_is_word (line[index]) + if in_word: + while vi_is_word (line[index]): + index -= 1 + else: + while not vi_is_word_or_space (line[index]): + index -= 1 + return index + 1 + except IndexError: + return 0 + +def vi_pos_back_long (line, index=0, count=1): + line = vi_list (line) + try: + for i in range(count): + index -= 1 + while vi_is_space (line[index]): + index -= 1 + while not vi_is_space (line[index]): + index -= 1 + return index + 1 + except IndexError: + return 0 + +def vi_pos_find_char_forward (line, char, index=0, count=1): + try: + for i in range(count): + index += 1 + while line [index] != char: + index += 1 + return index + except IndexError: + return -1 + +def vi_pos_find_char_backward (line, char, index=0, count=1): + try: + for i in range(count): + index -= 1 + while 1: + if index < 0: + return -1 + if line[index] == char: + break + index -= 1 + return index + except IndexError: + return -1 + +def vi_pos_to_char_forward (line, char, index=0, count=1): + index = vi_pos_find_char_forward (line, char, index, count) + if index > 0: + return index - 1 + return index + +def vi_pos_to_char_backward (line, char, index=0, count=1): + index = vi_pos_find_char_backward (line, char, index, count) + if index >= 0: + return index + 1 + return index + +_vi_dct_matching = { + '<': ('>', +1), '>': ('<', -1), + '(': (')', +1), ')': ('(', -1), + '[': (']', +1), ']': ('[', -1), + '{': ('}', +1), '}': ('{', -1), +} + +def vi_pos_matching (line, index=0): + '''find matching <([{}])>''' + anchor = None + target = None + delta = 1 + count = 0 + try: + while 1: + if anchor is None: + # first find anchor + try: + target, delta = _vi_dct_matching [line [index]] + anchor = line [index] + count = 1 + except KeyError: + index += 1 + continue + else: + # Here the anchor has been found + # Need to get corresponding target + if index < 0: + return -1 + if line [index] == anchor: + count += 1 + elif line [index] == target: + count -= 1 + if count == 0: + return index + index += delta + except IndexError: + return -1 + diff --git a/pyreadline/release.py b/pyreadline/release.py index 43859f6..dd5a3a5 100644 --- a/pyreadline/release.py +++ b/pyreadline/release.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -u"""Release data for the pyreadline project. +"""Release data for the pyreadline project. $Id$""" @@ -13,23 +13,23 @@ $Id$""" # Name of the package for release purposes. This is the name which labels # the tarballs and RPMs made by distutils, so it's best to lowercase it. -name = u'pyreadline' +name = 'pyreadline' # For versions with substrings (like 0.6.16.svn), use an extra . to separate # the new substring. We have to avoid using either dashes or underscores, # because bdist_rpm does not accept dashes (an RPM) convention, and # bdist_deb does not accept underscores (a Debian convention). -branch = u'' +branch = '' -version = u'1.7' +version = '1.7' -revision = u'$Revision$' +revision = '$Revision$' -description = u"A python implmementation of GNU readline." +description = "A python implmementation of GNU readline." long_description = \ -u""" +""" The pyreadline package is a python implementation of GNU readline functionality it is based on the ctypes based UNC readline package by Gary Bishop. It is not complete. It has been tested for use with windows 2000 and windows xp. @@ -51,31 +51,31 @@ Features: .. _repository: """ -license = u'BSD' +license = 'BSD' -authors = {u'Jorgen' : (u'Jorgen Stenarson',u'jorgen.stenarson@bostream.nu'), - u'Gary': (u'Gary Bishop', ''), - u'Jack': (u'Jack Trainor', ''), +authors = {'Jorgen' : ('Jorgen Stenarson','jorgen.stenarson@bostream.nu'), + 'Gary': ('Gary Bishop', ''), + 'Jack': ('Jack Trainor', ''), } -url = u'http://ipython.scipy.org/moin/PyReadline/Intro' +url = 'http://ipython.scipy.org/moin/PyReadline/Intro' -download_url = u'https://launchpad.net/pyreadline/+download' +download_url = 'https://launchpad.net/pyreadline/+download' -platforms = [u'Windows XP/2000/NT', - u'Windows 95/98/ME'] +platforms = ['Windows XP/2000/NT', + 'Windows 95/98/ME'] -keywords = [u'readline', - u'pyreadline'] +keywords = ['readline', + 'pyreadline'] -classifiers = [u'Development Status :: 5 - Production/Stable', - u'Environment :: Console', - u'Operating System :: Microsoft :: Windows', - u'License :: OSI Approved :: BSD License', - u'Programming Language :: Python :: 2.4', - u'Programming Language :: Python :: 2.5', - u'Programming Language :: Python :: 2.6', - u'Programming Language :: Python :: 2.7', +classifiers = ['Development Status :: 5 - Production/Stable', + 'Environment :: Console', + 'Operating System :: Microsoft :: Windows', + 'License :: OSI Approved :: BSD License', + 'Programming Language :: Python :: 2.4', + 'Programming Language :: Python :: 2.5', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', ] diff --git a/pyreadline/rlmain.py b/pyreadline/rlmain.py index 66e469a..c7d3bfe 100644 --- a/pyreadline/rlmain.py +++ b/pyreadline/rlmain.py @@ -1,590 +1,591 @@ -# -*- coding: utf-8 -*- -#***************************************************************************** -# Copyright (C) 2003-2006 Gary Bishop. -# Copyright (C) 2006 Jorgen Stenarson. -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** -u''' an attempt to implement readline for Python in Python using ctypes''' -import sys,os,re,time -from glob import glob - -import release - -import pyreadline.lineeditor.lineobj as lineobj -import pyreadline.lineeditor.history as history -import pyreadline.clipboard as clipboard -import pyreadline.console as console -import pyreadline.logger as logger - -from pyreadline.keysyms.common import make_KeyPress_from_keydescr -from pyreadline.unicode_helper import ensure_unicode -from logger import log -from modes import editingmodes -from error import ReadlineError, GetSetError - -in_ironpython = u"IronPython" in sys.version -if in_ironpython:#ironpython does not provide a prompt string to readline - import System - default_prompt = u">>> " -else: - default_prompt = u"" - import pdb - - -class MockConsoleError(Exception): - pass - -class MockConsole(object): - u"""object used during refactoring. Should raise errors when someone tries to use it. - """ - def __setattr__(self, x): - raise MockConsoleError(u"Should not try to get attributes from MockConsole") - - def cursor(self, size=50): - pass - -class BaseReadline(object): - def __init__(self): - self.allow_ctrl_c = False - self.ctrl_c_tap_time_interval = 0.3 - - self.debug = False - self.bell_style = u'none' - self.mark = -1 - self.console=MockConsole() - self.disable_readline = False - # this code needs to follow l_buffer and history creation - self.editingmodes = [mode(self) for mode in editingmodes] - for mode in self.editingmodes: - mode.init_editing_mode(None) - self.mode = self.editingmodes[0] - - self.read_inputrc() - log(u"\n".join(self.mode.rl_settings_to_string())) - - self.callback = None - - def parse_and_bind(self, string): - u'''Parse and execute single line of a readline init file.''' - try: - log(u'parse_and_bind("%s")' % string) - if string.startswith(u'#'): - return - if string.startswith(u'set'): - m = re.compile(ur'set\s+([-a-zA-Z0-9]+)\s+(.+)\s*$').match(string) - if m: - var_name = m.group(1) - val = m.group(2) - try: - setattr(self.mode, var_name.replace(u'-',u'_'), val) - except AttributeError: - log(u'unknown var="%s" val="%s"' % (var_name, val)) - else: - log(u'bad set "%s"' % string) - return - m = re.compile(ur'\s*(.+)\s*:\s*([-a-zA-Z]+)\s*$').match(string) - if m: - key = m.group(1) - func_name = m.group(2) - py_name = func_name.replace(u'-', u'_') - try: - func = getattr(self.mode, py_name) - except AttributeError: - log(u'unknown func key="%s" func="%s"' % (key, func_name)) - if self.debug: - print u'pyreadline parse_and_bind error, unknown function to bind: "%s"' % func_name - return - self.mode._bind_key(key, func) - except: - log(u'error') - raise - - def _set_prompt(self, prompt): - self.mode.prompt = prompt - - def _get_prompt(self): - return self.mode.prompt - - prompt = property(_get_prompt, _set_prompt) - - - def get_line_buffer(self): - u'''Return the current contents of the line buffer.''' - return self.mode.l_buffer.get_line_text() - - def insert_text(self, string): - u'''Insert text into the command line.''' - self.mode.insert_text(string) - - def read_init_file(self, filename=None): - u'''Parse a readline initialization file. The default filename is the last filename used.''' - log(u'read_init_file("%s")' % filename) - - #History file book keeping methods (non-bindable) - - def add_history(self, line): - u'''Append a line to the history buffer, as if it was the last line typed.''' - self.mode._history.add_history(line) - - def get_current_history_length(self ): - u'''Return the number of lines currently in the history. - (This is different from get_history_length(), which returns - the maximum number of lines that will be written to a history file.)''' - return self.mode._history.get_current_history_length() - - def get_history_length(self ): - u'''Return the desired length of the history file. - - Negative values imply unlimited history file size.''' - return self.mode._history.get_history_length() - - def set_history_length(self, length): - u'''Set the number of lines to save in the history file. - - write_history_file() uses this value to truncate the history file - when saving. Negative values imply unlimited history file size. - ''' - self.mode._history.set_history_length(length) - - def get_history_item(self, index): - u'''Return the current contents of history item at index.''' - return self.mode._history.get_history_item(index) - - def clear_history(self): - u'''Clear readline history''' - self.mode._history.clear_history() - - def read_history_file(self, filename=None): - u'''Load a readline history file. The default filename is ~/.history.''' - if filename is None: - filename = self.mode._history.history_filename - log(u"read_history_file from %s"%ensure_unicode(filename)) - self.mode._history.read_history_file(filename) - - def write_history_file(self, filename=None): - u'''Save a readline history file. The default filename is ~/.history.''' - self.mode._history.write_history_file(filename) - - #Completer functions - - def set_completer(self, function=None): - u'''Set or remove the completer function. - - If function is specified, it will be used as the new completer - function; if omitted or None, any completer function already - installed is removed. The completer function is called as - function(text, state), for state in 0, 1, 2, ..., until it returns a - non-string value. It should return the next possible completion - starting with text. - ''' - log(u'set_completer') - self.mode.completer = function - - def get_completer(self): - u'''Get the completer function. - ''' - log(u'get_completer') - return self.mode.completer - - def get_begidx(self): - u'''Get the beginning index of the readline tab-completion scope.''' - return self.mode.begidx - - def get_endidx(self): - u'''Get the ending index of the readline tab-completion scope.''' - return self.mode.endidx - - def set_completer_delims(self, string): - u'''Set the readline word delimiters for tab-completion.''' - self.mode.completer_delims = string - - def get_completer_delims(self): - u'''Get the readline word delimiters for tab-completion.''' - return self.mode.completer_delims.encode("ascii") - - def set_startup_hook(self, function=None): - u'''Set or remove the startup_hook function. - - If function is specified, it will be used as the new startup_hook - function; if omitted or None, any hook function already installed is - removed. The startup_hook function is called with no arguments just - before readline prints the first prompt. - - ''' - self.mode.startup_hook = function - - def set_pre_input_hook(self, function=None): - u'''Set or remove the pre_input_hook function. - - If function is specified, it will be used as the new pre_input_hook - function; if omitted or None, any hook function already installed is - removed. The pre_input_hook function is called with no arguments - after the first prompt has been printed and just before readline - starts reading input characters. - - ''' - self.mode.pre_input_hook = function - -#Functions that are not relevant for all Readlines but should at least have a NOP - - def _bell(self): - pass - -# -# Standard call, not available for all implementations -# - - def readline(self, prompt=u''): - raise NotImplementedError - -# -# Callback interface -# - def process_keyevent(self, keyinfo): - return self.mode.process_keyevent(keyinfo) - - def readline_setup(self, prompt=u""): - return self.mode.readline_setup(prompt) - - def keyboard_poll(self): - return self.mode._readline_from_keyboard_poll() - - def callback_handler_install(self, prompt, callback): - u'''bool readline_callback_handler_install ( string prompt, callback callback) - Initializes the readline callback interface and terminal, prints the prompt and returns immediately - ''' - self.callback = callback - self.readline_setup(prompt) - - def callback_handler_remove(self): - u'''Removes a previously installed callback handler and restores terminal settings''' - self.callback = None - - def callback_read_char(self): - u'''Reads a character and informs the readline callback interface when a line is received''' - if self.keyboard_poll(): - line = self.get_line_buffer() + u'\n' - # however there is another newline added by - # self.mode.readline_setup(prompt) which is called by callback_handler_install - # this differs from GNU readline - self.add_history(self.mode.l_buffer) - # TADA: - self.callback(line) - - def read_inputrc(self, #in 2.4 we cannot call expanduser with unicode string - inputrcpath=os.path.expanduser("~/pyreadlineconfig.ini")): - modes = dict([(x.mode,x) for x in self.editingmodes]) - mode = self.editingmodes[0].mode - - def setmode(name): - self.mode = modes[name] - - def bind_key(key, name): - import new - if callable(name): - modes[mode]._bind_key(key, new.instancemethod(name, modes[mode], modes[mode].__class__)) - elif hasattr(modes[mode], name): - modes[mode]._bind_key(key, getattr(modes[mode], name)) - else: - print u"Trying to bind unknown command '%s' to key '%s'"%(name, key) - - def un_bind_key(key): - keyinfo = make_KeyPress_from_keydescr(key).tuple() - if keyinfo in modes[mode].key_dispatch: - del modes[mode].key_dispatch[keyinfo] - - def bind_exit_key(key): - modes[mode]._bind_exit_key(key) - - def un_bind_exit_key(key): - keyinfo = make_KeyPress_from_keydescr(key).tuple() - if keyinfo in modes[mode].exit_dispatch: - del modes[mode].exit_dispatch[keyinfo] - - def setkill_ring_to_clipboard(killring): - import pyreadline.lineeditor.lineobj - pyreadline.lineeditor.lineobj.kill_ring_to_clipboard = killring - - def sethistoryfilename(filename): - self.mode._history.history_filename=os.path.expanduser(filename) - - def setbellstyle(mode): - self.bell_style = mode - - def disable_readline(mode): - self.disable_readline = mode - - def sethistorylength(length): - self.mode._history.history_length = int(length) - - def allow_ctrl_c(mode): - log(u"allow_ctrl_c:%s:%s"%(self.allow_ctrl_c, mode)) - self.allow_ctrl_c = mode - - def setbellstyle(mode): - self.bell_style = mode - - def show_all_if_ambiguous(mode): - self.mode.show_all_if_ambiguous = mode - - def ctrl_c_tap_time_interval(mode): - self.ctrl_c_tap_time_interval = mode - - def mark_directories(mode): - self.mode.mark_directories = mode - - def completer_delims(delims): - self.mode.completer_delims = delims - - def complete_filesystem(delims): - self.mode.complete_filesystem = delims.lower() - - def enable_ipython_paste_for_paths(boolean): - self.mode.enable_ipython_paste_for_paths = boolean - - def debug_output(on, filename=u"pyreadline_debug_log.txt"): #Not implemented yet - if on in [u"on", u"on_nologfile"]: - self.debug=True - - if on == "on": - logger.start_file_log(filename) - logger.start_socket_log() - logger.log(u"STARTING LOG") - elif on == u"on_nologfile": - logger.start_socket_log() - logger.log(u"STARTING LOG") - else: - logger.log(u"STOPING LOG") - logger.stop_file_log() - logger.stop_socket_log() - - _color_trtable={u"black":0, u"darkred":4, u"darkgreen":2, - u"darkyellow":6, u"darkblue":1, u"darkmagenta":5, - u"darkcyan":3, u"gray":7, u"red":4+8, - u"green":2+8, u"yellow":6+8, u"blue":1+8, - u"magenta":5+8, u"cyan":3+8, u"white":7+8} - - def set_prompt_color(color): - self.prompt_color = self._color_trtable.get(color.lower(),7) - - def set_input_color(color): - self.command_color=self._color_trtable.get(color.lower(),7) - - loc = {u"branch":release.branch, - u"version":release.version, - u"mode":mode, - u"modes":modes, - u"set_mode":setmode, - u"bind_key":bind_key, - u"disable_readline":disable_readline, - u"bind_exit_key":bind_exit_key, - u"un_bind_key":un_bind_key, - u"un_bind_exit_key":un_bind_exit_key, - u"bell_style":setbellstyle, - u"mark_directories":mark_directories, - u"show_all_if_ambiguous":show_all_if_ambiguous, - u"completer_delims":completer_delims, - u"complete_filesystem":complete_filesystem, - u"debug_output":debug_output, - u"history_filename":sethistoryfilename, - u"history_length":sethistorylength, - u"set_prompt_color":set_prompt_color, - u"set_input_color":set_input_color, - u"allow_ctrl_c":allow_ctrl_c, - u"ctrl_c_tap_time_interval":ctrl_c_tap_time_interval, - u"kill_ring_to_clipboard":setkill_ring_to_clipboard, - u"enable_ipython_paste_for_paths":enable_ipython_paste_for_paths, - } - if os.path.isfile(inputrcpath): - try: - execfile(inputrcpath, loc, loc) - except Exception,x: - raise - import traceback - print >>sys.stderr, u"Error reading .pyinputrc" - filepath,lineno=traceback.extract_tb(sys.exc_traceback)[1][:2] - print >>sys.stderr, u"Line: %s in file %s"%(lineno, filepath) - print >>sys.stderr, x - raise ReadlineError(u"Error reading .pyinputrc") - - - -class Readline(BaseReadline): - """Baseclass for readline based on a console - """ - def __init__(self): - BaseReadline.__init__(self) - self.console = console.Console() - self.selection_color = self.console.saveattr<<4 - self.command_color = None - self.prompt_color = None - self.size = self.console.size() - - # variables you can control with parse_and_bind - -# To export as readline interface - - -## Internal functions - - def _bell(self): - u'''ring the bell if requested.''' - if self.bell_style == u'none': - pass - elif self.bell_style == u'visible': - raise NotImplementedError(u"Bellstyle visible is not implemented yet.") - elif self.bell_style == u'audible': - self.console.bell() - else: - raise ReadlineError(u"Bellstyle %s unknown."%self.bell_style) - - def _clear_after(self): - c = self.console - x, y = c.pos() - w, h = c.size() - c.rectangle((x, y, w+1, y+1)) - c.rectangle((0, y+1, w, min(y+3,h))) - - def _set_cursor(self): - c = self.console - xc, yc = self.prompt_end_pos - w, h = c.size() - xc += self.mode.l_buffer.visible_line_width() - while(xc >= w): - xc -= w - yc += 1 - c.pos(xc, yc) - - def _print_prompt(self): - c = self.console - x, y = c.pos() - - n = c.write_scrolling(self.prompt, self.prompt_color) - self.prompt_begin_pos = (x, y - n) - self.prompt_end_pos = c.pos() - self.size = c.size() - - def _update_prompt_pos(self, n): - if n != 0: - bx, by = self.prompt_begin_pos - ex, ey = self.prompt_end_pos - self.prompt_begin_pos = (bx, by - n) - self.prompt_end_pos = (ex, ey - n) - - def _update_line(self): - c = self.console - l_buffer = self.mode.l_buffer - c.cursor(0) #Hide cursor avoiding flicking - c.pos(*self.prompt_begin_pos) - self._print_prompt() - ltext = l_buffer.quoted_text() - if l_buffer.enable_selection and (l_buffer.selection_mark >= 0): - start = len(l_buffer[:l_buffer.selection_mark].quoted_text()) - stop = len(l_buffer[:l_buffer.point].quoted_text()) - if start > stop: - stop,start = start,stop - n = c.write_scrolling(ltext[:start], self.command_color) - n = c.write_scrolling(ltext[start:stop], self.selection_color) - n = c.write_scrolling(ltext[stop:], self.command_color) - else: - n = c.write_scrolling(ltext, self.command_color) - - x, y = c.pos() #Preserve one line for Asian IME(Input Method Editor) statusbar - w, h = c.size() - if (y >= h - 1) or (n > 0): - c.scroll_window(-1) - c.scroll((0, 0, w, h), 0, -1) - n += 1 - - self._update_prompt_pos(n) - if hasattr(c, u"clear_to_end_of_window"): #Work around function for ironpython due - c.clear_to_end_of_window() #to System.Console's lack of FillFunction - else: - self._clear_after() - - #Show cursor, set size vi mode changes size in insert/overwrite mode - c.cursor(1, size=self.mode.cursor_size) - self._set_cursor() - - - def callback_read_char(self): - #Override base to get automatic newline - u'''Reads a character and informs the readline callback interface when a line is received''' - if self.keyboard_poll(): - line = self.get_line_buffer() + u'\n' - self.console.write(u"\r\n") - # however there is another newline added by - # self.mode.readline_setup(prompt) which is called by callback_handler_install - # this differs from GNU readline - self.add_history(self.mode.l_buffer) - # TADA: - self.callback(line) - - - def event_available(self): - return self.console.peek() or (len(self.paste_line_buffer) > 0) - - - def _readline_from_keyboard(self): - while 1: - if self._readline_from_keyboard_poll(): - break - - def _readline_from_keyboard_poll(self): - pastebuffer = self.mode.paste_line_buffer - if len(pastebuffer) > 0: - #paste first line in multiline paste buffer - self.l_buffer = lineobj.ReadLineTextBuffer(pastebuffer[0]) - self._update_line() - self.mode.paste_line_buffer = pastebuffer[1:] - return True - - c = self.console - def nop(e): - pass - try: - event = c.getkeypress() - except KeyboardInterrupt: - event = self.handle_ctrl_c() - try: - result = self.mode.process_keyevent(event.keyinfo) - except EOFError: - logger.stop_logging() - raise - self._update_line() - return result - - def readline_setup(self, prompt=u''): - BaseReadline.readline_setup(self, prompt) - self._print_prompt() - self._update_line() - - def readline(self, prompt=u''): - self.readline_setup(prompt) - self.ctrl_c_timeout = time.time() - self._readline_from_keyboard() - self.console.write(u'\r\n') - log(u'returning(%s)' % self.get_line_buffer()) - return self.get_line_buffer() + u'\n' - - def handle_ctrl_c(self): - from pyreadline.keysyms.common import KeyPress - from pyreadline.console.event import Event - log(u"KBDIRQ") - event = Event(0,0) - event.char = u"c" - event.keyinfo = KeyPress(u"c", shift=False, control=True, - meta=False, keyname=None) - if self.allow_ctrl_c: - now = time.time() - if (now - self.ctrl_c_timeout) < self.ctrl_c_tap_time_interval: - log(u"Raise KeyboardInterrupt") - raise KeyboardInterrupt - else: - self.ctrl_c_timeout = now - else: - raise KeyboardInterrupt - return event - +# -*- coding: utf-8 -*- +#***************************************************************************** +# Copyright (C) 2003-2006 Gary Bishop. +# Copyright (C) 2006 Jorgen Stenarson. +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** +''' an attempt to implement readline for Python in Python using ctypes''' +import sys,os,re,time +from glob import glob + +from . import release + +import pyreadline.lineeditor.lineobj as lineobj +import pyreadline.lineeditor.history as history +import pyreadline.clipboard as clipboard +import pyreadline.console as console +import pyreadline.logger as logger + +from pyreadline.keysyms.common import make_KeyPress_from_keydescr +from pyreadline.unicode_helper import ensure_unicode +from .logger import log +from .modes import editingmodes +from .error import ReadlineError, GetSetError +import collections + +in_ironpython = "IronPython" in sys.version +if in_ironpython:#ironpython does not provide a prompt string to readline + import System + default_prompt = ">>> " +else: + default_prompt = "" + import pdb + + +class MockConsoleError(Exception): + pass + +class MockConsole(object): + """object used during refactoring. Should raise errors when someone tries to use it. + """ + def __setattr__(self, x): + raise MockConsoleError("Should not try to get attributes from MockConsole") + + def cursor(self, size=50): + pass + +class BaseReadline(object): + def __init__(self): + self.allow_ctrl_c = False + self.ctrl_c_tap_time_interval = 0.3 + + self.debug = False + self.bell_style = 'none' + self.mark = -1 + self.console=MockConsole() + self.disable_readline = False + # this code needs to follow l_buffer and history creation + self.editingmodes = [mode(self) for mode in editingmodes] + for mode in self.editingmodes: + mode.init_editing_mode(None) + self.mode = self.editingmodes[0] + + self.read_inputrc() + log("\n".join(self.mode.rl_settings_to_string())) + + self.callback = None + + def parse_and_bind(self, string): + '''Parse and execute single line of a readline init file.''' + try: + log('parse_and_bind("%s")' % string) + if string.startswith('#'): + return + if string.startswith('set'): + m = re.compile(r'set\s+([-a-zA-Z0-9]+)\s+(.+)\s*$').match(string) + if m: + var_name = m.group(1) + val = m.group(2) + try: + setattr(self.mode, var_name.replace('-','_'), val) + except AttributeError: + log('unknown var="%s" val="%s"' % (var_name, val)) + else: + log('bad set "%s"' % string) + return + m = re.compile(r'\s*(.+)\s*:\s*([-a-zA-Z]+)\s*$').match(string) + if m: + key = m.group(1) + func_name = m.group(2) + py_name = func_name.replace('-', '_') + try: + func = getattr(self.mode, py_name) + except AttributeError: + log('unknown func key="%s" func="%s"' % (key, func_name)) + if self.debug: + print('pyreadline parse_and_bind error, unknown function to bind: "%s"' % func_name) + return + self.mode._bind_key(key, func) + except: + log('error') + raise + + def _set_prompt(self, prompt): + self.mode.prompt = prompt + + def _get_prompt(self): + return self.mode.prompt + + prompt = property(_get_prompt, _set_prompt) + + + def get_line_buffer(self): + '''Return the current contents of the line buffer.''' + return self.mode.l_buffer.get_line_text() + + def insert_text(self, string): + '''Insert text into the command line.''' + self.mode.insert_text(string) + + def read_init_file(self, filename=None): + '''Parse a readline initialization file. The default filename is the last filename used.''' + log('read_init_file("%s")' % filename) + + #History file book keeping methods (non-bindable) + + def add_history(self, line): + '''Append a line to the history buffer, as if it was the last line typed.''' + self.mode._history.add_history(line) + + def get_current_history_length(self ): + '''Return the number of lines currently in the history. + (This is different from get_history_length(), which returns + the maximum number of lines that will be written to a history file.)''' + return self.mode._history.get_current_history_length() + + def get_history_length(self ): + '''Return the desired length of the history file. + + Negative values imply unlimited history file size.''' + return self.mode._history.get_history_length() + + def set_history_length(self, length): + '''Set the number of lines to save in the history file. + + write_history_file() uses this value to truncate the history file + when saving. Negative values imply unlimited history file size. + ''' + self.mode._history.set_history_length(length) + + def get_history_item(self, index): + '''Return the current contents of history item at index.''' + return self.mode._history.get_history_item(index) + + def clear_history(self): + '''Clear readline history''' + self.mode._history.clear_history() + + def read_history_file(self, filename=None): + '''Load a readline history file. The default filename is ~/.history.''' + if filename is None: + filename = self.mode._history.history_filename + log("read_history_file from %s"%ensure_unicode(filename)) + self.mode._history.read_history_file(filename) + + def write_history_file(self, filename=None): + '''Save a readline history file. The default filename is ~/.history.''' + self.mode._history.write_history_file(filename) + + #Completer functions + + def set_completer(self, function=None): + '''Set or remove the completer function. + + If function is specified, it will be used as the new completer + function; if omitted or None, any completer function already + installed is removed. The completer function is called as + function(text, state), for state in 0, 1, 2, ..., until it returns a + non-string value. It should return the next possible completion + starting with text. + ''' + log('set_completer') + self.mode.completer = function + + def get_completer(self): + '''Get the completer function. + ''' + log('get_completer') + return self.mode.completer + + def get_begidx(self): + '''Get the beginning index of the readline tab-completion scope.''' + return self.mode.begidx + + def get_endidx(self): + '''Get the ending index of the readline tab-completion scope.''' + return self.mode.endidx + + def set_completer_delims(self, string): + '''Set the readline word delimiters for tab-completion.''' + self.mode.completer_delims = string + + def get_completer_delims(self): + '''Get the readline word delimiters for tab-completion.''' + return self.mode.completer_delims.encode("ascii") + + def set_startup_hook(self, function=None): + '''Set or remove the startup_hook function. + + If function is specified, it will be used as the new startup_hook + function; if omitted or None, any hook function already installed is + removed. The startup_hook function is called with no arguments just + before readline prints the first prompt. + + ''' + self.mode.startup_hook = function + + def set_pre_input_hook(self, function=None): + '''Set or remove the pre_input_hook function. + + If function is specified, it will be used as the new pre_input_hook + function; if omitted or None, any hook function already installed is + removed. The pre_input_hook function is called with no arguments + after the first prompt has been printed and just before readline + starts reading input characters. + + ''' + self.mode.pre_input_hook = function + +#Functions that are not relevant for all Readlines but should at least have a NOP + + def _bell(self): + pass + +# +# Standard call, not available for all implementations +# + + def readline(self, prompt=''): + raise NotImplementedError + +# +# Callback interface +# + def process_keyevent(self, keyinfo): + return self.mode.process_keyevent(keyinfo) + + def readline_setup(self, prompt=""): + return self.mode.readline_setup(prompt) + + def keyboard_poll(self): + return self.mode._readline_from_keyboard_poll() + + def callback_handler_install(self, prompt, callback): + '''bool readline_callback_handler_install ( string prompt, callback callback) + Initializes the readline callback interface and terminal, prints the prompt and returns immediately + ''' + self.callback = callback + self.readline_setup(prompt) + + def callback_handler_remove(self): + '''Removes a previously installed callback handler and restores terminal settings''' + self.callback = None + + def callback_read_char(self): + '''Reads a character and informs the readline callback interface when a line is received''' + if self.keyboard_poll(): + line = self.get_line_buffer() + '\n' + # however there is another newline added by + # self.mode.readline_setup(prompt) which is called by callback_handler_install + # this differs from GNU readline + self.add_history(self.mode.l_buffer) + # TADA: + self.callback(line) + + def read_inputrc(self, #in 2.4 we cannot call expanduser with unicode string + inputrcpath=os.path.expanduser("~/pyreadlineconfig.ini")): + modes = dict([(x.mode,x) for x in self.editingmodes]) + mode = self.editingmodes[0].mode + + def setmode(name): + self.mode = modes[name] + + def bind_key(key, name): + import new + if isinstance(name, collections.Callable): + modes[mode]._bind_key(key, new.instancemethod(name, modes[mode], modes[mode].__class__)) + elif hasattr(modes[mode], name): + modes[mode]._bind_key(key, getattr(modes[mode], name)) + else: + print("Trying to bind unknown command '%s' to key '%s'"%(name, key)) + + def un_bind_key(key): + keyinfo = make_KeyPress_from_keydescr(key).tuple() + if keyinfo in modes[mode].key_dispatch: + del modes[mode].key_dispatch[keyinfo] + + def bind_exit_key(key): + modes[mode]._bind_exit_key(key) + + def un_bind_exit_key(key): + keyinfo = make_KeyPress_from_keydescr(key).tuple() + if keyinfo in modes[mode].exit_dispatch: + del modes[mode].exit_dispatch[keyinfo] + + def setkill_ring_to_clipboard(killring): + import pyreadline.lineeditor.lineobj + pyreadline.lineeditor.lineobj.kill_ring_to_clipboard = killring + + def sethistoryfilename(filename): + self.mode._history.history_filename=os.path.expanduser(filename) + + def setbellstyle(mode): + self.bell_style = mode + + def disable_readline(mode): + self.disable_readline = mode + + def sethistorylength(length): + self.mode._history.history_length = int(length) + + def allow_ctrl_c(mode): + log("allow_ctrl_c:%s:%s"%(self.allow_ctrl_c, mode)) + self.allow_ctrl_c = mode + + def setbellstyle(mode): + self.bell_style = mode + + def show_all_if_ambiguous(mode): + self.mode.show_all_if_ambiguous = mode + + def ctrl_c_tap_time_interval(mode): + self.ctrl_c_tap_time_interval = mode + + def mark_directories(mode): + self.mode.mark_directories = mode + + def completer_delims(delims): + self.mode.completer_delims = delims + + def complete_filesystem(delims): + self.mode.complete_filesystem = delims.lower() + + def enable_ipython_paste_for_paths(boolean): + self.mode.enable_ipython_paste_for_paths = boolean + + def debug_output(on, filename="pyreadline_debug_log.txt"): #Not implemented yet + if on in ["on", "on_nologfile"]: + self.debug=True + + if on == "on": + logger.start_file_log(filename) + logger.start_socket_log() + logger.log("STARTING LOG") + elif on == "on_nologfile": + logger.start_socket_log() + logger.log("STARTING LOG") + else: + logger.log("STOPING LOG") + logger.stop_file_log() + logger.stop_socket_log() + + _color_trtable={"black":0, "darkred":4, "darkgreen":2, + "darkyellow":6, "darkblue":1, "darkmagenta":5, + "darkcyan":3, "gray":7, "red":4+8, + "green":2+8, "yellow":6+8, "blue":1+8, + "magenta":5+8, "cyan":3+8, "white":7+8} + + def set_prompt_color(color): + self.prompt_color = self._color_trtable.get(color.lower(),7) + + def set_input_color(color): + self.command_color=self._color_trtable.get(color.lower(),7) + + loc = {"branch":release.branch, + "version":release.version, + "mode":mode, + "modes":modes, + "set_mode":setmode, + "bind_key":bind_key, + "disable_readline":disable_readline, + "bind_exit_key":bind_exit_key, + "un_bind_key":un_bind_key, + "un_bind_exit_key":un_bind_exit_key, + "bell_style":setbellstyle, + "mark_directories":mark_directories, + "show_all_if_ambiguous":show_all_if_ambiguous, + "completer_delims":completer_delims, + "complete_filesystem":complete_filesystem, + "debug_output":debug_output, + "history_filename":sethistoryfilename, + "history_length":sethistorylength, + "set_prompt_color":set_prompt_color, + "set_input_color":set_input_color, + "allow_ctrl_c":allow_ctrl_c, + "ctrl_c_tap_time_interval":ctrl_c_tap_time_interval, + "kill_ring_to_clipboard":setkill_ring_to_clipboard, + "enable_ipython_paste_for_paths":enable_ipython_paste_for_paths, + } + if os.path.isfile(inputrcpath): + try: + exec(compile(open(inputrcpath).read(), inputrcpath, 'exec'), loc, loc) + except Exception as x: + raise + import traceback + print("Error reading .pyinputrc", file=sys.stderr) + filepath,lineno=traceback.extract_tb(sys.exc_info()[2])[1][:2] + print("Line: %s in file %s"%(lineno, filepath), file=sys.stderr) + print(x, file=sys.stderr) + raise ReadlineError("Error reading .pyinputrc") + + + +class Readline(BaseReadline): + """Baseclass for readline based on a console + """ + def __init__(self): + BaseReadline.__init__(self) + self.console = console.Console() + self.selection_color = self.console.saveattr<<4 + self.command_color = None + self.prompt_color = None + self.size = self.console.size() + + # variables you can control with parse_and_bind + +# To export as readline interface + + +## Internal functions + + def _bell(self): + '''ring the bell if requested.''' + if self.bell_style == 'none': + pass + elif self.bell_style == 'visible': + raise NotImplementedError("Bellstyle visible is not implemented yet.") + elif self.bell_style == 'audible': + self.console.bell() + else: + raise ReadlineError("Bellstyle %s unknown."%self.bell_style) + + def _clear_after(self): + c = self.console + x, y = c.pos() + w, h = c.size() + c.rectangle((x, y, w+1, y+1)) + c.rectangle((0, y+1, w, min(y+3,h))) + + def _set_cursor(self): + c = self.console + xc, yc = self.prompt_end_pos + w, h = c.size() + xc += self.mode.l_buffer.visible_line_width() + while(xc >= w): + xc -= w + yc += 1 + c.pos(xc, yc) + + def _print_prompt(self): + c = self.console + x, y = c.pos() + + n = c.write_scrolling(self.prompt, self.prompt_color) + self.prompt_begin_pos = (x, y - n) + self.prompt_end_pos = c.pos() + self.size = c.size() + + def _update_prompt_pos(self, n): + if n != 0: + bx, by = self.prompt_begin_pos + ex, ey = self.prompt_end_pos + self.prompt_begin_pos = (bx, by - n) + self.prompt_end_pos = (ex, ey - n) + + def _update_line(self): + c = self.console + l_buffer = self.mode.l_buffer + c.cursor(0) #Hide cursor avoiding flicking + c.pos(*self.prompt_begin_pos) + self._print_prompt() + ltext = l_buffer.quoted_text() + if l_buffer.enable_selection and (l_buffer.selection_mark >= 0): + start = len(l_buffer[:l_buffer.selection_mark].quoted_text()) + stop = len(l_buffer[:l_buffer.point].quoted_text()) + if start > stop: + stop,start = start,stop + n = c.write_scrolling(ltext[:start], self.command_color) + n = c.write_scrolling(ltext[start:stop], self.selection_color) + n = c.write_scrolling(ltext[stop:], self.command_color) + else: + n = c.write_scrolling(ltext, self.command_color) + + x, y = c.pos() #Preserve one line for Asian IME(Input Method Editor) statusbar + w, h = c.size() + if (y >= h - 1) or (n > 0): + c.scroll_window(-1) + c.scroll((0, 0, w, h), 0, -1) + n += 1 + + self._update_prompt_pos(n) + if hasattr(c, "clear_to_end_of_window"): #Work around function for ironpython due + c.clear_to_end_of_window() #to System.Console's lack of FillFunction + else: + self._clear_after() + + #Show cursor, set size vi mode changes size in insert/overwrite mode + c.cursor(1, size=self.mode.cursor_size) + self._set_cursor() + + + def callback_read_char(self): + #Override base to get automatic newline + '''Reads a character and informs the readline callback interface when a line is received''' + if self.keyboard_poll(): + line = self.get_line_buffer() + '\n' + self.console.write("\r\n") + # however there is another newline added by + # self.mode.readline_setup(prompt) which is called by callback_handler_install + # this differs from GNU readline + self.add_history(self.mode.l_buffer) + # TADA: + self.callback(line) + + + def event_available(self): + return self.console.peek() or (len(self.paste_line_buffer) > 0) + + + def _readline_from_keyboard(self): + while 1: + if self._readline_from_keyboard_poll(): + break + + def _readline_from_keyboard_poll(self): + pastebuffer = self.mode.paste_line_buffer + if len(pastebuffer) > 0: + #paste first line in multiline paste buffer + self.l_buffer = lineobj.ReadLineTextBuffer(pastebuffer[0]) + self._update_line() + self.mode.paste_line_buffer = pastebuffer[1:] + return True + + c = self.console + def nop(e): + pass + try: + event = c.getkeypress() + except KeyboardInterrupt: + event = self.handle_ctrl_c() + try: + result = self.mode.process_keyevent(event.keyinfo) + except EOFError: + logger.stop_logging() + raise + self._update_line() + return result + + def readline_setup(self, prompt=''): + BaseReadline.readline_setup(self, prompt) + self._print_prompt() + self._update_line() + + def readline(self, prompt=''): + self.readline_setup(prompt) + self.ctrl_c_timeout = time.time() + self._readline_from_keyboard() + self.console.write('\r\n') + log('returning(%s)' % self.get_line_buffer()) + return self.get_line_buffer() + '\n' + + def handle_ctrl_c(self): + from pyreadline.keysyms.common import KeyPress + from pyreadline.console.event import Event + log("KBDIRQ") + event = Event(0,0) + event.char = "c" + event.keyinfo = KeyPress("c", shift=False, control=True, + meta=False, keyname=None) + if self.allow_ctrl_c: + now = time.time() + if (now - self.ctrl_c_timeout) < self.ctrl_c_tap_time_interval: + log("Raise KeyboardInterrupt") + raise KeyboardInterrupt + else: + self.ctrl_c_timeout = now + else: + raise KeyboardInterrupt + return event + diff --git a/pyreadline/test/common.py b/pyreadline/test/common.py index cc24dd4..071c6ac 100644 --- a/pyreadline/test/common.py +++ b/pyreadline/test/common.py @@ -13,7 +13,7 @@ from pyreadline.keysyms.common import make_KeyPress_from_keydescr import unittest class MockReadline: def __init__ (self): - self.l_buffer=lineobj.ReadLineTextBuffer(u"") + self.l_buffer=lineobj.ReadLineTextBuffer("") self._history=history.LineHistory() def add_history (self, line): @@ -26,7 +26,7 @@ class MockReadline: pass def insert_text(self, string): - u'''Insert text into the command line.''' + '''Insert text into the command line.''' self.l_buffer.insert_text(string) @@ -52,20 +52,20 @@ class MockConsole: class Event: def __init__ (self, char): - if char==u"escape": - self.char=u'\x1b' - elif char==u"backspace": - self.char=u'\x08' - elif char==u"tab": - self.char=u'\t' - elif char==u"space": - self.char=u' ' + if char=="escape": + self.char='\x1b' + elif char=="backspace": + self.char='\x08' + elif char=="tab": + self.char='\t' + elif char=="space": + self.char=' ' else: self.char = char def keytext_to_keyinfo_and_event (keytext): keyinfo = keysyms.common.make_KeyPress_from_keydescr (keytext) - if len(keytext) == 3 and keytext[0] == u'"' and keytext[2] == u'"': + if len(keytext) == 3 and keytext[0] == '"' and keytext[2] == '"': event = Event (keytext[1]) else: event = Event (keyinfo.tuple() [3]) diff --git a/pyreadline/test/test_emacs.py b/pyreadline/test/test_emacs.py index 8554f18..f4dcf62 100644 --- a/pyreadline/test/test_emacs.py +++ b/pyreadline/test/test_emacs.py @@ -9,16 +9,16 @@ import sys, unittest import pdb -sys.path.append (u'../..') +sys.path.append ('../..') from pyreadline.modes.emacs import * from pyreadline import keysyms from pyreadline.lineeditor import lineobj -from common import * +from .common import * from pyreadline.logger import log import pyreadline.logger as logger logger.sock_silent=True -logger.show_event=[u"debug"] +logger.show_event=["debug"] #---------------------------------------------------------------------- @@ -31,7 +31,7 @@ class EmacsModeTest (EmacsMode): self.init_editing_mode (None) self.lst_completions = [] self.completer = self.mock_completer - self.completer_delims = u' u' + self.completer_delims = ' u' self.tabstop = 4 self.mark_directories=False self.show_all_if_ambiguous=False @@ -52,15 +52,15 @@ class EmacsModeTest (EmacsMode): line_cursor = property (get_line_cursor) def input (self, keytext): - if keytext[0:1] == u'"' and keytext[-1:] == u'"': - lst_key = [u'"%s"' % c for c in keytext[1:-1]] + if keytext[0:1] == '"' and keytext[-1:] == '"': + lst_key = ['"%s"' % c for c in keytext[1:-1]] else: lst_key = [keytext] for key in lst_key: keyinfo, event = keytext_to_keyinfo_and_event (key) dispatch_func = self.key_dispatch.get(keyinfo.tuple(),self.self_insert) self.tested_commands[dispatch_func.__name__]=dispatch_func - log(u"keydisp: %s %s"%( key,dispatch_func.__name__)) + log("keydisp: %s %s"%( key,dispatch_func.__name__)) dispatch_func (event) self.previous_func=dispatch_func @@ -78,141 +78,141 @@ class EmacsModeTest (EmacsMode): class TestsKeyinfo (unittest.TestCase): def test_keyinfo (self): - keyinfo, event = keytext_to_keyinfo_and_event (u'"d"') - self.assertEqual (u'd', event.char) - keyinfo, event = keytext_to_keyinfo_and_event (u'"D"') - self.assertEqual (u'D', event.char) - keyinfo, event = keytext_to_keyinfo_and_event (u'"$"') - self.assertEqual (u'$', event.char) - keyinfo, event = keytext_to_keyinfo_and_event (u'Escape') - self.assertEqual (u'\x1b', event.char) + keyinfo, event = keytext_to_keyinfo_and_event ('"d"') + self.assertEqual ('d', event.char) + keyinfo, event = keytext_to_keyinfo_and_event ('"D"') + self.assertEqual ('D', event.char) + keyinfo, event = keytext_to_keyinfo_and_event ('"$"') + self.assertEqual ('$', event.char) + keyinfo, event = keytext_to_keyinfo_and_event ('Escape') + self.assertEqual ('\x1b', event.char) class TestsMovement (unittest.TestCase): def test_cursor (self): r = EmacsModeTest () - self.assertEqual (r.line, u'') - r.input(u'"First Second Third"') - self.assertEqual (r.line, u'First Second Third') + self.assertEqual (r.line, '') + r.input('"First Second Third"') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input(u'Control-a') - self.assertEqual (r.line, u'First Second Third') + r.input('Control-a') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 0) - r.input(u'Control-e') - self.assertEqual (r.line, u'First Second Third') + r.input('Control-e') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input(u'Home') - self.assertEqual (r.line, u'First Second Third') + r.input('Home') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 0) - r.input(u'Right') - self.assertEqual (r.line, u'First Second Third') + r.input('Right') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 1) - r.input(u'Ctrl-f') - self.assertEqual (r.line, u'First Second Third') + r.input('Ctrl-f') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 2) - r.input(u'Ctrl-Right') - self.assertEqual (r.line, u'First Second Third') + r.input('Ctrl-Right') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 5) - r.input(u'Ctrl-Right') - self.assertEqual (r.line, u'First Second Third') + r.input('Ctrl-Right') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 12) - r.input(u'Ctrl-Right') - self.assertEqual (r.line, u'First Second Third') + r.input('Ctrl-Right') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input(u'Ctrl-Right') - self.assertEqual (r.line, u'First Second Third') + r.input('Ctrl-Right') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input(u'Ctrl-Left') - self.assertEqual (r.line, u'First Second Third') + r.input('Ctrl-Left') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 13) - r.input(u'Ctrl-Left') - self.assertEqual (r.line, u'First Second Third') + r.input('Ctrl-Left') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 6) - r.input(u'Ctrl-Left') - self.assertEqual (r.line, u'First Second Third') + r.input('Ctrl-Left') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 0) - r.input(u'Ctrl-Left') - self.assertEqual (r.line, u'First Second Third') + r.input('Ctrl-Left') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 0) class TestsDelete (unittest.TestCase): def test_delete (self): r = EmacsModeTest () - self.assertEqual (r.line, u'') - r.input(u'"First Second Third"') - self.assertEqual (r.line, u'First Second Third') + self.assertEqual (r.line, '') + r.input('"First Second Third"') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input(u'Delete') - self.assertEqual (r.line, u'First Second Third') + r.input('Delete') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input(u'Left') - r.input(u'Left') - r.input(u'Delete') - self.assertEqual (r.line, u'First Second Thid') + r.input('Left') + r.input('Left') + r.input('Delete') + self.assertEqual (r.line, 'First Second Thid') self.assertEqual (r.line_cursor, 16) - r.input(u'Delete') - self.assertEqual (r.line, u'First Second Thi') + r.input('Delete') + self.assertEqual (r.line, 'First Second Thi') self.assertEqual (r.line_cursor, 16) - r.input(u'Backspace') - self.assertEqual (r.line, u'First Second Th') + r.input('Backspace') + self.assertEqual (r.line, 'First Second Th') self.assertEqual (r.line_cursor, 15) - r.input(u'Home') - r.input(u'Right') - r.input(u'Right') - self.assertEqual (r.line, u'First Second Th') + r.input('Home') + r.input('Right') + r.input('Right') + self.assertEqual (r.line, 'First Second Th') self.assertEqual (r.line_cursor, 2) - r.input(u'Backspace') - self.assertEqual (r.line, u'Frst Second Th') + r.input('Backspace') + self.assertEqual (r.line, 'Frst Second Th') self.assertEqual (r.line_cursor, 1) - r.input(u'Backspace') - self.assertEqual (r.line, u'rst Second Th') + r.input('Backspace') + self.assertEqual (r.line, 'rst Second Th') self.assertEqual (r.line_cursor, 0) - r.input(u'Backspace') - self.assertEqual (r.line, u'rst Second Th') + r.input('Backspace') + self.assertEqual (r.line, 'rst Second Th') self.assertEqual (r.line_cursor, 0) - r.input(u'Escape') - self.assertEqual (r.line, u'') + r.input('Escape') + self.assertEqual (r.line, '') self.assertEqual (r.line_cursor, 0) def test_delete_word (self): r = EmacsModeTest () - self.assertEqual (r.line, u'') - r.input(u'"First Second Third"') - self.assertEqual (r.line, u'First Second Third') + self.assertEqual (r.line, '') + r.input('"First Second Third"') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input(u'Control-Backspace') - self.assertEqual (r.line, u'First Second ') + r.input('Control-Backspace') + self.assertEqual (r.line, 'First Second ') self.assertEqual (r.line_cursor, 13) - r.input(u'Backspace') - r.input(u'Left') - r.input(u'Left') - self.assertEqual (r.line, u'First Second') + r.input('Backspace') + r.input('Left') + r.input('Left') + self.assertEqual (r.line, 'First Second') self.assertEqual (r.line_cursor, 10) - r.input(u'Control-Backspace') - self.assertEqual (r.line, u'First nd') + r.input('Control-Backspace') + self.assertEqual (r.line, 'First nd') self.assertEqual (r.line_cursor, 6) - r.input(u'Escape') - self.assertEqual (r.line, u'') + r.input('Escape') + self.assertEqual (r.line, '') self.assertEqual (r.line_cursor, 0) - r.input(u'"First Second Third"') - r.input(u'Home') - r.input(u'Right') - r.input(u'Right') - r.input(u'Control-Delete') - self.assertEqual (r.line, u'FiSecond Third') + r.input('"First Second Third"') + r.input('Home') + r.input('Right') + r.input('Right') + r.input('Control-Delete') + self.assertEqual (r.line, 'FiSecond Third') self.assertEqual (r.line_cursor, 2) - r.input(u'Control-Delete') - self.assertEqual (r.line, u'FiThird') + r.input('Control-Delete') + self.assertEqual (r.line, 'FiThird') self.assertEqual (r.line_cursor, 2) - r.input(u'Control-Delete') - self.assertEqual (r.line, u'Fi') + r.input('Control-Delete') + self.assertEqual (r.line, 'Fi') self.assertEqual (r.line_cursor, 2) - r.input(u'Control-Delete') - self.assertEqual (r.line, u'Fi') + r.input('Control-Delete') + self.assertEqual (r.line, 'Fi') self.assertEqual (r.line_cursor, 2) - r.input(u'Escape') - self.assertEqual (r.line, u'') + r.input('Escape') + self.assertEqual (r.line, '') self.assertEqual (r.line_cursor, 0) @@ -220,30 +220,30 @@ class TestsDelete (unittest.TestCase): class TestsSelectionMovement (unittest.TestCase): def test_cursor (self): r = EmacsModeTest () - self.assertEqual (r.line, u'') - r.input(u'"First Second Third"') - self.assertEqual (r.line, u'First Second Third') + self.assertEqual (r.line, '') + r.input('"First Second Third"') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 18) self.assertEqual (r.l_buffer.selection_mark, -1) - r.input(u'Home') - r.input(u'Shift-Right') - self.assertEqual (r.line, u'First Second Third') + r.input('Home') + r.input('Shift-Right') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 1) self.assertEqual (r.l_buffer.selection_mark, 0) - r.input(u'Shift-Control-Right') - self.assertEqual (r.line, u'First Second Third') + r.input('Shift-Control-Right') + self.assertEqual (r.line, 'First Second Third') self.assertEqual (r.line_cursor, 5) self.assertEqual (r.l_buffer.selection_mark, 0) - r.input(u'"a"') - self.assertEqual (r.line, u'a Second Third') + r.input('"a"') + self.assertEqual (r.line, 'a Second Third') self.assertEqual (r.line_cursor, 1) self.assertEqual (r.l_buffer.selection_mark, -1) - r.input(u'Shift-End') - self.assertEqual (r.line, u'a Second Third') + r.input('Shift-End') + self.assertEqual (r.line, 'a Second Third') self.assertEqual (r.line_cursor, 14) self.assertEqual (r.l_buffer.selection_mark, 1) - r.input(u'Delete') - self.assertEqual (r.line, u'a') + r.input('Delete') + self.assertEqual (r.line, 'a') self.assertEqual (r.line_cursor, 1) self.assertEqual (r.l_buffer.selection_mark, -1) @@ -252,94 +252,94 @@ class TestsSelectionMovement (unittest.TestCase): class TestsHistory (unittest.TestCase): def test_history_1 (self): r = EmacsModeTest () - r.add_history (u'aa') - r.add_history (u'bbb') - self.assertEqual (r.line, u'') - r.input (u'Up') - self.assertEqual (r.line, u'bbb') + r.add_history ('aa') + r.add_history ('bbb') + self.assertEqual (r.line, '') + r.input ('Up') + self.assertEqual (r.line, 'bbb') self.assertEqual (r.line_cursor, 3) - r.input (u'Up') - self.assertEqual (r.line, u'aa') + r.input ('Up') + self.assertEqual (r.line, 'aa') self.assertEqual (r.line_cursor, 2) - r.input (u'Up') - self.assertEqual (r.line, u'aa') + r.input ('Up') + self.assertEqual (r.line, 'aa') self.assertEqual (r.line_cursor, 2) - r.input (u'Down') - self.assertEqual (r.line, u'bbb') + r.input ('Down') + self.assertEqual (r.line, 'bbb') self.assertEqual (r.line_cursor, 3) - r.input (u'Down') - self.assertEqual (r.line, u'') + r.input ('Down') + self.assertEqual (r.line, '') self.assertEqual (r.line_cursor, 0) def test_history_2 (self): r = EmacsModeTest () - r.add_history (u'aaaa') - r.add_history (u'aaba') - r.add_history (u'aaca') - r.add_history (u'akca') - r.add_history (u'bbb') - r.add_history (u'ako') + r.add_history ('aaaa') + r.add_history ('aaba') + r.add_history ('aaca') + r.add_history ('akca') + r.add_history ('bbb') + r.add_history ('ako') self.assert_line(r,'',0) - r.input (u'"a"') - r.input (u'Up') + r.input ('"a"') + r.input ('Up') self.assert_line(r,'ako',1) - r.input (u'Up') + r.input ('Up') self.assert_line(r,'akca',1) - r.input (u'Up') + r.input ('Up') self.assert_line(r,'aaca',1) - r.input (u'Up') + r.input ('Up') self.assert_line(r,'aaba',1) - r.input (u'Up') + r.input ('Up') self.assert_line(r,'aaaa',1) - r.input (u'Right') + r.input ('Right') self.assert_line(r,'aaaa',2) - r.input (u'Down') + r.input ('Down') self.assert_line(r,'aaba',2) - r.input (u'Down') + r.input ('Down') self.assert_line(r,'aaca',2) - r.input (u'Down') + r.input ('Down') self.assert_line(r,'aaca',2) - r.input (u'Left') - r.input (u'Left') - r.input (u'Down') - r.input (u'Down') + r.input ('Left') + r.input ('Left') + r.input ('Down') + r.input ('Down') self.assert_line(r,'bbb',3) - r.input (u'Left') + r.input ('Left') self.assert_line(r,'bbb',2) - r.input (u'Down') + r.input ('Down') self.assert_line(r,'bbb',2) - r.input (u'Up') + r.input ('Up') self.assert_line(r,'bbb',2) def test_history_3 (self): r = EmacsModeTest () - r.add_history (u'aaaa') - r.add_history (u'aaba') - r.add_history (u'aaca') - r.add_history (u'akca') - r.add_history (u'bbb') - r.add_history (u'ako') + r.add_history ('aaaa') + r.add_history ('aaba') + r.add_history ('aaca') + r.add_history ('akca') + r.add_history ('bbb') + r.add_history ('ako') self.assert_line(r,'',0) - r.input (u'') - r.input (u'Up') + r.input ('') + r.input ('Up') self.assert_line(r,'ako',3) - r.input (u'Down') + r.input ('Down') self.assert_line(r,'',0) - r.input (u'Up') + r.input ('Up') self.assert_line(r,'ako',3) def test_history_3 (self): r = EmacsModeTest () - r.add_history (u'aaaa') - r.add_history (u'aaba') - r.add_history (u'aaca') - r.add_history (u'akca') - r.add_history (u'bbb') - r.add_history (u'ako') + r.add_history ('aaaa') + r.add_history ('aaba') + r.add_history ('aaca') + r.add_history ('akca') + r.add_history ('bbb') + r.add_history ('ako') self.assert_line(r,'',0) - r.input (u'k') - r.input (u'Up') + r.input ('k') + r.input ('Up') self.assert_line(r,'k',1) def test_complete (self): @@ -354,22 +354,22 @@ class TestsHistory (unittest.TestCase): completerobj._callable_postfix = _nop r.completer = completerobj.complete r._bind_key("tab", r.complete) - r.input(u'"exi(ksdjksjd)"') - r.input(u'Control-a') - r.input(u'Right') - r.input(u'Right') - r.input(u'Right') - r.input(u'Tab') - self.assert_line(r, u"exit(ksdjksjd)", 4) + r.input('"exi(ksdjksjd)"') + r.input('Control-a') + r.input('Right') + r.input('Right') + r.input('Right') + r.input('Tab') + self.assert_line(r, "exit(ksdjksjd)", 4) - r.input(u'Escape') - r.input(u'"exi"') - r.input(u'Control-a') - r.input(u'Right') - r.input(u'Right') - r.input(u'Right') - r.input(u'Tab') - self.assert_line(r, u"exit", 4) + r.input('Escape') + r.input('"exi"') + r.input('Control-a') + r.input('Right') + r.input('Right') + r.input('Right') + r.input('Tab') + self.assert_line(r, "exit", 4) @@ -382,19 +382,19 @@ class TestsHistory (unittest.TestCase): #---------------------------------------------------------------------- -if __name__ == u'__main__': +if __name__ == '__main__': Tester() - tested=EmacsModeTest.tested_commands.keys() + tested=list(EmacsModeTest.tested_commands.keys()) tested.sort() # print " Tested functions ".center(60,"-") # print "\n".join(tested) # print - all_funcs=dict([(x.__name__,x) for x in EmacsModeTest().key_dispatch.values()]) - all_funcs=all_funcs.keys() + all_funcs=dict([(x.__name__,x) for x in list(EmacsModeTest().key_dispatch.values())]) + all_funcs=list(all_funcs.keys()) not_tested=[x for x in all_funcs if x not in tested] not_tested.sort() - print " Not tested functions ".center(60,"-") - print "\n".join(not_tested) + print(" Not tested functions ".center(60,"-")) + print("\n".join(not_tested)) diff --git a/pyreadline/test/test_history.py b/pyreadline/test/test_history.py index d2c97f0..14bde84 100644 --- a/pyreadline/test/test_history.py +++ b/pyreadline/test/test_history.py @@ -2,7 +2,7 @@ # Copyright (C) 2007 Jörgen Stenarson. <> import sys, unittest -sys.path.append (u'../..') +sys.path.append ('../..') #from pyreadline.modes.vi import * #from pyreadline import keysyms from pyreadline.lineeditor import lineobj @@ -19,76 +19,76 @@ from pyreadline.logger import log RL=lineobj.ReadLineTextBuffer class Test_linepos (unittest.TestCase): - t=u"test text" + t="test text" def init_test(self): history._ignore_leading_spaces=False self.q=q=LineHistory() - for x in [u"aaaa",u"aaba",u"aaca",u"akca",u"bbb",u"ako"]: + for x in ["aaaa","aaba","aaca","akca","bbb","ako"]: q.add_history(RL(x)) def test_previous_history (self): self.init_test() hist=self.q assert hist.history_cursor==6 - l=RL(u"") + l=RL("") hist.previous_history(l) - assert l.get_line_text()==u"ako" + assert l.get_line_text()=="ako" hist.previous_history(l) - assert l.get_line_text()==u"bbb" + assert l.get_line_text()=="bbb" hist.previous_history(l) - assert l.get_line_text()==u"akca" + assert l.get_line_text()=="akca" hist.previous_history(l) - assert l.get_line_text()==u"aaca" + assert l.get_line_text()=="aaca" hist.previous_history(l) - assert l.get_line_text()==u"aaba" + assert l.get_line_text()=="aaba" hist.previous_history(l) - assert l.get_line_text()==u"aaaa" + assert l.get_line_text()=="aaaa" hist.previous_history(l) - assert l.get_line_text()==u"aaaa" + assert l.get_line_text()=="aaaa" def test_next_history (self): self.init_test() hist=self.q hist.beginning_of_history() assert hist.history_cursor==0 - l=RL(u"") + l=RL("") hist.next_history(l) - assert l.get_line_text()==u"aaba" + assert l.get_line_text()=="aaba" hist.next_history(l) - assert l.get_line_text()==u"aaca" + assert l.get_line_text()=="aaca" hist.next_history(l) - assert l.get_line_text()==u"akca" + assert l.get_line_text()=="akca" hist.next_history(l) - assert l.get_line_text()==u"bbb" + assert l.get_line_text()=="bbb" hist.next_history(l) - assert l.get_line_text()==u"ako" + assert l.get_line_text()=="ako" hist.next_history(l) - assert l.get_line_text()==u"ako" + assert l.get_line_text()=="ako" def init_test2(self): self.q=q=LineHistory() - for x in [u"aaaa",u"aaba",u"aaca",u"akca",u"bbb",u"ako"]: + for x in ["aaaa","aaba","aaca","akca","bbb","ako"]: q.add_history(RL(x)) def test_history_search_backward (self): history._ignore_leading_spaces=False q=LineHistory() - for x in [u"aaaa",u"aaba",u"aaca",u" aacax",u"akca",u"bbb",u"ako"]: + for x in ["aaaa","aaba","aaca"," aacax","akca","bbb","ako"]: q.add_history(RL(x)) - a=RL(u"aa",point=2) - for x in [u"aaca",u"aaba",u"aaaa",u"aaaa"]: + a=RL("aa",point=2) + for x in ["aaca","aaba","aaaa","aaaa"]: res=q.history_search_backward(a) assert res.get_line_text()==x def test_history_search_forward (self): history._ignore_leading_spaces=False q=LineHistory() - for x in [u"aaaa",u"aaba",u"aaca",u" aacax",u"akca",u"bbb",u"ako"]: + for x in ["aaaa","aaba","aaca"," aacax","akca","bbb","ako"]: q.add_history(RL(x)) q.beginning_of_history() - a=RL(u"aa",point=2) - for x in [u"aaba",u"aaca",u"aaca"]: + a=RL("aa",point=2) + for x in ["aaba","aaca","aaca"]: res=q.history_search_forward(a) assert res.get_line_text()==x @@ -98,7 +98,7 @@ class Test_linepos (unittest.TestCase): #---------------------------------------------------------------------- -if __name__ == u'__main__': +if __name__ == '__main__': unittest.main() - l=lineobj.ReadLineTextBuffer(u"First Second Third") \ No newline at end of file + l=lineobj.ReadLineTextBuffer("First Second Third") \ No newline at end of file diff --git a/pyreadline/test/test_lineeditor.py b/pyreadline/test/test_lineeditor.py index 3b1c9a5..25c9f82 100644 --- a/pyreadline/test/test_lineeditor.py +++ b/pyreadline/test/test_lineeditor.py @@ -1,7 +1,7 @@ # Copyright (C) 2006 Michael Graz. import sys, unittest -sys.path.append (u'../..') +sys.path.append ('../..') #from pyreadline.modes.vi import * #from pyreadline import keysyms from pyreadline.lineeditor import lineobj @@ -13,14 +13,14 @@ from pyreadline.lineeditor import lineobj class Test_copy (unittest.TestCase): def test_copy1 (self): - l=lineobj.ReadLineTextBuffer(u"first second") + l=lineobj.ReadLineTextBuffer("first second") q=l.copy() self.assertEqual(q.get_line_text(),l.get_line_text()) self.assertEqual(q.point,l.point) self.assertEqual(q.mark,l.mark) def test_copy2 (self): - l=lineobj.ReadLineTextBuffer(u"first second",point=5) + l=lineobj.ReadLineTextBuffer("first second",point=5) q=l.copy() self.assertEqual(q.get_line_text(),l.get_line_text()) self.assertEqual(q.point,l.point) @@ -79,17 +79,17 @@ class Test_movement (unittest.TestCase): tests=[ # u"First" (cmd, - u"First", - u"# u", - u" # u"), + "First", + "# u", + " # u"), (cmd, - u"First", - u" # u", - u" #"), + "First", + " # u", + " #"), (cmd, - u"First", - u" #", - u" #"), + "First", + " #", + " #"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -101,17 +101,17 @@ class Test_movement (unittest.TestCase): tests=[ # u"First" (cmd, - u"First", - u" #", - u" # u"), + "First", + " #", + " # u"), (cmd, - u"First", - u" # u", - u"# u"), + "First", + " # u", + "# u"), (cmd, - u"First", - u"# u", - u"# u"), + "First", + "# u", + "# u"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -125,21 +125,21 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - u"First Second Third", - u" #", - u" # u"), + "First Second Third", + " #", + " # u"), (cmd, - u"First Second Third", - u" # u", - u" # u"), + "First Second Third", + " # u", + " # u"), (cmd, - u"First Second Third", - u" # u", - u"# u"), + "First Second Third", + " # u", + "# u"), (cmd, - u"First Second Third", - u"# u", - u"# u"), + "First Second Third", + "# u", + "# u"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -151,21 +151,21 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - u"First Second Third", - u"# u", - u" # u"), + "First Second Third", + "# u", + " # u"), (cmd, - u"First Second Third", - u" # u", - u" # u"), + "First Second Third", + " # u", + " # u"), (cmd, - u"First Second Third", - u" # u", - u" # u"), + "First Second Third", + " # u", + " # u"), (cmd, - u"First Second Third", - u" # u", - u" #"), + "First Second Third", + " # u", + " #"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -177,21 +177,21 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - u"First Second Third", - u"# u", - u" # u"), + "First Second Third", + "# u", + " # u"), (cmd, - u"First Second Third", - u" # u", - u" # u"), + "First Second Third", + " # u", + " # u"), (cmd, - u"First Second Third", - u" # u", - u" # u"), + "First Second Third", + " # u", + " # u"), (cmd, - u"First Second Third", - u" # u", - u" #"), + "First Second Third", + " # u", + " #"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -203,21 +203,21 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - u"First Second Third", - u" #", - u" # u"), + "First Second Third", + " #", + " # u"), (cmd, - u"First Second Third", - u" # u", - u" # u"), + "First Second Third", + " # u", + " # u"), (cmd, - u"First Second Third", - u" # u", - u"# u"), + "First Second Third", + " # u", + "# u"), (cmd, - u"First Second Third", - u"# u", - u"# u"), + "First Second Third", + "# u", + "# u"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -229,17 +229,17 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - u"First Second Third", - u"# u", - u" # u"), + "First Second Third", + "# u", + " # u"), (cmd, - u"First Second Third", - u" # u", - u" # u"), + "First Second Third", + " # u", + " # u"), (cmd, - u"First Second Third", - u" # u", - u" #"), + "First Second Third", + " # u", + " #"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -251,14 +251,14 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - u"First Second Third", - u" # u"), + "First Second Third", + " # u"), (cmd, - u"First Second Third", - u" # u"), + "First Second Third", + " # u"), (cmd, - u"First Second Third", - u" #"), + "First Second Third", + " #"), ] for cmd,text,init_point in tests: @@ -271,17 +271,17 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - u"First Second Third", - u"# u", - u"# u"), + "First Second Third", + "# u", + "# u"), (cmd, - u"First Second Third", - u" # u", - u"# u"), + "First Second Third", + " # u", + "# u"), (cmd, - u"First Second Third", - u" # u", - u" # u"), + "First Second Third", + " # u", + " # u"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -293,14 +293,14 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - u"First Second Third", - u" # u"), + "First Second Third", + " # u"), (cmd, - u"First Second Third", - u" # u"), + "First Second Third", + " # u"), (cmd, - u"First Second Third", - u" #"), + "First Second Third", + " #"), ] for cmd,text,init_point in tests: @@ -313,17 +313,17 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - u"First Second Third", - u"# u", - u"# u"), + "First Second Third", + "# u", + "# u"), (cmd, - u"First Second Third", - u" # u", - u"# u"), + "First Second Third", + " # u", + "# u"), (cmd, - u"First Second Third", - u" #", - u"# u"), + "First Second Third", + " #", + "# u"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -335,17 +335,17 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - u"First Second Third", - u"# u", - u" #"), + "First Second Third", + "# u", + " #"), (cmd, - u"First Second Third", - u" # u", - u" #"), + "First Second Third", + " # u", + " #"), (cmd, - u"First Second Third", - u" #", - u" #"), + "First Second Third", + " #", + " #"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -357,13 +357,13 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - u"First Second Third", + "First Second Third", 0), (cmd, - u"First Second Third", + "First Second Third", 12), (cmd, - u"First Second Third", + "First Second Third", 18), ] for cmd,text,p in tests: @@ -375,16 +375,16 @@ class Test_movement (unittest.TestCase): # utility functions def get_point_pos(pstr): - return pstr.index(u"#") + return pstr.index("#") def get_mark_pos(mstr): try: - return mstr.index(u"#") + return mstr.index("#") except ValueError: return -1 #---------------------------------------------------------------------- -if __name__ == u'__main__': +if __name__ == '__main__': unittest.main() - l=lineobj.ReadLineTextBuffer(u"First Second Third") + l=lineobj.ReadLineTextBuffer("First Second Third") diff --git a/pyreadline/test/test_vi.py b/pyreadline/test/test_vi.py index 8b5c904..e0be991 100644 --- a/pyreadline/test/test_vi.py +++ b/pyreadline/test/test_vi.py @@ -7,15 +7,15 @@ #***************************************************************************** import sys, unittest,pdb -sys.path.append (u'../..') +sys.path.append ('../..') from pyreadline.modes.vi import * from pyreadline import keysyms from pyreadline.lineeditor import lineobj from pyreadline.logger import log import pyreadline.logger as logger -from common import * +from .common import * -from common import * +from .common import * #---------------------------------------------------------------------- class ViModeTest (ViMode): @@ -27,7 +27,7 @@ class ViModeTest (ViMode): self.vi_set_insert_mode (True) self.lst_completions = [] self.completer = self.mock_completer - self.completer_delims = u' ' + self.completer_delims = ' ' self.tabstop = 4 def get_mock_console (self): @@ -46,8 +46,8 @@ class ViModeTest (ViMode): line_cursor = property (get_line_cursor) def input (self, keytext): - if keytext[0] == u'"' and keytext[-1] == u'"': - lst_key = [u'"%s"' % c for c in keytext[1:-1]] + if keytext[0] == '"' and keytext[-1] == '"': + lst_key = ['"%s"' % c for c in keytext[1:-1]] else: lst_key = [keytext] for key in lst_key: @@ -67,19 +67,19 @@ class ViModeTest (ViMode): class ViExternalEditorTest (ViExternalEditor): def __init__ (self, line): - import StringIO - self.sio_write = StringIO.StringIO () - self.sio_read = StringIO.StringIO (u'qwerty after') + import io + self.sio_write = io.StringIO () + self.sio_read = io.StringIO ('qwerty after') ViExternalEditor.__init__ (self, line) def get_tempfile (self): - return u'temp.py' + return 'temp.py' def get_editor (self): - return u'vim.exe' + return 'vim.exe' def file_open (self, filename, mode): - if mode == u'w': + if mode == 'w': return self.sio_write else: return self.sio_read @@ -95,1622 +95,1622 @@ class ViExternalEditorTest (ViExternalEditor): class Tests (unittest.TestCase): def test_keyinfo (self): - keyinfo, event = keytext_to_keyinfo_and_event (u'"d"') - self.assertEqual (u'd', event.char) - keyinfo, event = keytext_to_keyinfo_and_event (u'"D"') - self.assertEqual (u'D', event.char) - keyinfo, event = keytext_to_keyinfo_and_event (u'"$"') - self.assertEqual (u'$', event.char) - keyinfo, event = keytext_to_keyinfo_and_event (u'Escape') - self.assertEqual (u'\x1b', event.char) + keyinfo, event = keytext_to_keyinfo_and_event ('"d"') + self.assertEqual ('d', event.char) + keyinfo, event = keytext_to_keyinfo_and_event ('"D"') + self.assertEqual ('D', event.char) + keyinfo, event = keytext_to_keyinfo_and_event ('"$"') + self.assertEqual ('$', event.char) + keyinfo, event = keytext_to_keyinfo_and_event ('Escape') + self.assertEqual ('\x1b', event.char) def test_simple (self): r = ViModeTest () - r._set_line (u'abc') + r._set_line ('abc') self.assert_ (r.vi_is_insert_mode) - r.input (u'"d"') + r.input ('"d"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (u'abcd', r.line) - r.input (u'Escape') + self.assertEqual ('abcd', r.line) + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) - self.assertEqual (u'abcd', r.line) - r.input (u'"i"') + self.assertEqual ('abcd', r.line) + r.input ('"i"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (u'abcd', r.line) - r.input (u'"x"') - self.assertEqual (u'abcxd', r.line) - r.input (u'"y"') - self.assertEqual (u'abcxyd', r.line) + self.assertEqual ('abcd', r.line) + r.input ('"x"') + self.assertEqual ('abcxd', r.line) + r.input ('"y"') + self.assertEqual ('abcxyd', r.line) def test_begin_and_end (self): r = ViModeTest () - r._set_line (u'abc') + r._set_line ('abc') self.assertEqual (3, r.line_cursor) - r.input (u'Escape') + r.input ('Escape') self.assertEqual (2, r.line_cursor) - r.input (u'"0"') + r.input ('"0"') self.assertEqual (0, r.line_cursor) - r.input (u'"$"') + r.input ('"$"') self.assertEqual (2, r.line_cursor) - r.input (u'"^"') + r.input ('"^"') self.assertEqual (0, r.line_cursor) def test_history_alpha (self): r = ViModeTest () - r.add_history (u'abc') - r.add_history (u'def') - r._set_line (u'ghi') - r.input (u'Escape') - r.input (u'"k"') + r.add_history ('abc') + r.add_history ('def') + r._set_line ('ghi') + r.input ('Escape') + r.input ('"k"') self.assertEqual (0, r.line_cursor) - self.assertEqual (u'def', r.line) - r.input (u'"k"') - self.assertEqual (u'abc', r.line) + self.assertEqual ('def', r.line) + r.input ('"k"') + self.assertEqual ('abc', r.line) self.assertEqual (0, r.console.bell_count) - r.input (u'"k"') - self.assertEqual (u'abc', r.line) + r.input ('"k"') + self.assertEqual ('abc', r.line) # TODO up history with no more -> error ? # self.assertEqual (1, r.console.bell_count) - r.input (u'"j"') - self.assertEqual (u'def', r.line) + r.input ('"j"') + self.assertEqual ('def', r.line) self.assertEqual (0, r.line_cursor) - r.input (u'"j"') - self.assertEqual (u'ghi', r.line) + r.input ('"j"') + self.assertEqual ('ghi', r.line) # TODO returning to original line loses cursor pos? # self.assertEqual (2, r.line_cursor) - r.input (u'"j"') - self.assertEqual (u'ghi', r.line) + r.input ('"j"') + self.assertEqual ('ghi', r.line) self.assertEqual (2, r.line_cursor) def test_history_arrow (self): r = ViModeTest () - r.add_history (u'abc') - r.add_history (u'def') - r.input (u'"ghi"') + r.add_history ('abc') + r.add_history ('def') + r.input ('"ghi"') self.assertEqual (3, r.line_cursor) - r.input (u'Up') + r.input ('Up') self.assertEqual (3, r.line_cursor) - self.assertEqual (u'def', r.line) - r.input (u'Up') + self.assertEqual ('def', r.line) + r.input ('Up') self.assertEqual (3, r.line_cursor) - self.assertEqual (u'abc', r.line) + self.assertEqual ('abc', r.line) self.assertEqual (0, r.console.bell_count) - r.input (u'Up') - self.assertEqual (u'abc', r.line) + r.input ('Up') + self.assertEqual ('abc', r.line) # TODO up history with no more -> error ? # self.assertEqual (1, r.console.bell_count) - r.input (u'Down') - self.assertEqual (u'def', r.line) + r.input ('Down') + self.assertEqual ('def', r.line) self.assertEqual (3, r.line_cursor) - r.input (u'Down') - self.assertEqual (u'ghi', r.line) + r.input ('Down') + self.assertEqual ('ghi', r.line) self.assertEqual (3, r.line_cursor) - r.input (u'Down') - self.assertEqual (u'ghi', r.line) + r.input ('Down') + self.assertEqual ('ghi', r.line) self.assertEqual (3, r.line_cursor) def test_history_arrow_after_undo (self): r = ViModeTest () - r.input (u'"aaa"') - r.input (u'Return') - r.input (u'"bbb ccc"') - r.input (u'Escape') - r.input (u'"F D"') - self.assertEqual (r.line, u'bbb') - r.input (u'"u"') - self.assertEqual (r.line, u'bbb ccc') - r.input (u'Return') + r.input ('"aaa"') + r.input ('Return') + r.input ('"bbb ccc"') + r.input ('Escape') + r.input ('"F D"') + self.assertEqual (r.line, 'bbb') + r.input ('"u"') + self.assertEqual (r.line, 'bbb ccc') + r.input ('Return') self.assertEqual (r.console.bell_count, 0) - r.input (u'"ddd"') - r.input (u'Down') - self.assertEqual (r.line, u'ddd') + r.input ('"ddd"') + r.input ('Down') + self.assertEqual (r.line, 'ddd') # TODO down history with no more -> error ? # self.assertEqual (r.console.bell_count, 1) def test_vi_is_word (self): - self.assert_ (vi_is_word (u'a')) - self.assert_ (not vi_is_word (u' u')) + self.assert_ (vi_is_word ('a')) + self.assert_ (not vi_is_word (' u')) def test_pos_word_short (self): - self.assertEqual (0, vi_pos_word_short (u'')) - self.assertEqual (4, vi_pos_word_short (u'abc def u')) - self.assertEqual (4, vi_pos_word_short (u'abc def u', 2)) - self.assertEqual (4, vi_pos_word_short (u'abc def u', 3)) - self.assertEqual (8, vi_pos_word_short (u'abc def u', 4)) - self.assertEqual (3, vi_pos_word_short (u'abc.def u')) - self.assertEqual (5, vi_pos_word_short (u'abc..def u', 3)) - self.assertEqual (8, vi_pos_word_short (u'ab cd ef gh', count=2)) - self.assertEqual (8, vi_pos_word_short (u'ab cd ef gh', 1, 2)) - self.assertEqual (8, vi_pos_word_short (u'ab cd ef gh', 3, 2)) - self.assertEqual (14, vi_pos_word_short (u'ab cd ef gh', count=10)) + self.assertEqual (0, vi_pos_word_short ('')) + self.assertEqual (4, vi_pos_word_short ('abc def u')) + self.assertEqual (4, vi_pos_word_short ('abc def u', 2)) + self.assertEqual (4, vi_pos_word_short ('abc def u', 3)) + self.assertEqual (8, vi_pos_word_short ('abc def u', 4)) + self.assertEqual (3, vi_pos_word_short ('abc.def u')) + self.assertEqual (5, vi_pos_word_short ('abc..def u', 3)) + self.assertEqual (8, vi_pos_word_short ('ab cd ef gh', count=2)) + self.assertEqual (8, vi_pos_word_short ('ab cd ef gh', 1, 2)) + self.assertEqual (8, vi_pos_word_short ('ab cd ef gh', 3, 2)) + self.assertEqual (14, vi_pos_word_short ('ab cd ef gh', count=10)) def test_pos_word_long (self): - self.assertEqual (0, vi_pos_word_long (u'')) - self.assertEqual (4, vi_pos_word_long (u'abc def u')) - self.assertEqual (4, vi_pos_word_long (u'abc def u', 2)) - self.assertEqual (4, vi_pos_word_long (u'abc def u', 3)) - self.assertEqual (8, vi_pos_word_long (u'abc def u', 4)) - self.assertEqual (8, vi_pos_word_long (u'abc.def u')) - self.assertEqual (9, vi_pos_word_long (u'abc..def u', 3)) - self.assertEqual (10, vi_pos_word_long (u'a.b c.d e.f g.h', count=2)) - self.assertEqual (10, vi_pos_word_long (u'a.b c.d e.f g.h', 2, 2)) - self.assertEqual (10, vi_pos_word_long (u'a.b c.d e.f g.h', 4, 2)) + self.assertEqual (0, vi_pos_word_long ('')) + self.assertEqual (4, vi_pos_word_long ('abc def u')) + self.assertEqual (4, vi_pos_word_long ('abc def u', 2)) + self.assertEqual (4, vi_pos_word_long ('abc def u', 3)) + self.assertEqual (8, vi_pos_word_long ('abc def u', 4)) + self.assertEqual (8, vi_pos_word_long ('abc.def u')) + self.assertEqual (9, vi_pos_word_long ('abc..def u', 3)) + self.assertEqual (10, vi_pos_word_long ('a.b c.d e.f g.h', count=2)) + self.assertEqual (10, vi_pos_word_long ('a.b c.d e.f g.h', 2, 2)) + self.assertEqual (10, vi_pos_word_long ('a.b c.d e.f g.h', 4, 2)) def test_pos_end_short (self): - self.assertEqual (0, vi_pos_end_short (u'')) - self.assertEqual (2, vi_pos_end_short (u'abc def u')) - self.assertEqual (6, vi_pos_end_short (u'abc def u', 2)) - self.assertEqual (6, vi_pos_end_short (u'abc def u', 3)) - self.assertEqual (6, vi_pos_end_short (u'abc def u', 4)) - self.assertEqual (2, vi_pos_end_short (u'abc.def u')) - self.assertEqual (7, vi_pos_end_short (u'abc ... def u', 3)) - self.assertEqual (7, vi_pos_end_short (u'abc ... def u', 5)) - self.assertEqual (12, vi_pos_end_short (u'abc ... def u', 8)) - self.assertEqual (5, vi_pos_end_short (u'ab cd ef gh', count=2)) - self.assertEqual (9, vi_pos_end_short (u'ab cd ef gh', 1, 2)) - self.assertEqual (9, vi_pos_end_short (u'ab cd ef gh', 3, 2)) + self.assertEqual (0, vi_pos_end_short ('')) + self.assertEqual (2, vi_pos_end_short ('abc def u')) + self.assertEqual (6, vi_pos_end_short ('abc def u', 2)) + self.assertEqual (6, vi_pos_end_short ('abc def u', 3)) + self.assertEqual (6, vi_pos_end_short ('abc def u', 4)) + self.assertEqual (2, vi_pos_end_short ('abc.def u')) + self.assertEqual (7, vi_pos_end_short ('abc ... def u', 3)) + self.assertEqual (7, vi_pos_end_short ('abc ... def u', 5)) + self.assertEqual (12, vi_pos_end_short ('abc ... def u', 8)) + self.assertEqual (5, vi_pos_end_short ('ab cd ef gh', count=2)) + self.assertEqual (9, vi_pos_end_short ('ab cd ef gh', 1, 2)) + self.assertEqual (9, vi_pos_end_short ('ab cd ef gh', 3, 2)) def test_pos_end_long (self): - self.assertEqual (0, vi_pos_end_long (u'')) - self.assertEqual (2, vi_pos_end_long (u'abc def u')) - self.assertEqual (6, vi_pos_end_long (u'abc def u', 2)) - self.assertEqual (6, vi_pos_end_long (u'abc def u', 3)) - self.assertEqual (6, vi_pos_end_long (u'abc def u', 4)) - self.assertEqual (6, vi_pos_end_long (u'abc.def u')) - self.assertEqual (10, vi_pos_end_long (u' abc...def u')) - self.assertEqual (10, vi_pos_end_long (u'abc ...def u', 5)) - self.assertEqual (7, vi_pos_end_long (u'a.b c.d e.f g.h', count=2)) - self.assertEqual (12, vi_pos_end_long (u'a.b c.d e.f g.h', 2, 2)) - self.assertEqual (12, vi_pos_end_long (u'a.b c.d e.f g.h', 4, 2)) + self.assertEqual (0, vi_pos_end_long ('')) + self.assertEqual (2, vi_pos_end_long ('abc def u')) + self.assertEqual (6, vi_pos_end_long ('abc def u', 2)) + self.assertEqual (6, vi_pos_end_long ('abc def u', 3)) + self.assertEqual (6, vi_pos_end_long ('abc def u', 4)) + self.assertEqual (6, vi_pos_end_long ('abc.def u')) + self.assertEqual (10, vi_pos_end_long (' abc...def u')) + self.assertEqual (10, vi_pos_end_long ('abc ...def u', 5)) + self.assertEqual (7, vi_pos_end_long ('a.b c.d e.f g.h', count=2)) + self.assertEqual (12, vi_pos_end_long ('a.b c.d e.f g.h', 2, 2)) + self.assertEqual (12, vi_pos_end_long ('a.b c.d e.f g.h', 4, 2)) def test_pos_back_short (self): - self.assertEqual (0, vi_pos_back_short (u'')) - self.assertEqual (4, vi_pos_back_short (u'abc def', 6)) - self.assertEqual (4, vi_pos_back_short (u'abc def', 5)) - self.assertEqual (0, vi_pos_back_short (u'abc def', 4)) - self.assertEqual (0, vi_pos_back_short (u'abc def', 3)) - self.assertEqual (8, vi_pos_back_short (u'abc ...def u', 11)) - self.assertEqual (5, vi_pos_back_short (u'abc ...def u', 8)) - self.assertEqual (0, vi_pos_back_short (u'abc ...def u', 5)) - self.assertEqual (0, vi_pos_back_short (u'abc ...def u')) - self.assertEqual (8, vi_pos_back_short (u'abc def... u', 11)) - self.assertEqual (5, vi_pos_back_short (u'abc def... u', 8)) - self.assertEqual (0, vi_pos_back_short (u'abc def... u', 5)) - self.assertEqual (11, vi_pos_back_short (u'abc def... ghi...', 16, count=2)) - self.assertEqual (0, vi_pos_back_short (u'abc def... ghi...', 11, count=3)) + self.assertEqual (0, vi_pos_back_short ('')) + self.assertEqual (4, vi_pos_back_short ('abc def', 6)) + self.assertEqual (4, vi_pos_back_short ('abc def', 5)) + self.assertEqual (0, vi_pos_back_short ('abc def', 4)) + self.assertEqual (0, vi_pos_back_short ('abc def', 3)) + self.assertEqual (8, vi_pos_back_short ('abc ...def u', 11)) + self.assertEqual (5, vi_pos_back_short ('abc ...def u', 8)) + self.assertEqual (0, vi_pos_back_short ('abc ...def u', 5)) + self.assertEqual (0, vi_pos_back_short ('abc ...def u')) + self.assertEqual (8, vi_pos_back_short ('abc def... u', 11)) + self.assertEqual (5, vi_pos_back_short ('abc def... u', 8)) + self.assertEqual (0, vi_pos_back_short ('abc def... u', 5)) + self.assertEqual (11, vi_pos_back_short ('abc def... ghi...', 16, count=2)) + self.assertEqual (0, vi_pos_back_short ('abc def... ghi...', 11, count=3)) def test_pos_back_long (self): - self.assertEqual (0, vi_pos_back_long (u'')) - self.assertEqual (4, vi_pos_back_long (u'abc def', 6)) - self.assertEqual (4, vi_pos_back_long (u'abc def', 5)) - self.assertEqual (0, vi_pos_back_long (u'abc def', 4)) - self.assertEqual (0, vi_pos_back_long (u'abc def', 3)) - self.assertEqual (5, vi_pos_back_long (u'abc ...def u', 11)) - self.assertEqual (0, vi_pos_back_long (u'abc ...def u', 5)) - self.assertEqual (0, vi_pos_back_long (u'abc ...def u')) - self.assertEqual (5, vi_pos_back_long (u'abc def... u', 11)) - self.assertEqual (0, vi_pos_back_long (u'abc def... u', 5)) - self.assertEqual (4, vi_pos_back_long (u'abc def... ghi...', 16, count=2)) + self.assertEqual (0, vi_pos_back_long ('')) + self.assertEqual (4, vi_pos_back_long ('abc def', 6)) + self.assertEqual (4, vi_pos_back_long ('abc def', 5)) + self.assertEqual (0, vi_pos_back_long ('abc def', 4)) + self.assertEqual (0, vi_pos_back_long ('abc def', 3)) + self.assertEqual (5, vi_pos_back_long ('abc ...def u', 11)) + self.assertEqual (0, vi_pos_back_long ('abc ...def u', 5)) + self.assertEqual (0, vi_pos_back_long ('abc ...def u')) + self.assertEqual (5, vi_pos_back_long ('abc def... u', 11)) + self.assertEqual (0, vi_pos_back_long ('abc def... u', 5)) + self.assertEqual (4, vi_pos_back_long ('abc def... ghi...', 16, count=2)) def test_pos_find_char_forward (self): - self.assertEqual (-1, vi_pos_find_char_forward (u'', u'x')) - self.assertEqual (-1, vi_pos_find_char_forward (u'abc def', u'x')) - self.assertEqual (4, vi_pos_find_char_forward (u'abc def', u'd')) - self.assertEqual (4, vi_pos_find_char_forward (u'abc def', u'd', 3)) - self.assertEqual (-1, vi_pos_find_char_forward (u'abc def', u'd', 4)) - self.assertEqual (-1, vi_pos_find_char_forward (u'abc def', u'd', count=2)) - self.assertEqual (12, vi_pos_find_char_forward (u'abc def abc def', u'd', count=2)) + self.assertEqual (-1, vi_pos_find_char_forward ('', 'x')) + self.assertEqual (-1, vi_pos_find_char_forward ('abc def', 'x')) + self.assertEqual (4, vi_pos_find_char_forward ('abc def', 'd')) + self.assertEqual (4, vi_pos_find_char_forward ('abc def', 'd', 3)) + self.assertEqual (-1, vi_pos_find_char_forward ('abc def', 'd', 4)) + self.assertEqual (-1, vi_pos_find_char_forward ('abc def', 'd', count=2)) + self.assertEqual (12, vi_pos_find_char_forward ('abc def abc def', 'd', count=2)) def test_pos_find_char_backward (self): - self.assertEqual (-1, vi_pos_find_char_backward (u'', u'x')) - self.assertEqual (-1, vi_pos_find_char_backward (u'abc def', u'x', 6)) - self.assertEqual (4, vi_pos_find_char_backward (u'abc def', u'd', 6)) - self.assertEqual (4, vi_pos_find_char_backward (u'abc def', u'd', 5)) - self.assertEqual (-1, vi_pos_find_char_backward (u'abc def', u'd', 4)) - self.assertEqual (-1, vi_pos_find_char_backward (u'abc def', u'd', 6, count=2)) - self.assertEqual (4, vi_pos_find_char_backward (u'abc def abc def', u'd', 14, count=2)) + self.assertEqual (-1, vi_pos_find_char_backward ('', 'x')) + self.assertEqual (-1, vi_pos_find_char_backward ('abc def', 'x', 6)) + self.assertEqual (4, vi_pos_find_char_backward ('abc def', 'd', 6)) + self.assertEqual (4, vi_pos_find_char_backward ('abc def', 'd', 5)) + self.assertEqual (-1, vi_pos_find_char_backward ('abc def', 'd', 4)) + self.assertEqual (-1, vi_pos_find_char_backward ('abc def', 'd', 6, count=2)) + self.assertEqual (4, vi_pos_find_char_backward ('abc def abc def', 'd', 14, count=2)) def test_pos_to_char_forward (self): - self.assertEqual (-1, vi_pos_to_char_forward (u'', u'x')) - self.assertEqual (-1, vi_pos_to_char_forward (u'abc def', u'x')) - self.assertEqual (3, vi_pos_to_char_forward (u'abc def', u'd')) - self.assertEqual (3, vi_pos_to_char_forward (u'abc def', u'd', 2)) - self.assertEqual (-1, vi_pos_to_char_forward (u'abc def', u'd', 4)) - self.assertEqual (-1, vi_pos_to_char_forward (u'abc def', u'd', count=2)) - self.assertEqual (11, vi_pos_to_char_forward (u'abc def abc def', u'd', count=2)) + self.assertEqual (-1, vi_pos_to_char_forward ('', 'x')) + self.assertEqual (-1, vi_pos_to_char_forward ('abc def', 'x')) + self.assertEqual (3, vi_pos_to_char_forward ('abc def', 'd')) + self.assertEqual (3, vi_pos_to_char_forward ('abc def', 'd', 2)) + self.assertEqual (-1, vi_pos_to_char_forward ('abc def', 'd', 4)) + self.assertEqual (-1, vi_pos_to_char_forward ('abc def', 'd', count=2)) + self.assertEqual (11, vi_pos_to_char_forward ('abc def abc def', 'd', count=2)) def test_pos_to_char_backward (self): - self.assertEqual (-1, vi_pos_to_char_backward (u'', u'x')) - self.assertEqual (-1, vi_pos_to_char_backward (u'abc def', u'x', 6)) - self.assertEqual (5, vi_pos_to_char_backward (u'abc def', u'd', 6)) - self.assertEqual (5, vi_pos_to_char_backward (u'abc def', u'd', 5)) - self.assertEqual (-1, vi_pos_to_char_backward (u'abc def', u'd', 4)) - self.assertEqual (-1, vi_pos_to_char_backward (u'abc def', u'd', 6, count=2)) - self.assertEqual (5, vi_pos_to_char_backward (u'abc def abc def', u'd', 14, count=2)) + self.assertEqual (-1, vi_pos_to_char_backward ('', 'x')) + self.assertEqual (-1, vi_pos_to_char_backward ('abc def', 'x', 6)) + self.assertEqual (5, vi_pos_to_char_backward ('abc def', 'd', 6)) + self.assertEqual (5, vi_pos_to_char_backward ('abc def', 'd', 5)) + self.assertEqual (-1, vi_pos_to_char_backward ('abc def', 'd', 4)) + self.assertEqual (-1, vi_pos_to_char_backward ('abc def', 'd', 6, count=2)) + self.assertEqual (5, vi_pos_to_char_backward ('abc def abc def', 'd', 14, count=2)) def test_motion_word (self): - u'''motions: lowercase mode is alpha, digit and _, uppercase is delim by spaces + '''motions: lowercase mode is alpha, digit and _, uppercase is delim by spaces w/W: forward short/long word''' r = ViModeTest () - r._set_line (u'abc_123 def--456.789 x') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"w"') + r._set_line ('abc_123 def--456.789 x') + r.input ('Escape') + r.input ('"0"') + r.input ('"w"') self.assertEqual (9, r.line_cursor) - r.input (u'"w"') + r.input ('"w"') self.assertEqual (12, r.line_cursor) - r.input (u'"w"') + r.input ('"w"') self.assertEqual (14, r.line_cursor) - r.input (u'"W"') + r.input ('"W"') self.assertEqual (23, r.line_cursor) def test_motion_word_multiplier (self): r = ViModeTest () - r._set_line (u'a b c d e f g h i j k l m n o p q r s t u v w x y z') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"2"') + r._set_line ('a b c d e f g h i j k l m n o p q r s t u v w x y z') + r.input ('Escape') + r.input ('"0"') + r.input ('"2"') self.assertEqual (0, r.line_cursor) - r.input (u'"w"') + r.input ('"w"') self.assertEqual (4, r.line_cursor) - r.input (u'"2"') - r.input (u'"0"') - r.input (u'"w"') + r.input ('"2"') + r.input ('"0"') + r.input ('"w"') self.assertEqual (44, r.line_cursor) - r.input (u'"2"') - r.input (u'"W"') + r.input ('"2"') + r.input ('"W"') self.assertEqual (48, r.line_cursor) def test_motion_end (self): - u'''motions: lowercase mode is alpha, digit and _, uppercase is delim by spaces + '''motions: lowercase mode is alpha, digit and _, uppercase is delim by spaces e/E: to end of short/long word''' r = ViModeTest () - r._set_line (u' abc_123 --def--456.789 x') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"e"') + r._set_line (' abc_123 --def--456.789 x') + r.input ('Escape') + r.input ('"0"') + r.input ('"e"') self.assertEqual (8, r.line_cursor) - r.input (u'"e"') + r.input ('"e"') self.assertEqual (12, r.line_cursor) - r.input (u'"e"') + r.input ('"e"') self.assertEqual (15, r.line_cursor) - r.input (u'"E"') + r.input ('"E"') self.assertEqual (24, r.line_cursor) def test_motion_end_multiplier (self): r = ViModeTest () - r._set_line (u'ab cd ef gh ij kl mn op qr st uv wx yz') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"3"') - r.input (u'"e"') + r._set_line ('ab cd ef gh ij kl mn op qr st uv wx yz') + r.input ('Escape') + r.input ('"0"') + r.input ('"3"') + r.input ('"e"') self.assertEqual (7, r.line_cursor) - r.input (u'"4"') - r.input (u'"E"') + r.input ('"4"') + r.input ('"E"') self.assertEqual (19, r.line_cursor) def test_motion_backward (self): - u'''motions: lowercase mode is alpha, digit and _, uppercase is delim by spaces + '''motions: lowercase mode is alpha, digit and _, uppercase is delim by spaces b/B: backward short/long word''' r = ViModeTest () - r._set_line (u'abc_123 def--456.789 x') - r.input (u'Escape') - r.input (u'"$"') + r._set_line ('abc_123 def--456.789 x') + r.input ('Escape') + r.input ('"$"') self.assertEqual (23, r.line_cursor) - r.input (u'"b"') + r.input ('"b"') self.assertEqual (18, r.line_cursor) - r.input (u'"b"') + r.input ('"b"') self.assertEqual (17, r.line_cursor) - r.input (u'"B"') + r.input ('"B"') self.assertEqual (9, r.line_cursor) - r.input (u'"B"') + r.input ('"B"') self.assertEqual (0, r.line_cursor) def test_motion_backward_multiplier (self): r = ViModeTest () - r._set_line (u'ab cd ef gh ij kl mn op qr st uv wx yz') - r.input (u'Escape') - r.input (u'"$"') + r._set_line ('ab cd ef gh ij kl mn op qr st uv wx yz') + r.input ('Escape') + r.input ('"$"') self.assertEqual (37, r.line_cursor) - r.input (u'"3"') - r.input (u'"b"') + r.input ('"3"') + r.input ('"b"') self.assertEqual (30, r.line_cursor) - r.input (u'"5"') - r.input (u'"b"') + r.input ('"5"') + r.input ('"b"') self.assertEqual (15, r.line_cursor) def test_motion_find_char_forward (self): r = ViModeTest () - r._set_line (u'abc_123 def--456.789 x') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"f"') + r._set_line ('abc_123 def--456.789 x') + r.input ('Escape') + r.input ('"0"') + r.input ('"f"') self.assertEqual (0, r.line_cursor) - r.input (u'"c"') + r.input ('"c"') self.assertEqual (2, r.line_cursor) def test_motion_find_char_backward (self): r = ViModeTest () - r._set_line (u'abc_123 def--456.789 x') - r.input (u'Escape') - r.input (u'"$"') + r._set_line ('abc_123 def--456.789 x') + r.input ('Escape') + r.input ('"$"') self.assertEqual (23, r.line_cursor) - r.input (u'"F"') + r.input ('"F"') self.assertEqual (23, r.line_cursor) - r.input (u'"c"') + r.input ('"c"') self.assertEqual (2, r.line_cursor) def test_motion_find_char_forward_multiplier (self): r = ViModeTest () - r._set_line (u'ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"2"') - r.input (u'"f"') - r.input (u'"0"') + r._set_line ('ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') + r.input ('Escape') + r.input ('"0"') + r.input ('"2"') + r.input ('"f"') + r.input ('"0"') self.assertEqual (27, r.line_cursor) def test_motion_find_char_backward_multiplier (self): r = ViModeTest () - r._set_line (u'ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') - r.input (u'Escape') - r.input (u'"$"') + r._set_line ('ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') + r.input ('Escape') + r.input ('"$"') self.assertEqual (52, r.line_cursor) - r.input (u'"2"') - r.input (u'"F"') - r.input (u'"0"') + r.input ('"2"') + r.input ('"F"') + r.input ('"0"') self.assertEqual (27, r.line_cursor) def test_motion_find_char_again (self): r = ViModeTest () - r._set_line (u'1234512345123451234512345') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"2"') - r.input (u'"f"') - r.input (u'"3"') + r._set_line ('1234512345123451234512345') + r.input ('Escape') + r.input ('"0"') + r.input ('"2"') + r.input ('"f"') + r.input ('"3"') self.assertEqual (7, r.line_cursor) - r.input (u'";"') + r.input ('";"') self.assertEqual (12, r.line_cursor) - r.input (u'"2"') - r.input (u'";"') + r.input ('"2"') + r.input ('";"') self.assertEqual (22, r.line_cursor) - r.input (u'","') + r.input ('","') self.assertEqual (17, r.line_cursor) - r.input (u'"2"') - r.input (u'","') + r.input ('"2"') + r.input ('","') self.assertEqual (7, r.line_cursor) def test_motion_find_char_opposite (self): r = ViModeTest () - r._set_line (u'1234512345123451234512345') - r.input (u'Escape') - r.input (u'"$"') - r.input (u'"2"') - r.input (u'"F"') - r.input (u'"3"') + r._set_line ('1234512345123451234512345') + r.input ('Escape') + r.input ('"$"') + r.input ('"2"') + r.input ('"F"') + r.input ('"3"') self.assertEqual (17, r.line_cursor) - r.input (u'";"') + r.input ('";"') self.assertEqual (12, r.line_cursor) - r.input (u'"2"') - r.input (u'";"') + r.input ('"2"') + r.input ('";"') self.assertEqual (2, r.line_cursor) - r.input (u'","') + r.input ('","') self.assertEqual (7, r.line_cursor) - r.input (u'"2"') - r.input (u'","') + r.input ('"2"') + r.input ('","') self.assertEqual (17, r.line_cursor) - r.input (u'"2"') - r.input (u'","') + r.input ('"2"') + r.input ('","') self.assertEqual (17, r.line_cursor) def test_motion_to_char_forward (self): r = ViModeTest () - r._set_line (u'abc_123 def--456.789 x') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"t"') + r._set_line ('abc_123 def--456.789 x') + r.input ('Escape') + r.input ('"0"') + r.input ('"t"') self.assertEqual (0, r.line_cursor) - r.input (u'"c"') + r.input ('"c"') self.assertEqual (1, r.line_cursor) def test_motion_to_char_backward (self): r = ViModeTest () - r._set_line (u'abc_123 def--456.789 x') - r.input (u'Escape') - r.input (u'"$"') + r._set_line ('abc_123 def--456.789 x') + r.input ('Escape') + r.input ('"$"') self.assertEqual (23, r.line_cursor) - r.input (u'"T"') + r.input ('"T"') self.assertEqual (23, r.line_cursor) - r.input (u'"c"') + r.input ('"c"') self.assertEqual (3, r.line_cursor) def test_motion_to_char_forward_multiplier (self): r = ViModeTest () - r._set_line (u'ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"2"') - r.input (u'"t"') - r.input (u'"0"') + r._set_line ('ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') + r.input ('Escape') + r.input ('"0"') + r.input ('"2"') + r.input ('"t"') + r.input ('"0"') self.assertEqual (26, r.line_cursor) def test_motion_to_char_backward_multiplier (self): r = ViModeTest () - r._set_line (u'ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') - r.input (u'Escape') - r.input (u'"$"') + r._set_line ('ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') + r.input ('Escape') + r.input ('"$"') self.assertEqual (52, r.line_cursor) - r.input (u'"2"') - r.input (u'"T"') - r.input (u'"0"') + r.input ('"2"') + r.input ('"T"') + r.input ('"0"') self.assertEqual (28, r.line_cursor) def test_delete_word (self): r = ViModeTest () - r._set_line (u'abc de fghi jkl mnopq rst') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"d"') - r.input (u'"w"') + r._set_line ('abc de fghi jkl mnopq rst') + r.input ('Escape') + r.input ('"0"') + r.input ('"d"') + r.input ('"w"') self.assertEqual (0, r.line_cursor) - self.assertEqual (r.line, u'de fghi jkl mnopq rst') - r.input (u'"d"') - r.input (u'"2"') - r.input (u'"w"') + self.assertEqual (r.line, 'de fghi jkl mnopq rst') + r.input ('"d"') + r.input ('"2"') + r.input ('"w"') self.assertEqual (0, r.line_cursor) - self.assertEqual (r.line, u'jkl mnopq rst') - r.input (u'"2"') - r.input (u'"d"') - r.input (u'"w"') + self.assertEqual (r.line, 'jkl mnopq rst') + r.input ('"2"') + r.input ('"d"') + r.input ('"w"') self.assertEqual (0, r.line_cursor) - self.assertEqual (r.line, u'rst') + self.assertEqual (r.line, 'rst') def test_delete_word_two_multipliers (self): r = ViModeTest () - r._set_line (u'abc de fghi jkl mnopq rst uv wx yz') - r.input (u'Escape') - r.input (u'"0w"') - r.input (u'"2d3w"') + r._set_line ('abc de fghi jkl mnopq rst uv wx yz') + r.input ('Escape') + r.input ('"0w"') + r.input ('"2d3w"') self.assertEqual (4, r.line_cursor) - self.assertEqual (r.line, u'abc wx yz') + self.assertEqual (r.line, 'abc wx yz') def test_delete_find_char_forward_two_multipliers (self): r = ViModeTest () - r._set_line (u'0123456789012345678901234567890123456789012345678901234567890123456789') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"2d3f4"') - self.assertEqual (r.line, u'567890123456789') + r._set_line ('0123456789012345678901234567890123456789012345678901234567890123456789') + r.input ('Escape') + r.input ('"0"') + r.input ('"2d3f4"') + self.assertEqual (r.line, '567890123456789') def test_delete_end_of_line (self): r = ViModeTest () - r._set_line (u'abc de fghi jkl mnopq rst uv wx yz') - r.input (u'Escape') - r.input (u'"0w"') - r.input (u'"D"') - self.assertEqual (r.line, u'abc ') + r._set_line ('abc de fghi jkl mnopq rst uv wx yz') + r.input ('Escape') + r.input ('"0w"') + r.input ('"D"') + self.assertEqual (r.line, 'abc ') def test_two_lines (self): r = ViModeTest () - r.input (u'"abcdef"') - self.assertEqual (r.line, u'abcdef') - r.input (u'Escape') - r.input (u'"0iqq"') - self.assertEqual (r.line, u'qqabcdef') - r.input (u'Return') - self.assertEqual (r.line, u'') - r.input (u'"xyz"') - self.assertEqual (r.line, u'xyz') + r.input ('"abcdef"') + self.assertEqual (r.line, 'abcdef') + r.input ('Escape') + r.input ('"0iqq"') + self.assertEqual (r.line, 'qqabcdef') + r.input ('Return') + self.assertEqual (r.line, '') + r.input ('"xyz"') + self.assertEqual (r.line, 'xyz') def test_delete_word_short_to_end_of_line (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"03dw"') - self.assertEqual (u'', r.line) - r._set_line (u'abc def ghi ') - r.input (u'Escape') - r.input (u'"03dw"') - self.assertEqual (u'', r.line) + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"03dw"') + self.assertEqual ('', r.line) + r._set_line ('abc def ghi ') + r.input ('Escape') + r.input ('"03dw"') + self.assertEqual ('', r.line) def test_delete_word_long_to_end_of_line (self): r = ViModeTest () - r._set_line (u'a.c d.f g.i') - r.input (u'Escape') - r.input (u'"03dW"') - self.assertEqual (u'', r.line) - r._set_line (u'a.c d.f g.i ') - r.input (u'Escape') - r.input (u'"03dW"') - self.assertEqual (u'', r.line) + r._set_line ('a.c d.f g.i') + r.input ('Escape') + r.input ('"03dW"') + self.assertEqual ('', r.line) + r._set_line ('a.c d.f g.i ') + r.input ('Escape') + r.input ('"03dW"') + self.assertEqual ('', r.line) def test_delete_end_short_to_end_of_line (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"03de"') - self.assertEqual (u'', r.line) - r._set_line (u'abc def ghi ') - r.input (u'Escape') - r.input (u'"03de"') - self.assertEqual (u' ', r.line) + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"03de"') + self.assertEqual ('', r.line) + r._set_line ('abc def ghi ') + r.input ('Escape') + r.input ('"03de"') + self.assertEqual (' ', r.line) def test_delete_end_long_to_end_of_line (self): r = ViModeTest () - r._set_line (u'a.c d.f g.i') - r.input (u'Escape') - r.input (u'"03dE"') - self.assertEqual (u'', r.line) - r._set_line (u'a.c d.f g.i ') - r.input (u'Escape') - r.input (u'"03dE"') - self.assertEqual (u' ', r.line) + r._set_line ('a.c d.f g.i') + r.input ('Escape') + r.input ('"03dE"') + self.assertEqual ('', r.line) + r._set_line ('a.c d.f g.i ') + r.input ('Escape') + r.input ('"03dE"') + self.assertEqual (' ', r.line) def test_delete_back_short_to_begining_of_line (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"$3db"') - self.assertEqual (u'i', r.line) - r._set_line (u'abc def ghi ') - r.input (u'Escape') - r.input (u'"$3db"') - self.assertEqual (u' ', r.line) + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"$3db"') + self.assertEqual ('i', r.line) + r._set_line ('abc def ghi ') + r.input ('Escape') + r.input ('"$3db"') + self.assertEqual (' ', r.line) def test_delete_back_long_to_begining_of_line (self): r = ViModeTest () - r._set_line (u'a.c d.f g.i') - r.input (u'Escape') - r.input (u'"$3dB"') - self.assertEqual (u'i', r.line) - r._set_line (u'a.c d.f g.i ') - r.input (u'Escape') - r.input (u'"$3dB"') - self.assertEqual (u' ', r.line) + r._set_line ('a.c d.f g.i') + r.input ('Escape') + r.input ('"$3dB"') + self.assertEqual ('i', r.line) + r._set_line ('a.c d.f g.i ') + r.input ('Escape') + r.input ('"$3dB"') + self.assertEqual (' ', r.line) def test_delete_dollar (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"0ld$"') - self.assertEqual (r.line, u'a') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"0ld$"') + self.assertEqual (r.line, 'a') self.assertEqual (r.line_cursor, 0) def test_motion_left (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"$"') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"$"') self.assertEqual (10, r.line_cursor) - r.input (u'"h"') + r.input ('"h"') self.assertEqual (9, r.line_cursor) - r.input (u'"2h"') + r.input ('"2h"') self.assertEqual (7, r.line_cursor) - r.input (u'"2d3h"') + r.input ('"2d3h"') self.assertEqual (1, r.line_cursor) - self.assertEqual (u'a ghi', r.line) - r.input (u'"4dh"') + self.assertEqual ('a ghi', r.line) + r.input ('"4dh"') self.assertEqual (0, r.line_cursor) - self.assertEqual (u' ghi', r.line) + self.assertEqual (' ghi', r.line) def test_motion_right (self): r = ViModeTest () - r.input (u'Escape') - self.assertEqual (r.line, u'') + r.input ('Escape') + self.assertEqual (r.line, '') self.assertEqual (r.line_cursor, 0) - r.input (u'"a"') - self.assertEqual (r.line, u'') + r.input ('"a"') + self.assertEqual (r.line, '') self.assertEqual (r.line_cursor, 0) - r.input (u'"abc"') - self.assertEqual (r.line, u'abc') + r.input ('"abc"') + self.assertEqual (r.line, 'abc') self.assertEqual (r.line_cursor, 3) - r.input (u'Escape') - self.assertEqual (r.line, u'abc') + r.input ('Escape') + self.assertEqual (r.line, 'abc') self.assertEqual (r.line_cursor, 2) - r.input (u'"l"') - self.assertEqual (r.line, u'abc') + r.input ('"l"') + self.assertEqual (r.line, 'abc') self.assertEqual (r.line_cursor, 2) - r.input (u'Left') - self.assertEqual (r.line, u'abc') + r.input ('Left') + self.assertEqual (r.line, 'abc') self.assertEqual (r.line_cursor, 1) - r.input (u'"l"') - self.assertEqual (r.line, u'abc') + r.input ('"l"') + self.assertEqual (r.line, 'abc') self.assertEqual (r.line_cursor, 2) - r.input (u'"l"') - self.assertEqual (r.line, u'abc') + r.input ('"l"') + self.assertEqual (r.line, 'abc') self.assertEqual (r.line_cursor, 2) def test_motion_right_delete (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"0"') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"0"') self.assertEqual (0, r.line_cursor) - r.input (u'"l"') + r.input ('"l"') self.assertEqual (1, r.line_cursor) - r.input (u'"2l"') + r.input ('"2l"') self.assertEqual (3, r.line_cursor) - r.input (u'"2d3l"') + r.input ('"2d3l"') self.assertEqual (3, r.line_cursor) - self.assertEqual (u'abchi', r.line) - r.input (u'"4dl"') + self.assertEqual ('abchi', r.line) + r.input ('"4dl"') self.assertEqual (2, r.line_cursor) - self.assertEqual (u'abc', r.line) + self.assertEqual ('abc', r.line) def test_backspace_motion (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"$"') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"$"') self.assertEqual (10, r.line_cursor) - r.input (u'BackSpace') + r.input ('BackSpace') self.assertEqual (9, r.line_cursor) - r.input (u'"2"') - r.input (u'BackSpace') + r.input ('"2"') + r.input ('BackSpace') self.assertEqual (7, r.line_cursor) - r.input (u'"2d3"') - r.input (u'BackSpace') + r.input ('"2d3"') + r.input ('BackSpace') self.assertEqual (1, r.line_cursor) - self.assertEqual (u'a ghi', r.line) - r.input (u'"4d"') - r.input (u'BackSpace') + self.assertEqual ('a ghi', r.line) + r.input ('"4d"') + r.input ('BackSpace') self.assertEqual (0, r.line_cursor) - self.assertEqual (u' ghi', r.line) + self.assertEqual (' ghi', r.line) def test_backspace_insert (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"$"') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"$"') self.assertEqual (10, r.line_cursor) - r.input (u'"i"') + r.input ('"i"') self.assertEqual (10, r.line_cursor) - r.input (u'BackSpace') + r.input ('BackSpace') self.assertEqual (9, r.line_cursor) - self.assertEqual (u'abc def gi', r.line) + self.assertEqual ('abc def gi', r.line) def test_insert_lower_i (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"0w"') - r.input (u'"i"') - r.input (u'"zz"') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"0w"') + r.input ('"i"') + r.input ('"zz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, u'abc zzdef ghi') - r.input (u'Escape') - r.input (u'"w"') - r.input (u'"2iyy"') - r.input (u'Escape') - self.assertEqual (r.line, u'abc zzdef yyyyghi') + self.assertEqual (r.line, 'abc zzdef ghi') + r.input ('Escape') + r.input ('"w"') + r.input ('"2iyy"') + r.input ('Escape') + self.assertEqual (r.line, 'abc zzdef yyyyghi') def test_insert_upper_i (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"0w"') - r.input (u'"I"') - r.input (u'"zz"') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"0w"') + r.input ('"I"') + r.input ('"zz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, u'zzabc def ghi') - r.input (u'Escape') - r.input (u'"w"') - r.input (u'"2Iyy"') - r.input (u'Escape') - self.assertEqual (r.line, u'yyyyzzabc def ghi') + self.assertEqual (r.line, 'zzabc def ghi') + r.input ('Escape') + r.input ('"w"') + r.input ('"2Iyy"') + r.input ('Escape') + self.assertEqual (r.line, 'yyyyzzabc def ghi') def test_append_lower_a (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"a"') - r.input (u'"zz"') - self.assertEqual (r.line, u'azzbc def ghi') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"0"') + r.input ('"a"') + r.input ('"zz"') + self.assertEqual (r.line, 'azzbc def ghi') self.assert_ (r.vi_is_insert_mode) - r.input (u'Escape') - r.input (u'"w"') - r.input (u'"2ayy"') - r.input (u'Escape') - self.assertEqual (r.line, u'azzbc dyyyyef ghi') + r.input ('Escape') + r.input ('"w"') + r.input ('"2ayy"') + r.input ('Escape') + self.assertEqual (r.line, 'azzbc dyyyyef ghi') def test_append_upper_a_simple (self): r = ViModeTest () - r._set_line (u'') - r.input (u'Escape') - r.input (u'"2A"') - r.input (u'"jj"') - r.input (u'Escape') - self.assertEqual (r.line, u'jjjj') + r._set_line ('') + r.input ('Escape') + r.input ('"2A"') + r.input ('"jj"') + r.input ('Escape') + self.assertEqual (r.line, 'jjjj') self.assert_ (not r.vi_is_insert_mode) def test_append_upper_a (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"A"') - r.input (u'"zz"') - self.assertEqual (r.line, u'abc def ghizz') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"0"') + r.input ('"A"') + r.input ('"zz"') + self.assertEqual (r.line, 'abc def ghizz') self.assert_ (r.vi_is_insert_mode) - r.input (u'Escape') - r.input (u'"0w"') - r.input (u'"2Ayy"') - r.input (u'Escape') - self.assertEqual (r.line, u'abc def ghizzyyyy') + r.input ('Escape') + r.input ('"0w"') + r.input ('"2Ayy"') + r.input ('Escape') + self.assertEqual (r.line, 'abc def ghizzyyyy') def test_delete_lower_x (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"0w"') - r.input (u'"x"') - self.assertEqual (r.line, u'abc ef') - r.input (u'"4x"') - self.assertEqual (r.line, u'abc ') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"0w"') + r.input ('"x"') + self.assertEqual (r.line, 'abc ef') + r.input ('"4x"') + self.assertEqual (r.line, 'abc ') self.assertEqual (r.line_cursor, 3) - r.input (u'"x"') - self.assertEqual (r.line, u'abc') + r.input ('"x"') + self.assertEqual (r.line, 'abc') self.assertEqual (r.line_cursor, 2) - r.input (u'"x"') - self.assertEqual (r.line, u'ab') + r.input ('"x"') + self.assertEqual (r.line, 'ab') self.assertEqual (r.line_cursor, 1) - r.input (u'"x"') - self.assertEqual (r.line, u'a') + r.input ('"x"') + self.assertEqual (r.line, 'a') self.assertEqual (r.line_cursor, 0) - r.input (u'"x"') - self.assertEqual (r.line, u'') + r.input ('"x"') + self.assertEqual (r.line, '') self.assertEqual (r.line_cursor, 0) - r.input (u'"x"') - self.assertEqual (r.line, u'') + r.input ('"x"') + self.assertEqual (r.line, '') self.assertEqual (r.line_cursor, 0) def test_delete_upper_x (self): r = ViModeTest () - r._set_line (u'abc def') + r._set_line ('abc def') self.assertEqual (r.line_cursor, 7) - r.input (u'Escape') + r.input ('Escape') self.assertEqual (r.line_cursor, 6) - r.input (u'"$"') + r.input ('"$"') self.assertEqual (r.line_cursor, 6) - r.input (u'"X"') - self.assertEqual (r.line, u'abc df') + r.input ('"X"') + self.assertEqual (r.line, 'abc df') self.assertEqual (r.line_cursor, 5) - r.input (u'"4X"') - self.assertEqual (r.line, u'af') + r.input ('"4X"') + self.assertEqual (r.line, 'af') self.assertEqual (r.line_cursor, 1) - r.input (u'"2X"') - self.assertEqual (r.line, u'f') + r.input ('"2X"') + self.assertEqual (r.line, 'f') self.assertEqual (r.line_cursor, 0) - r.input (u'"X"') - self.assertEqual (r.line, u'f') + r.input ('"X"') + self.assertEqual (r.line, 'f') self.assertEqual (r.line_cursor, 0) def test_substitute_lower_s (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"s"') - r.input (u'"qq"') - r.input (u'Escape') - self.assertEqual (r.line, u'qqbc def') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"0"') + r.input ('"s"') + r.input ('"qq"') + r.input ('Escape') + self.assertEqual (r.line, 'qqbc def') self.assertEqual (r.line_cursor, 1) - r.input (u'"3s"') - r.input (u'"yyy"') - r.input (u'Escape') - self.assertEqual (r.line, u'qyyy def') + r.input ('"3s"') + r.input ('"yyy"') + r.input ('Escape') + self.assertEqual (r.line, 'qyyy def') self.assertEqual (r.line_cursor, 3) - r.input (u'"w"') - r.input (u'"5"') - r.input (u'"s"') - r.input (u'"zz"') - r.input (u'Escape') - self.assertEqual (r.line, u'qyyy zz') + r.input ('"w"') + r.input ('"5"') + r.input ('"s"') + r.input ('"zz"') + r.input ('Escape') + self.assertEqual (r.line, 'qyyy zz') self.assertEqual (r.line_cursor, 6) def test_change_to_end_of_line (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"0w"') - r.input (u'"C"') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"0w"') + r.input ('"C"') self.assert_ (r.vi_is_insert_mode) - r.input (u'"123"') - self.assertEqual (r.line, u'abc 123') - r.input (u'Escape') + r.input ('"123"') + self.assertEqual (r.line, 'abc 123') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) def test_change_whole_line (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"0w"') - r.input (u'"S"') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"0w"') + r.input ('"S"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, u'') - r.input (u'"123"') - self.assertEqual (r.line, u'123') - r.input (u'Escape') + self.assertEqual (r.line, '') + r.input ('"123"') + self.assertEqual (r.line, '123') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) def test_change_word_short (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"0cwzzz"') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"0cwzzz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, u'zzz def ghi') + self.assertEqual (r.line, 'zzz def ghi') self.assertEqual (r.line_cursor, 3) - r.input (u'Escape') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 2) - r.input (u'"w"') + r.input ('"w"') self.assertEqual (r.line_cursor, 4) - r.input (u'"2cwyyy"') - self.assertEqual (r.line, u'zzz yyy') - r.input (u'Escape') - self.assertEqual (r.line, u'zzz yyy') + r.input ('"2cwyyy"') + self.assertEqual (r.line, 'zzz yyy') + r.input ('Escape') + self.assertEqual (r.line, 'zzz yyy') def test_change_word_long (self): r = ViModeTest () - r._set_line (u'abc.def ghi.jkl mno.pqr') - r.input (u'Escape') - r.input (u'"0cWss"') - self.assertEqual (r.line, u'ss ghi.jkl mno.pqr') + r._set_line ('abc.def ghi.jkl mno.pqr') + r.input ('Escape') + r.input ('"0cWss"') + self.assertEqual (r.line, 'ss ghi.jkl mno.pqr') self.assert_ (r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 2) - r.input (u'Escape') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 1) - r.input (u'"w2."') - self.assertEqual (r.line, u'ss ss') + r.input ('"w2."') + self.assertEqual (r.line, 'ss ss') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 4) def test_change_end_short (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"0cezzz"') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"0cezzz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, u'zzz def ghi') + self.assertEqual (r.line, 'zzz def ghi') self.assertEqual (r.line_cursor, 3) - r.input (u'Escape') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 2) - r.input (u'"w2."') - self.assertEqual (r.line, u'zzz zzz') + r.input ('"w2."') + self.assertEqual (r.line, 'zzz zzz') def test_change_end_long (self): r = ViModeTest () - r._set_line (u'abc.def ghi jkl.mno pqr stu.vwx') - r.input (u'Escape') - r.input (u'"02cEzz"') + r._set_line ('abc.def ghi jkl.mno pqr stu.vwx') + r.input ('Escape') + r.input ('"02cEzz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, u'zz jkl.mno pqr stu.vwx') + self.assertEqual (r.line, 'zz jkl.mno pqr stu.vwx') self.assertEqual (r.line_cursor, 2) - r.input (u'Escape') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 1) - r.input (u'"w2."') - self.assertEqual (r.line, u'zz zz stu.vwx') + r.input ('"w2."') + self.assertEqual (r.line, 'zz zz stu.vwx') self.assertEqual (r.line_cursor, 5) def test_change_back_short (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"$cbzz"') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"$cbzz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, u'abc def zzi') + self.assertEqual (r.line, 'abc def zzi') self.assertEqual (r.line_cursor, 10) - r.input (u'Escape') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 9) - r.input (u'"b2."') - self.assertEqual (r.line, u'zzzzi') + r.input ('"b2."') + self.assertEqual (r.line, 'zzzzi') self.assertEqual (r.line_cursor, 2) def test_change_back_long (self): r = ViModeTest () - r._set_line (u'abc.def ghi jkl.mno pqr stu.vwx') - r.input (u'Escape') - r.input (u'"$2cBzz"') + r._set_line ('abc.def ghi jkl.mno pqr stu.vwx') + r.input ('Escape') + r.input ('"$2cBzz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, u'abc.def ghi jkl.mno zzx') + self.assertEqual (r.line, 'abc.def ghi jkl.mno zzx') self.assertEqual (r.line_cursor, 22) - r.input (u'Escape') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 21) - r.input (u'"5."') - self.assertEqual (r.line, u'zzzx') + r.input ('"5."') + self.assertEqual (r.line, 'zzzx') self.assertEqual (r.line_cursor, 2) self.assert_ (not r.vi_is_insert_mode) def test_change_find_lower (self): r = ViModeTest () - r._set_line (u'aa bb cc dd ee aa bb cc dd ee') - r.input (u'Escape') - r.input (u'"0cfbzz"') + r._set_line ('aa bb cc dd ee aa bb cc dd ee') + r.input ('Escape') + r.input ('"0cfbzz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, u'zzb cc dd ee aa bb cc dd ee') + self.assertEqual (r.line, 'zzb cc dd ee aa bb cc dd ee') self.assertEqual (r.line_cursor, 2) - r.input (u'Escape') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 1) - r.input (u'"c2fcyy"') - self.assertEqual (r.line, u'zyy dd ee aa bb cc dd ee') - r.input (u'Escape') - r.input (u'"."') - self.assertEqual (r.line, u'zyyy dd ee') + r.input ('"c2fcyy"') + self.assertEqual (r.line, 'zyy dd ee aa bb cc dd ee') + r.input ('Escape') + r.input ('"."') + self.assertEqual (r.line, 'zyyy dd ee') def test_change_find_upper (self): r = ViModeTest () - r._set_line (u'aa bb cc aa bb cc') - r.input (u'Escape') - r.input (u'"$2c2Fazz"') + r._set_line ('aa bb cc aa bb cc') + r.input ('Escape') + r.input ('"$2c2Fazz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, u'zzc') + self.assertEqual (r.line, 'zzc') self.assertEqual (r.line_cursor, 2) - r.input (u'Escape') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 1) - r.input (u'"."') - self.assertEqual (r.line, u'zzc') + r.input ('"."') + self.assertEqual (r.line, 'zzc') def test_change_to_lower (self): r = ViModeTest () - r._set_line (u'aa bb cc aa bb cc aa bb cc') - r.input (u'Escape') - r.input (u'"02c2ta"') + r._set_line ('aa bb cc aa bb cc aa bb cc') + r.input ('Escape') + r.input ('"02c2ta"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, u'aa bb cc') + self.assertEqual (r.line, 'aa bb cc') self.assertEqual (r.line_cursor, 0) - r.input (u'"zz "') - self.assertEqual (r.line, u'zz aa bb cc') + r.input ('"zz "') + self.assertEqual (r.line, 'zz aa bb cc') self.assertEqual (r.line_cursor, 3) - r.input (u'Escape') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 2) def test_change_to_upper (self): r = ViModeTest () - r._set_line (u'aa bb cc aa bb cc aa bb cc') - r.input (u'Escape') - r.input (u'"$2c2Ta"') + r._set_line ('aa bb cc aa bb cc aa bb cc') + r.input ('Escape') + r.input ('"$2c2Ta"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, u'aa bb cc ac') + self.assertEqual (r.line, 'aa bb cc ac') self.assertEqual (r.line_cursor, 10) - r.input (u'"zz"') - self.assertEqual (r.line, u'aa bb cc azzc') + r.input ('"zz"') + self.assertEqual (r.line, 'aa bb cc azzc') self.assertEqual (r.line_cursor, 12) - r.input (u'Escape') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 11) - r.input (u'"3."') - self.assertEqual (r.line, u'azzzc') + r.input ('"3."') + self.assertEqual (r.line, 'azzzc') # The following fails but it does not seem that important # self.assertEqual (r.line_cursor, 2) self.assert_ (not r.vi_is_insert_mode) def test_pos_matching (self): - self.assertEqual (6, vi_pos_matching (u'aa (bb)')) - self.assertEqual (6, vi_pos_matching (u'aa (bb)', 3)) - self.assertEqual (3, vi_pos_matching (u'aa (bb)', 6)) - self.assertEqual (11, vi_pos_matching (u'aa (bb (cc))')) - self.assertEqual (3, vi_pos_matching (u'aa (bb (cc))', 11)) - self.assertEqual (10, vi_pos_matching (u'aa (bb (cc))', 4)) - self.assertEqual (7, vi_pos_matching (u'aa (bb (cc))', 10)) - self.assertEqual (7, vi_pos_matching (u'aa (bb (cc))', 8)) - self.assertEqual (3, vi_pos_matching (u'aa (bb (cc) dd)', 12)) - self.assertEqual (3, vi_pos_matching (u'aa (bb (cc) dd)', 14)) - self.assertEqual (-1, vi_pos_matching (u'aa ((bb (cc) dd)', 3)) - self.assertEqual (-1, vi_pos_matching (u'aa (bb (cc) dd) ee)', 16)) - self.assertEqual (-1, vi_pos_matching (u'aa (bb (cc) dd) ee)', 18)) - self.assertEqual (6, vi_pos_matching (u'aa ')) - self.assertEqual (11, vi_pos_matching (u'aa >')) - self.assertEqual (10, vi_pos_matching (u'aa >', 4)) - self.assertEqual (6, vi_pos_matching (u'aa {bb}')) - self.assertEqual (11, vi_pos_matching (u'aa {bb {cc}}')) - self.assertEqual (10, vi_pos_matching (u'aa {bb {cc}}', 4)) - self.assertEqual (6, vi_pos_matching (u'aa [bb]')) - self.assertEqual (11, vi_pos_matching (u'aa [bb [cc]]')) - self.assertEqual (10, vi_pos_matching (u'aa [bb [cc]]', 4)) + self.assertEqual (6, vi_pos_matching ('aa (bb)')) + self.assertEqual (6, vi_pos_matching ('aa (bb)', 3)) + self.assertEqual (3, vi_pos_matching ('aa (bb)', 6)) + self.assertEqual (11, vi_pos_matching ('aa (bb (cc))')) + self.assertEqual (3, vi_pos_matching ('aa (bb (cc))', 11)) + self.assertEqual (10, vi_pos_matching ('aa (bb (cc))', 4)) + self.assertEqual (7, vi_pos_matching ('aa (bb (cc))', 10)) + self.assertEqual (7, vi_pos_matching ('aa (bb (cc))', 8)) + self.assertEqual (3, vi_pos_matching ('aa (bb (cc) dd)', 12)) + self.assertEqual (3, vi_pos_matching ('aa (bb (cc) dd)', 14)) + self.assertEqual (-1, vi_pos_matching ('aa ((bb (cc) dd)', 3)) + self.assertEqual (-1, vi_pos_matching ('aa (bb (cc) dd) ee)', 16)) + self.assertEqual (-1, vi_pos_matching ('aa (bb (cc) dd) ee)', 18)) + self.assertEqual (6, vi_pos_matching ('aa ')) + self.assertEqual (11, vi_pos_matching ('aa >')) + self.assertEqual (10, vi_pos_matching ('aa >', 4)) + self.assertEqual (6, vi_pos_matching ('aa {bb}')) + self.assertEqual (11, vi_pos_matching ('aa {bb {cc}}')) + self.assertEqual (10, vi_pos_matching ('aa {bb {cc}}', 4)) + self.assertEqual (6, vi_pos_matching ('aa [bb]')) + self.assertEqual (11, vi_pos_matching ('aa [bb [cc]]')) + self.assertEqual (10, vi_pos_matching ('aa [bb [cc]]', 4)) def test_matching_paren_forward (self): r = ViModeTest () - r._set_line (u'abc (def (ghi)) jkl') - r.input (u'Escape') - r.input (u'"0w"') - r.input (u'"d"') - r.input (u'"%"') - self.assertEqual (r.line, u'abc jkl') + r._set_line ('abc (def (ghi)) jkl') + r.input ('Escape') + r.input ('"0w"') + r.input ('"d"') + r.input ('"%"') + self.assertEqual (r.line, 'abc jkl') self.assertEqual (r.line_cursor, 4) def test_matching_paren_backward (self): r = ViModeTest () - r._set_line (u'abc (def (ghi)) jkl') - r.input (u'Escape') - r.input (u'"0w"') - r.input (u'"%"') + r._set_line ('abc (def (ghi)) jkl') + r.input ('Escape') + r.input ('"0w"') + r.input ('"%"') self.assertEqual (r.line_cursor, 14) - r.input (u'"d"') - r.input (u'"%"') - self.assertEqual (r.line, u'abc jkl') + r.input ('"d"') + r.input ('"%"') + self.assertEqual (r.line, 'abc jkl') self.assertEqual (r.line_cursor, 4) def test_yank_and_put (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"0"') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"0"') self.assert_ (not r.vi_is_insert_mode) - r.input (u'"yw"') + r.input ('"yw"') self.assert_ (not r.vi_is_insert_mode) - self.assertEqual (r.line, u'abc def') + self.assertEqual (r.line, 'abc def') self.assertEqual (r.line_cursor, 0) - r.input (u'"P"') - self.assertEqual (r.line, u'abc abc def') + r.input ('"P"') + self.assertEqual (r.line, 'abc abc def') self.assertEqual (r.line_cursor, 3) - r.input (u'"p"') - self.assertEqual (r.line, u'abc abc abc def') + r.input ('"p"') + self.assertEqual (r.line, 'abc abc abc def') self.assertEqual (r.line_cursor, 7) def test_put_multiple (self): r = ViModeTest () - r._set_line (u'001122') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"y3l"') + r._set_line ('001122') + r.input ('Escape') + r.input ('"0"') + r.input ('"y3l"') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 0) - r.input (u'"2P"') - self.assertEqual (r.line, u'001001001122') + r.input ('"2P"') + self.assertEqual (r.line, '001001001122') self.assertEqual (r.line_cursor, 5) - r.input (u'"f2"') - r.input (u'"3p"') - self.assertEqual (r.line, u'001001001120010010012') + r.input ('"f2"') + r.input ('"3p"') + self.assertEqual (r.line, '001001001120010010012') self.assertEqual (r.line_cursor, 19) def test_put_undo (self): r = ViModeTest () - r._set_line (u'aaa b ccc') - r.input (u'Escape') - r.input (u'"0ywwp"') - self.assertEqual (r.line, u'aaa baaa ccc') - r.input (u'"u"') - self.assertEqual (r.line, u'aaa b ccc') - r.input (u'"P"') - self.assertEqual (r.line, u'aaa aaa b ccc') - r.input (u'"u"') - self.assertEqual (r.line, u'aaa b ccc') + r._set_line ('aaa b ccc') + r.input ('Escape') + r.input ('"0ywwp"') + self.assertEqual (r.line, 'aaa baaa ccc') + r.input ('"u"') + self.assertEqual (r.line, 'aaa b ccc') + r.input ('"P"') + self.assertEqual (r.line, 'aaa aaa b ccc') + r.input ('"u"') + self.assertEqual (r.line, 'aaa b ccc') def test_x_and_p (self): r = ViModeTest () - r._set_line (u'abc') - r.input (u'Escape') - r.input (u'"0xp"') - self.assertEqual (r.line, u'bac') + r._set_line ('abc') + r.input ('Escape') + r.input ('"0xp"') + self.assertEqual (r.line, 'bac') def test_delete_and_put (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"0dwep"') - self.assertEqual (r.line, u'defabc ') - r.input (u'"0xp"') - self.assertEqual (r.line, u'edfabc ') - r.input (u'"p"') - self.assertEqual (r.line, u'eddfabc ') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"0dwep"') + self.assertEqual (r.line, 'defabc ') + r.input ('"0xp"') + self.assertEqual (r.line, 'edfabc ') + r.input ('"p"') + self.assertEqual (r.line, 'eddfabc ') def test_dot_simple (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"0x"') - self.assertEqual (r.line, u'bc def') - r.input (u'"."') - self.assertEqual (r.line, u'c def') - r.input (u'"3."') - self.assertEqual (r.line, u'ef') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"0x"') + self.assertEqual (r.line, 'bc def') + r.input ('"."') + self.assertEqual (r.line, 'c def') + r.input ('"3."') + self.assertEqual (r.line, 'ef') def test_dot_movement_not_repeated_one (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"0x"') - self.assertEqual (r.line, u'bc def') - r.input (u'"$."') - self.assertEqual (r.line, u'bc de') - r.input (u'"0."') - self.assertEqual (r.line, u'c de') - r.input (u'"$."') - self.assertEqual (r.line, u'c d') - r.input (u'"^."') - self.assertEqual (r.line, u' d') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"0x"') + self.assertEqual (r.line, 'bc def') + r.input ('"$."') + self.assertEqual (r.line, 'bc de') + r.input ('"0."') + self.assertEqual (r.line, 'c de') + r.input ('"$."') + self.assertEqual (r.line, 'c d') + r.input ('"^."') + self.assertEqual (r.line, ' d') def test_dot_movement_not_repeated_two (self): r = ViModeTest () - r._set_line (u'abc def ghi jkl mno pqr') - r.input (u'Escape') - r.input (u'"0x"') - self.assertEqual (r.line, u'bc def ghi jkl mno pqr') - r.input (u'"w."') - self.assertEqual (r.line, u'bc ef ghi jkl mno pqr') - r.input (u'"fg."') - self.assertEqual (r.line, u'bc ef hi jkl mno pqr') - r.input (u'"2b."') - self.assertEqual (r.line, u'c ef hi jkl mno pqr') - r.input (u'"3e."') - self.assertEqual (r.line, u'c ef hi jk mno pqr') - r.input (u'"Fh."') - self.assertEqual (r.line, u'c ef i jk mno pqr') - r.input (u'"tn."') - self.assertEqual (r.line, u'c ef i jk no pqr') - r.input (u'"3h."') - self.assertEqual (r.line, u'c ef i k no pqr') - r.input (u'"5l."') - self.assertEqual (r.line, u'c ef i k no qr') + r._set_line ('abc def ghi jkl mno pqr') + r.input ('Escape') + r.input ('"0x"') + self.assertEqual (r.line, 'bc def ghi jkl mno pqr') + r.input ('"w."') + self.assertEqual (r.line, 'bc ef ghi jkl mno pqr') + r.input ('"fg."') + self.assertEqual (r.line, 'bc ef hi jkl mno pqr') + r.input ('"2b."') + self.assertEqual (r.line, 'c ef hi jkl mno pqr') + r.input ('"3e."') + self.assertEqual (r.line, 'c ef hi jk mno pqr') + r.input ('"Fh."') + self.assertEqual (r.line, 'c ef i jk mno pqr') + r.input ('"tn."') + self.assertEqual (r.line, 'c ef i jk no pqr') + r.input ('"3h."') + self.assertEqual (r.line, 'c ef i k no pqr') + r.input ('"5l."') + self.assertEqual (r.line, 'c ef i k no qr') def test_dot_insert (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"0"') - r.input (u'"2izz "') - r.input (u'Escape') - self.assertEqual (r.line, u'zz zz abc def') - r.input (u'"2w."') - self.assertEqual (r.line, u'zz zz abc zz zz def') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"0"') + r.input ('"2izz "') + r.input ('Escape') + self.assertEqual (r.line, 'zz zz abc def') + r.input ('"2w."') + self.assertEqual (r.line, 'zz zz abc zz zz def') def test_dot_delete_word (self): r = ViModeTest () - r._set_line (u'0 1 2 3 4 5 6 7 8 9') - r.input (u'Escape') - r.input (u'"02dw"') - self.assertEqual (r.line, u'2 3 4 5 6 7 8 9') - r.input (u'"."') - self.assertEqual (r.line, u'4 5 6 7 8 9') - r.input (u'"1."') - self.assertEqual (r.line, u'5 6 7 8 9') + r._set_line ('0 1 2 3 4 5 6 7 8 9') + r.input ('Escape') + r.input ('"02dw"') + self.assertEqual (r.line, '2 3 4 5 6 7 8 9') + r.input ('"."') + self.assertEqual (r.line, '4 5 6 7 8 9') + r.input ('"1."') + self.assertEqual (r.line, '5 6 7 8 9') def test_dot_override_multiplier (self): r = ViModeTest () - r._set_line (u'ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab') - r.input (u'Escape') - r.input (u'"02d2fb"') - self.assertEqual (r.line, u' ab ab ab ab ab ab ab ab ab ab ab ab') - r.input (u'"."') - self.assertEqual (r.line, u' ab ab ab ab ab ab ab ab') - r.input (u'"3."') - self.assertEqual (r.line, u' ab ab ab ab ab') - r.input (u'"."') - self.assertEqual (r.line, u' ab ab') + r._set_line ('ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab') + r.input ('Escape') + r.input ('"02d2fb"') + self.assertEqual (r.line, ' ab ab ab ab ab ab ab ab ab ab ab ab') + r.input ('"."') + self.assertEqual (r.line, ' ab ab ab ab ab ab ab ab') + r.input ('"3."') + self.assertEqual (r.line, ' ab ab ab ab ab') + r.input ('"."') + self.assertEqual (r.line, ' ab ab') def test_dot_yank_and_put (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"0ywP"') - self.assertEqual (r.line, u'abc abc def') - r.input (u'"."') - self.assertEqual (r.line, u'abcabc abc def') - r.input (u'"p"') - self.assertEqual (r.line, u'abcabc abc abc def') - r.input (u'"2."') - self.assertEqual (r.line, u'abcabc abc abc abc abc def') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"0ywP"') + self.assertEqual (r.line, 'abc abc def') + r.input ('"."') + self.assertEqual (r.line, 'abcabc abc def') + r.input ('"p"') + self.assertEqual (r.line, 'abcabc abc abc def') + r.input ('"2."') + self.assertEqual (r.line, 'abcabc abc abc abc abc def') def test_dot_insert_begin (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"Izz "') - r.input (u'Escape') - self.assertEqual (r.line, u'zz abc def') - r.input (u'"."') - self.assertEqual (r.line, u'zz zz abc def') - r.input (u'"2."') - self.assertEqual (r.line, u'zz zz zz zz abc def') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"Izz "') + r.input ('Escape') + self.assertEqual (r.line, 'zz abc def') + r.input ('"."') + self.assertEqual (r.line, 'zz zz abc def') + r.input ('"2."') + self.assertEqual (r.line, 'zz zz zz zz abc def') def test_dot_append_end (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"A yy"') - r.input (u'Escape') - self.assertEqual (r.line, u'abc def yy') - r.input (u'"."') - self.assertEqual (r.line, u'abc def yy yy') - r.input (u'"2."') - self.assertEqual (r.line, u'abc def yy yy yy yy') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"A yy"') + r.input ('Escape') + self.assertEqual (r.line, 'abc def yy') + r.input ('"."') + self.assertEqual (r.line, 'abc def yy yy') + r.input ('"2."') + self.assertEqual (r.line, 'abc def yy yy yy yy') def test_dot_insert_lower (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"b2izz "') - r.input (u'Escape') - self.assertEqual (r.line, u'abc zz zz def') - r.input (u'"3."') - self.assertEqual (r.line, u'abc zz zzzz zz zz def') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"b2izz "') + r.input ('Escape') + self.assertEqual (r.line, 'abc zz zz def') + r.input ('"3."') + self.assertEqual (r.line, 'abc zz zzzz zz zz def') def test_dot_append_lower (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"0e2a zz"') - r.input (u'Escape') - self.assertEqual (r.line, u'abc zz zz def') - r.input (u'"1."') - self.assertEqual (r.line, u'abc zz zz zz def') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"0e2a zz"') + r.input ('Escape') + self.assertEqual (r.line, 'abc zz zz def') + r.input ('"1."') + self.assertEqual (r.line, 'abc zz zz zz def') def test_dot_substitute_lower (self): r = ViModeTest () - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"03sqq"') - r.input (u'Escape') - self.assertEqual (r.line, u'qq def') - r.input (u'"2."') - self.assertEqual (r.line, u'qqqdef') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"03sqq"') + r.input ('Escape') + self.assertEqual (r.line, 'qq def') + r.input ('"2."') + self.assertEqual (r.line, 'qqqdef') def test_undo (self): r = ViModeTest () - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"0wdw"') - self.assertEqual (r.line, u'abc ghi') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"0wdw"') + self.assertEqual (r.line, 'abc ghi') self.assertEqual (r.line_cursor, 4) - r.input (u'"u"') - self.assertEqual (r.line, u'abc def ghi') + r.input ('"u"') + self.assertEqual (r.line, 'abc def ghi') self.assertEqual (r.line_cursor, 4) def test_undo_line (self): r = ViModeTest () - r._set_line (u'') - r.input (u'"abc def ghi"') - r.input (u'Escape') - r.input (u'"0dwdw"') - self.assertEqual (r.line, u'ghi') - r.input (u'"U"') - self.assertEqual (r.line, u'') + r._set_line ('') + r.input ('"abc def ghi"') + r.input ('Escape') + r.input ('"0dwdw"') + self.assertEqual (r.line, 'ghi') + r.input ('"U"') + self.assertEqual (r.line, '') def test_undo_line_with_history (self): r = ViModeTest () - r.add_history (u'abc 123') - r._set_line (u'') - r.input (u'"abc def ghi"') - r.input (u'Escape') - r.input (u'"0dwdw"') - self.assertEqual (r.line, u'ghi') - r.input (u'"U"') - self.assertEqual (r.line, u'') + r.add_history ('abc 123') + r._set_line ('') + r.input ('"abc def ghi"') + r.input ('Escape') + r.input ('"0dwdw"') + self.assertEqual (r.line, 'ghi') + r.input ('"U"') + self.assertEqual (r.line, '') def test_history_no_match (self): r = ViModeTest () - r.add_history (u'abc 123') - r.add_history (u'def 456') - r.add_history (u'ghi 789') - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"/"') - self.assertEqual (r.line, u'/') + r.add_history ('abc 123') + r.add_history ('def 456') + r.add_history ('ghi 789') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"/"') + self.assertEqual (r.line, '/') self.assertEqual (r.line_cursor, 1) - r.input (u'"zz"') - self.assertEqual (r.line, u'/zz') + r.input ('"zz"') + self.assertEqual (r.line, '/zz') self.assertEqual (r.line_cursor, 3) self.assertEqual (r.console.bell_count, 0) - r.input (u'Return') + r.input ('Return') # TODO should bell be rung here? # self.assertEqual (r.console.bell_count, 1) - self.assertEqual (r.line, u'abc def ghi') + self.assertEqual (r.line, 'abc def ghi') self.assertEqual (r.line_cursor, 10) def test_history_found_match (self): r = ViModeTest () - r.add_history (u'abc 123') - r.add_history (u'def 456') - r.add_history (u'ghi 789') - r._set_line (u'abc def ghi') - r.input (u'Escape') - r.input (u'"/"') - self.assertEqual (r.line, u'/') + r.add_history ('abc 123') + r.add_history ('def 456') + r.add_history ('ghi 789') + r._set_line ('abc def ghi') + r.input ('Escape') + r.input ('"/"') + self.assertEqual (r.line, '/') self.assertEqual (r.line_cursor, 1) - r.input (u'"de"') - self.assertEqual (r.line, u'/de') + r.input ('"de"') + self.assertEqual (r.line, '/de') self.assertEqual (r.line_cursor, 3) - r.input (u'Return') - self.assertEqual (r.line, u'def 456') + r.input ('Return') + self.assertEqual (r.line, 'def 456') self.assertEqual (r.line_cursor, 0) def test_history_multi_match (self): r = ViModeTest () - r.add_history (u'xyz 123') - r.add_history (u'xyz 456') - r.add_history (u'xyz 789') - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"/xyz"') - r.input (u'Return') - self.assertEqual (r.line, u'xyz 789') - r.input (u'"n"') - self.assertEqual (r.line, u'xyz 456') - r.input (u'"n"') - self.assertEqual (r.line, u'xyz 123') + r.add_history ('xyz 123') + r.add_history ('xyz 456') + r.add_history ('xyz 789') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"/xyz"') + r.input ('Return') + self.assertEqual (r.line, 'xyz 789') + r.input ('"n"') + self.assertEqual (r.line, 'xyz 456') + r.input ('"n"') + self.assertEqual (r.line, 'xyz 123') self.assertEqual (r.console.bell_count, 0) - r.input (u'"n"') + r.input ('"n"') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 1) - self.assertEqual (r.line, u'xyz 123') - r.input (u'"N"') - self.assertEqual (r.line, u'xyz 456') - r.input (u'"N"') - self.assertEqual (r.line, u'xyz 789') + self.assertEqual (r.line, 'xyz 123') + r.input ('"N"') + self.assertEqual (r.line, 'xyz 456') + r.input ('"N"') + self.assertEqual (r.line, 'xyz 789') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 1) - r.input (u'"N"') + r.input ('"N"') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 2) - self.assertEqual (r.line, u'xyz 789') + self.assertEqual (r.line, 'xyz 789') def test_history_search_empty_string (self): r = ViModeTest () - r.add_history (u'xyz 123') - r.add_history (u'xyz 456') - r.add_history (u'xyz 789') - r.input (u'Escape') - r.input (u'"/"') - r.input (u'Return') - self.assertEqual (r.line, u'') + r.add_history ('xyz 123') + r.add_history ('xyz 456') + r.add_history ('xyz 789') + r.input ('Escape') + r.input ('"/"') + r.input ('Return') + self.assertEqual (r.line, '') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 1) - r.input (u'"/"') - r.input (u'Return') - self.assertEqual (r.line, u'') + r.input ('"/"') + r.input ('Return') + self.assertEqual (r.line, '') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 2) - r.input (u'"/x"') - r.input (u'Return') - self.assertEqual (r.line, u'xyz 789') - r.input (u'"/"') - r.input (u'Return') - self.assertEqual (r.line, u'xyz 456') + r.input ('"/x"') + r.input ('Return') + self.assertEqual (r.line, 'xyz 789') + r.input ('"/"') + r.input ('Return') + self.assertEqual (r.line, 'xyz 456') def test_history_search_again_after_return (self): r = ViModeTest () - r.add_history (u'xyz 123') - r.add_history (u'xyz 456') - r.add_history (u'xyz 789') - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"/xyz"') - r.input (u'Return') - self.assertEqual (r.line, u'xyz 789') - r.input (u'"n"') - self.assertEqual (r.line, u'xyz 456') - r.input (u'Return') - self.assertEqual (r.line, u'') - r.input (u'Escape') - r.input (u'"n"') - self.assertEqual (r.line, u'xyz 123') - r.input (u'Return') - r.input (u'Escape') - r.input (u'"N"') - self.assertEqual (r.line, u'xyz 456') + r.add_history ('xyz 123') + r.add_history ('xyz 456') + r.add_history ('xyz 789') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"/xyz"') + r.input ('Return') + self.assertEqual (r.line, 'xyz 789') + r.input ('"n"') + self.assertEqual (r.line, 'xyz 456') + r.input ('Return') + self.assertEqual (r.line, '') + r.input ('Escape') + r.input ('"n"') + self.assertEqual (r.line, 'xyz 123') + r.input ('Return') + r.input ('Escape') + r.input ('"N"') + self.assertEqual (r.line, 'xyz 456') def test_history_search_again_after_search_failed (self): r = ViModeTest () - r.add_history (u'xyz 123') - r.add_history (u'xyz 456') - r.add_history (u'xyz 789') - r._set_line (u'abc def') - r.input (u'Escape') - r.input (u'"/xyz"') - r.input (u'Return') - self.assertEqual (r.line, u'xyz 789') - r.input (u'"C"') - self.assertEqual (r.line, u'') - r.input (u'Escape') + r.add_history ('xyz 123') + r.add_history ('xyz 456') + r.add_history ('xyz 789') + r._set_line ('abc def') + r.input ('Escape') + r.input ('"/xyz"') + r.input ('Return') + self.assertEqual (r.line, 'xyz 789') + r.input ('"C"') + self.assertEqual (r.line, '') + r.input ('Escape') self.assertEqual (r.console.bell_count, 0) - r.input (u'"/abc"') - r.input (u'Return') + r.input ('"/abc"') + r.input ('Return') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 1) - self.assertEqual (r.line, u'') - r.input (u'Escape') - r.input (u'"n"') - self.assertEqual (r.line, u'') + self.assertEqual (r.line, '') + r.input ('Escape') + r.input ('"n"') + self.assertEqual (r.line, '') def test_history_search_and_backspace (self): r = ViModeTest () - r.add_history (u'aaa') - r.add_history (u'bbb') - r._set_line (u'') - r.input (u'Escape') - r.input (u'"/aaz"') - self.assertEqual (r.line, u'/aaz') - r.input (u'BackSpace') - self.assertEqual (r.line, u'/aa') - r.input (u'Return') - self.assertEqual (r.line, u'aaa') - r.input (u'Escape') - r.input (u'"/z"') - r.input (u'BackSpace') - r.input (u'BackSpace') - self.assertEqual (r.line, u'') - r.input (u'"j"') - self.assertEqual (r.line, u'bbb') - r.input (u'"k"') - self.assertEqual (r.line, u'aaa') + r.add_history ('aaa') + r.add_history ('bbb') + r._set_line ('') + r.input ('Escape') + r.input ('"/aaz"') + self.assertEqual (r.line, '/aaz') + r.input ('BackSpace') + self.assertEqual (r.line, '/aa') + r.input ('Return') + self.assertEqual (r.line, 'aaa') + r.input ('Escape') + r.input ('"/z"') + r.input ('BackSpace') + r.input ('BackSpace') + self.assertEqual (r.line, '') + r.input ('"j"') + self.assertEqual (r.line, 'bbb') + r.input ('"k"') + self.assertEqual (r.line, 'aaa') def test_history_insert_mode (self): r = ViModeTest () - r.add_history (u'aaa') - r.add_history (u'bbb') - r.add_history (u'ccc') - r.input (u'Up') - self.assertEqual (r.line, u'ccc') + r.add_history ('aaa') + r.add_history ('bbb') + r.add_history ('ccc') + r.input ('Up') + self.assertEqual (r.line, 'ccc') self.assert_ (r.vi_is_insert_mode) - r.input (u'"z"') - self.assertEqual (r.line, u'cccz') - r.input (u'Escape') + r.input ('"z"') + self.assertEqual (r.line, 'cccz') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) - r.input (u'Up') - self.assertEqual (r.line, u'bbb') + r.input ('Up') + self.assertEqual (r.line, 'bbb') self.assert_ (r.vi_is_insert_mode) - r.input (u'"z"') - self.assertEqual (r.line, u'bbbz') - r.input (u'Escape') - r.input (u'"k"') - self.assertEqual (r.line, u'aaa') + r.input ('"z"') + self.assertEqual (r.line, 'bbbz') + r.input ('Escape') + r.input ('"k"') + self.assertEqual (r.line, 'aaa') self.assert_ (not r.vi_is_insert_mode) - r.input (u'"iz"') - self.assertEqual (r.line, u'zaaa') - r.input (u'Down') - self.assertEqual (r.line, u'bbb') + r.input ('"iz"') + self.assertEqual (r.line, 'zaaa') + r.input ('Down') + self.assertEqual (r.line, 'bbb') self.assert_ (r.vi_is_insert_mode) - r.input (u'"y"') - self.assertEqual (r.line, u'bbby') - r.input (u'Escape') - r.input (u'"j"') - self.assertEqual (r.line, u'ccc') + r.input ('"y"') + self.assertEqual (r.line, 'bbby') + r.input ('Escape') + r.input ('"j"') + self.assertEqual (r.line, 'ccc') self.assert_ (not r.vi_is_insert_mode) - r.input (u'"iy"') - self.assertEqual (r.line, u'yccc') + r.input ('"iy"') + self.assertEqual (r.line, 'yccc') self.assert_ (r.vi_is_insert_mode) def test_history_cursor_arrow (self): r = ViModeTest () self.assertEqual (r._history.history_cursor, 0) - r.add_history (u'aaa') + r.add_history ('aaa') self.assertEqual (r._history.history_cursor, 1) - r.add_history (u'bbb') + r.add_history ('bbb') self.assertEqual (r._history.history_cursor, 2) - self.assertEqual (r.line, u'') - r.input (u'Up') + self.assertEqual (r.line, '') + r.input ('Up') self.assertEqual (r._history.history_cursor, 1) - self.assertEqual (r.line, u'bbb') - r.input (u'Up') + self.assertEqual (r.line, 'bbb') + r.input ('Up') self.assertEqual (r._history.history_cursor, 0) - self.assertEqual (r.line, u'aaa') - r.input (u'Down') + self.assertEqual (r.line, 'aaa') + r.input ('Down') self.assertEqual (r._history.history_cursor, 1) - self.assertEqual (r.line, u'bbb') - r.input (u'Down') + self.assertEqual (r.line, 'bbb') + r.input ('Down') self.assertEqual (r._history.history_cursor, 2) - self.assertEqual (r.line, u'') - r.input (u'Up') + self.assertEqual (r.line, '') + r.input ('Up') self.assertEqual (r._history.history_cursor, 1) - self.assertEqual (r.line, u'bbb') + self.assertEqual (r.line, 'bbb') def test_history_control_n_and_p (self): r = ViModeTest () - r.add_history (u'aa') - r.add_history (u'bbb') - self.assertEqual (r.line, u'') - r.input (u'Control-p') - self.assertEqual (r.line, u'bbb') + r.add_history ('aa') + r.add_history ('bbb') + self.assertEqual (r.line, '') + r.input ('Control-p') + self.assertEqual (r.line, 'bbb') self.assertEqual (r.line_cursor, 3) self.assert_ (r.vi_is_insert_mode) - r.input (u'Control-p') - self.assertEqual (r.line, u'aa') + r.input ('Control-p') + self.assertEqual (r.line, 'aa') self.assertEqual (r.line_cursor, 2) self.assert_ (r.vi_is_insert_mode) - r.input (u'Control-n') - self.assertEqual (r.line, u'bbb') + r.input ('Control-n') + self.assertEqual (r.line, 'bbb') self.assertEqual (r.line_cursor, 3) self.assert_ (r.vi_is_insert_mode) - r.input (u'Control-n') - self.assertEqual (r.line, u'') + r.input ('Control-n') + self.assertEqual (r.line, '') self.assertEqual (r.line_cursor, 0) self.assert_ (r.vi_is_insert_mode) - r.input (u'Control-p') - self.assertEqual (r.line, u'bbb') + r.input ('Control-p') + self.assertEqual (r.line, 'bbb') self.assertEqual (r.line_cursor, 3) self.assert_ (r.vi_is_insert_mode) - r.input (u'Escape') - self.assertEqual (r.line, u'bbb') + r.input ('Escape') + self.assertEqual (r.line, 'bbb') self.assertEqual (r.line_cursor, 2) self.assert_ (not r.vi_is_insert_mode) - r.input (u'Control-p') - self.assertEqual (r.line, u'aa') + r.input ('Control-p') + self.assertEqual (r.line, 'aa') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) - r.input (u'Control-n') - self.assertEqual (r.line, u'bbb') + r.input ('Control-n') + self.assertEqual (r.line, 'bbb') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) - r.input (u'Control-n') - self.assertEqual (r.line, u'') + r.input ('Control-n') + self.assertEqual (r.line, '') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) - r.input (u'"/a"') - r.input (u'Return') - self.assertEqual (r.line, u'aa') + r.input ('"/a"') + r.input ('Return') + self.assertEqual (r.line, 'aa') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) - r.input (u'Control-n') - self.assertEqual (r.line, u'bbb') + r.input ('Control-n') + self.assertEqual (r.line, 'bbb') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) def test_history_cursor_j_and_k (self): r = ViModeTest () - r.add_history (u'aaa') - r.input (u'Escape') - r.input (u'"kiz"') - self.assertEqual (r.line, u'zaaa') - r.input (u'Escape') - r.input (u'"j"') - self.assertEqual (r.line, u'') + r.add_history ('aaa') + r.input ('Escape') + r.input ('"kiz"') + self.assertEqual (r.line, 'zaaa') + r.input ('Escape') + r.input ('"j"') + self.assertEqual (r.line, '') def test_history_input_j_and_k (self): r = ViModeTest () - r.add_history (u'aaa') - r.input (u'Escape') - r.input (u'"kAjk"') - self.assertEqual (r.line, u'aaajk') + r.add_history ('aaa') + r.input ('Escape') + r.input ('"kAjk"') + self.assertEqual (r.line, 'aaajk') def test_history_cursor_search (self): r = ViModeTest () - r.add_history (u'aaa') - r.input (u'Escape') - r.input (u'"/a"') - r.input (u'Return') - self.assertEqual (r.line, u'aaa') - r.input (u'"iz"') - self.assertEqual (r.line, u'zaaa') + r.add_history ('aaa') + r.input ('Escape') + r.input ('"/a"') + r.input ('Return') + self.assertEqual (r.line, 'aaa') + r.input ('"iz"') + self.assertEqual (r.line, 'zaaa') self.assertEqual (r.console.bell_count, 0) - r.input (u'Escape') - r.input (u'"j"') - self.assertEqual (r.line, u'zaaa') + r.input ('Escape') + r.input ('"j"') + self.assertEqual (r.line, 'zaaa') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 1) def test_history_undo (self): r = ViModeTest () - r.add_history (u'aaa') - r.input (u'Escape') - r.input (u'"k"') - r.input (u'"A b"') - r.input (u'Escape') - r.input (u'"A c"') - r.input (u'Escape') - self.assertEqual (r.line, u'aaa b c') - r.input (u'"U"') - self.assertEqual (r.line, u'aaa') + r.add_history ('aaa') + r.input ('Escape') + r.input ('"k"') + r.input ('"A b"') + r.input ('Escape') + r.input ('"A c"') + r.input ('Escape') + self.assertEqual (r.line, 'aaa b c') + r.input ('"U"') + self.assertEqual (r.line, 'aaa') def test_history_arrow_undo (self): r = ViModeTest () - r.add_history (u'aaa') - r.input (u'Up') - r.input (u'" zz"') - self.assertEqual (r.line, u'aaa zz') - r.input (u'Escape') - r.input (u'"u"') - self.assertEqual (r.line, u'aaa') + r.add_history ('aaa') + r.input ('Up') + r.input ('" zz"') + self.assertEqual (r.line, 'aaa zz') + r.input ('Escape') + r.input ('"u"') + self.assertEqual (r.line, 'aaa') # TODO: mode support? # def test_mode (self): @@ -1770,356 +1770,356 @@ class Tests (unittest.TestCase): # self.assertEqual (sio.read(), u' 1 abc\n 2 def\n 3 ghi\n') def test_editor (self): - vee = ViExternalEditorTest (u'qwerty before') + vee = ViExternalEditorTest ('qwerty before') self.assert_ (vee.sio_write.closed) - self.assertEqual (vee.command, u'vim.exe temp.py') + self.assertEqual (vee.command, 'vim.exe temp.py') self.assert_ (vee.sio_read.closed) - self.assertEqual (vee.remove, u'temp.py') - self.assertEqual (vee.result, u'qwerty after') + self.assertEqual (vee.remove, 'temp.py') + self.assertEqual (vee.result, 'qwerty after') def test_completer (self): r = ViModeTest () - r.lst_completions = ['aab', u'aac', u'aad', ] - r.input (u'"aa"') - r.input (u'Tab') - self.assertEqual (r.line, u'aa') - self.assertEqual (r.console.text, u'\naab \naac \naad \n') + r.lst_completions = ['aab', 'aac', 'aad', ] + r.input ('"aa"') + r.input ('Tab') + self.assertEqual (r.line, 'aa') + self.assertEqual (r.console.text, '\naab \naac \naad \n') def test_completer_star (self): r = ViModeTest () - r.lst_completions = ['bbc', u'bbd', u'bbe', ] - r.input (u'"aa bb"') - r.input (u'Escape') + r.lst_completions = ['bbc', 'bbd', 'bbe', ] + r.input ('"aa bb"') + r.input ('Escape') self.assert_ (not r.vi_is_insert_mode) - r.input (u'"*"') - self.assertEqual (r.line, u'aa bbc bbd bbe ') + r.input ('"*"') + self.assertEqual (r.line, 'aa bbc bbd bbe ') self.assertEqual (r.line_cursor, 15) self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.console.text, u'') - r.input (u'" "') - r.input (u'Escape') - self.assertEqual (r.line, u'aa bbc bbd bbe ') + self.assertEqual (r.console.text, '') + r.input ('" "') + r.input ('Escape') + self.assertEqual (r.line, 'aa bbc bbd bbe ') self.assertEqual (r.line_cursor, 15) - r.input (u'"."') - self.assertEqual (r.line, u'aa bbc bbd bbe bbc bbd bbe ') + r.input ('"."') + self.assertEqual (r.line, 'aa bbc bbd bbe bbc bbd bbe ') self.assertEqual (r.line_cursor, 27) def test_completer_beginning_of_line (self): r = ViModeTest () - r.input (u'Tab') - self.assertEqual (r.line, u' ') + r.input ('Tab') + self.assertEqual (r.line, ' ') self.assertEqual (r.line_cursor, 4) - r.input (u'Space') - self.assertEqual (r.line, u' ') + r.input ('Space') + self.assertEqual (r.line, ' ') self.assertEqual (r.line_cursor, 5) - r.input (u'Tab') - self.assertEqual (r.line, u' ') + r.input ('Tab') + self.assertEqual (r.line, ' ') self.assertEqual (r.line_cursor, 8) - r.input (u'Space') - r.input (u'Space') - r.input (u'Space') - self.assertEqual (r.line, u' ') + r.input ('Space') + r.input ('Space') + r.input ('Space') + self.assertEqual (r.line, ' ') self.assertEqual (r.line_cursor, 11) - r.input (u'Tab') - self.assertEqual (r.line, u' ') + r.input ('Tab') + self.assertEqual (r.line, ' ') self.assertEqual (r.line_cursor, 12) - r.input (u'Tab') - self.assertEqual (r.line, u' ') + r.input ('Tab') + self.assertEqual (r.line, ' ') self.assertEqual (r.line_cursor, 16) def test_replace_lower (self): r = ViModeTest () - r._set_line (u'aaa bbb ccc') - r.input (u'Escape') - r.input (u'"0ry"') - self.assertEqual (r.line, u'yaa bbb ccc') + r._set_line ('aaa bbb ccc') + r.input ('Escape') + r.input ('"0ry"') + self.assertEqual (r.line, 'yaa bbb ccc') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) - r.input (u'"i"') - self.assertEqual (r.line, u'yaa bbb ccc') + r.input ('"i"') + self.assertEqual (r.line, 'yaa bbb ccc') self.assertEqual (r.line_cursor, 0) self.assert_ (r.vi_is_insert_mode) - r.input (u'"x"') - self.assertEqual (r.line, u'xyaa bbb ccc') + r.input ('"x"') + self.assertEqual (r.line, 'xyaa bbb ccc') self.assertEqual (r.line_cursor, 1) self.assert_ (r.vi_is_insert_mode) - r.input (u'Escape') - self.assertEqual (r.line, u'xyaa bbb ccc') + r.input ('Escape') + self.assertEqual (r.line, 'xyaa bbb ccc') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) - r.input (u'"ll"') - r.input (u'"2rz"') - self.assertEqual (r.line, u'xyzz bbb ccc') + r.input ('"ll"') + r.input ('"2rz"') + self.assertEqual (r.line, 'xyzz bbb ccc') self.assertEqual (r.line_cursor, 3) self.assert_ (not r.vi_is_insert_mode) - r.input (u'"w7."') - self.assertEqual (r.line, u'xyzz zzzzzzz') + r.input ('"w7."') + self.assertEqual (r.line, 'xyzz zzzzzzz') self.assertEqual (r.line_cursor, 11) self.assert_ (not r.vi_is_insert_mode) def test_replace_lower_undo (self): r = ViModeTest () - r._set_line (u'aaa') - r.input (u'Escape') + r._set_line ('aaa') + r.input ('Escape') # print u'xx', sys._getframe().f_lineno, r._vi_undo_cursor, r._vi_undo_stack - r.input (u'"0rz"') - self.assertEqual (r.line, u'zaa') - r.input (u'"u"') - self.assertEqual (r.line, u'aaa') - r.input (u'"2."') - self.assertEqual (r.line, u'zza') - r.input (u'"u"') - self.assertEqual (r.line, u'aaa') + r.input ('"0rz"') + self.assertEqual (r.line, 'zaa') + r.input ('"u"') + self.assertEqual (r.line, 'aaa') + r.input ('"2."') + self.assertEqual (r.line, 'zza') + r.input ('"u"') + self.assertEqual (r.line, 'aaa') def test_replace_lower_escape (self): r = ViModeTest () - r._set_line (u'aaa') - r.input (u'Escape') - r.input (u'"0r"') - self.assertEqual (r.line, u'aaa') - r.input (u'Escape') - self.assertEqual (r.line, u'aaa') - r.input (u'"r"') - self.assertEqual (r.line, u'aaa') - r.input (u'"z"') - self.assertEqual (r.line, u'zaa') + r._set_line ('aaa') + r.input ('Escape') + r.input ('"0r"') + self.assertEqual (r.line, 'aaa') + r.input ('Escape') + self.assertEqual (r.line, 'aaa') + r.input ('"r"') + self.assertEqual (r.line, 'aaa') + r.input ('"z"') + self.assertEqual (r.line, 'zaa') def test_replace_lower_escape_undo (self): r = ViModeTest () - r._set_line (u'aa bb cc') - r.input (u'Escape') - r.input (u'"0cwdd"') - r.input (u'Escape') - self.assertEqual (r.line, u'dd bb cc') - r.input (u'"wr"') - r.input (u'Escape') - self.assertEqual (r.line, u'dd bb cc') - r.input (u'"."') - self.assertEqual (r.line, u'dd dd cc') - r.input (u'"u"') - self.assertEqual (r.line, u'dd bb cc') - r.input (u'"u"') - self.assertEqual (r.line, u'aa bb cc') + r._set_line ('aa bb cc') + r.input ('Escape') + r.input ('"0cwdd"') + r.input ('Escape') + self.assertEqual (r.line, 'dd bb cc') + r.input ('"wr"') + r.input ('Escape') + self.assertEqual (r.line, 'dd bb cc') + r.input ('"."') + self.assertEqual (r.line, 'dd dd cc') + r.input ('"u"') + self.assertEqual (r.line, 'dd bb cc') + r.input ('"u"') + self.assertEqual (r.line, 'aa bb cc') def test_replace_dot (self): r = ViModeTest () - r._set_line (u'ab') - r.input (u'Escape') - r.input (u'"0rzl"') - self.assertEqual (r.line, u'zb') + r._set_line ('ab') + r.input ('Escape') + r.input ('"0rzl"') + self.assertEqual (r.line, 'zb') self.assertEqual (r.line_cursor, 1) self.assert_ (not r.vi_is_insert_mode) - r.input (u'"r."') - self.assertEqual (r.line, u'z.') + r.input ('"r."') + self.assertEqual (r.line, 'z.') self.assertEqual (r.line_cursor, 1) self.assert_ (not r.vi_is_insert_mode) def test_replace_upper (self): r = ViModeTest () - r._set_line (u'aaa bbb') - r.input (u'Escape') - r.input (u'"0wR"') - self.assertEqual (r.line, u'aaa bbb') + r._set_line ('aaa bbb') + r.input ('Escape') + r.input ('"0wR"') + self.assertEqual (r.line, 'aaa bbb') self.assertEqual (r.line_cursor, 4) self.assert_ (r.vi_is_insert_mode) - r.input (u'"z"') - self.assertEqual (r.line, u'aaa zbb') + r.input ('"z"') + self.assertEqual (r.line, 'aaa zbb') self.assertEqual (r.line_cursor, 5) self.assert_ (r.vi_is_insert_mode) - r.input (u'"zzz"') - self.assertEqual (r.line, u'aaa zzzz') + r.input ('"zzz"') + self.assertEqual (r.line, 'aaa zzzz') self.assertEqual (r.line_cursor, 8) self.assert_ (r.vi_is_insert_mode) - r.input (u'Escape') + r.input ('Escape') self.assertEqual (r.line_cursor, 7) self.assert_ (not r.vi_is_insert_mode) def test_replace_upper_dot (self): r = ViModeTest () - r._set_line (u'aaa bbb ccc ddd') - r.input (u'Escape') - r.input (u'"02Rz"') - r.input (u'Escape') - self.assertEqual (r.line, u'zza bbb ccc ddd') + r._set_line ('aaa bbb ccc ddd') + r.input ('Escape') + r.input ('"02Rz"') + r.input ('Escape') + self.assertEqual (r.line, 'zza bbb ccc ddd') self.assertEqual (r.line_cursor, 1) self.assert_ (not r.vi_is_insert_mode) - r.input (u'"w."') - self.assertEqual (r.line, u'zza zzb ccc ddd') + r.input ('"w."') + self.assertEqual (r.line, 'zza zzb ccc ddd') self.assertEqual (r.line_cursor, 5) self.assert_ (not r.vi_is_insert_mode) - r.input (u'"w6."') - self.assertEqual (r.line, u'zza zzb zzzzzzd') + r.input ('"w6."') + self.assertEqual (r.line, 'zza zzb zzzzzzd') self.assertEqual (r.line_cursor, 13) self.assert_ (not r.vi_is_insert_mode) def test_replace_upper_undo (self): r = ViModeTest () - r._set_line (u'aaa bbb ccc') - r.input (u'Escape') - r.input (u'"0Rzz"') - r.input (u'Escape') - self.assertEqual (r.line, u'zza bbb ccc') - r.input (u'"w3."') - self.assertEqual (r.line, u'zza zzzzzzc') - r.input (u'"u"') - self.assertEqual (r.line, u'zza bbb ccc') - r.input (u'"u"') - self.assertEqual (r.line, u'aaa bbb ccc') + r._set_line ('aaa bbb ccc') + r.input ('Escape') + r.input ('"0Rzz"') + r.input ('Escape') + self.assertEqual (r.line, 'zza bbb ccc') + r.input ('"w3."') + self.assertEqual (r.line, 'zza zzzzzzc') + r.input ('"u"') + self.assertEqual (r.line, 'zza bbb ccc') + r.input ('"u"') + self.assertEqual (r.line, 'aaa bbb ccc') def test_replace_backspace_and_dot (self): r = ViModeTest () - r._set_line (u'aa bb') - r.input (u'Escape') - r.input (u'"0wRc"') - self.assertEqual (r.line, u'aa cb') + r._set_line ('aa bb') + r.input ('Escape') + r.input ('"0wRc"') + self.assertEqual (r.line, 'aa cb') self.assertEqual (r.line_cursor, 4) self.assert_ (r.vi_is_insert_mode) - r.input (u'"c"') - self.assertEqual (r.line, u'aa cc') + r.input ('"c"') + self.assertEqual (r.line, 'aa cc') self.assertEqual (r.line_cursor, 5) - r.input (u'"c"') - self.assertEqual (r.line, u'aa ccc') + r.input ('"c"') + self.assertEqual (r.line, 'aa ccc') self.assertEqual (r.line_cursor, 6) - r.input (u'BackSpace') - self.assertEqual (r.line, u'aa cc') + r.input ('BackSpace') + self.assertEqual (r.line, 'aa cc') self.assertEqual (r.line_cursor, 5) self.assert_ (r.vi_is_insert_mode) - r.input (u'BackSpace') - self.assertEqual (r.line, u'aa cb') + r.input ('BackSpace') + self.assertEqual (r.line, 'aa cb') self.assertEqual (r.line_cursor, 4) self.assert_ (r.vi_is_insert_mode) - r.input (u'BackSpace') - self.assertEqual (r.line, u'aa bb') + r.input ('BackSpace') + self.assertEqual (r.line, 'aa bb') self.assertEqual (r.line_cursor, 3) self.assert_ (r.vi_is_insert_mode) - r.input (u'BackSpace') - self.assertEqual (r.line, u'aa bb') + r.input ('BackSpace') + self.assertEqual (r.line, 'aa bb') self.assertEqual (r.line_cursor, 2) self.assert_ (r.vi_is_insert_mode) - r.input (u'"d"') - self.assertEqual (r.line, u'aadbb') + r.input ('"d"') + self.assertEqual (r.line, 'aadbb') self.assertEqual (r.line_cursor, 3) self.assert_ (r.vi_is_insert_mode) - r.input (u'Escape') - self.assertEqual (r.line, u'aadbb') + r.input ('Escape') + self.assertEqual (r.line, 'aadbb') self.assertEqual (r.line_cursor, 2) self.assert_ (not r.vi_is_insert_mode) - r.input (u'"u"') - self.assertEqual (r.line, u'aa bb') + r.input ('"u"') + self.assertEqual (r.line, 'aa bb') self.assertEqual (r.line_cursor, 3) self.assert_ (not r.vi_is_insert_mode) - r.input (u'"hh"') - r.input (u'"."') - self.assertEqual (r.line, u'da bb') + r.input ('"hh"') + r.input ('"."') + self.assertEqual (r.line, 'da bb') self.assert_ (not r.vi_is_insert_mode) def test_yank_line (self): r = ViModeTest () - r._set_line (u'aa bb') - r.input (u'Escape') - r.input (u'"0wY"') - self.assertEqual (r.line, u'aa bb') + r._set_line ('aa bb') + r.input ('Escape') + r.input ('"0wY"') + self.assertEqual (r.line, 'aa bb') self.assert_ (not r.vi_is_insert_mode) - r.input (u'"P"') - self.assertEqual (r.line, u'aa aa bbbb') + r.input ('"P"') + self.assertEqual (r.line, 'aa aa bbbb') self.assert_ (not r.vi_is_insert_mode) - r.input (u'"u"') - self.assertEqual (r.line, u'aa bb') + r.input ('"u"') + self.assertEqual (r.line, 'aa bb') self.assert_ (not r.vi_is_insert_mode) def test_column (self): r = ViModeTest () - r._set_line (u'aaa bbb') - r.input (u'Escape') - r.input (u'"099|"') - self.assertEqual (r.line, u'aaa bbb') + r._set_line ('aaa bbb') + r.input ('Escape') + r.input ('"099|"') + self.assertEqual (r.line, 'aaa bbb') self.assertEqual (r.line_cursor, 6) - r.input (u'"4|"') - self.assertEqual (r.line, u'aaa bbb') + r.input ('"4|"') + self.assertEqual (r.line, 'aaa bbb') self.assertEqual (r.line_cursor, 3) - r.input (u'"d1|"') - self.assertEqual (r.line, u' bbb') + r.input ('"d1|"') + self.assertEqual (r.line, ' bbb') self.assertEqual (r.line_cursor, 0) - r.input (u'"u"') - self.assertEqual (r.line, u'aaa bbb') + r.input ('"u"') + self.assertEqual (r.line, 'aaa bbb') self.assertEqual (r.line_cursor, 3) - r.input (u'"d7|"') - self.assertEqual (r.line, u'aaab') + r.input ('"d7|"') + self.assertEqual (r.line, 'aaab') self.assertEqual (r.line_cursor, 3) def test_change_case (self): r = ViModeTest () - r._set_line (u'aaa B7B ccc') - r.input (u'Escape') - r.input (u'"0~"') - self.assertEqual (r.line, u'Aaa B7B ccc') + r._set_line ('aaa B7B ccc') + r.input ('Escape') + r.input ('"0~"') + self.assertEqual (r.line, 'Aaa B7B ccc') self.assertEqual (r.line_cursor, 1) self.assert_ (not r.vi_is_insert_mode) - r.input (u'"h."') - self.assertEqual (r.line, u'aaa B7B ccc') + r.input ('"h."') + self.assertEqual (r.line, 'aaa B7B ccc') self.assertEqual (r.line_cursor, 1) self.assert_ (not r.vi_is_insert_mode) - r.input (u'"9~"') - self.assertEqual (r.line, u'aAA b7b CCc') + r.input ('"9~"') + self.assertEqual (r.line, 'aAA b7b CCc') self.assertEqual (r.line_cursor, 10) self.assert_ (not r.vi_is_insert_mode) - r.input (u'"u"') - self.assertEqual (r.line, u'aaa B7B ccc') + r.input ('"u"') + self.assertEqual (r.line, 'aaa B7B ccc') self.assertEqual (r.line_cursor, 1) self.assert_ (not r.vi_is_insert_mode) def test_redo (self): r = ViModeTest () - r._set_line (u'') - r.input (u'Escape') - r.input (u'"Saaa"') - self.assertEqual (r.line, u'aaa') - r.input (u'Escape') - r.input (u'"Sbbb"') - self.assertEqual (r.line, u'bbb') - r.input (u'Escape') - r.input (u'"Sccc"') - r.input (u'Escape') - self.assertEqual (r.line, u'ccc') - r.input (u'"u"') - self.assertEqual (r.line, u'bbb') - r.input (u'Control-r') - self.assertEqual (r.line, u'ccc') - r.input (u'"u"') - self.assertEqual (r.line, u'bbb') - r.input (u'"u"') - self.assertEqual (r.line, u'aaa') - r.input (u'"u"') - self.assertEqual (r.line, u'') - r.input (u'"u"') - self.assertEqual (r.line, u'') - r.input (u'Control-r') - self.assertEqual (r.line, u'aaa') - r.input (u'Control-r') - self.assertEqual (r.line, u'bbb') - r.input (u'Control-r') - self.assertEqual (r.line, u'ccc') - r.input (u'Control-r') - self.assertEqual (r.line, u'ccc') - r.input (u'"u"') - self.assertEqual (r.line, u'bbb') - r.input (u'"Szzz"') - r.input (u'Escape') - self.assertEqual (r.line, u'zzz') - r.input (u'"u"') - self.assertEqual (r.line, u'bbb') - r.input (u'Control-r') - self.assertEqual (r.line, u'zzz') - r.input (u'"U"') - self.assertEqual (r.line, u'') - r.input (u'Control-r') - self.assertEqual (r.line, u'aaa') - r.input (u'Control-r') - self.assertEqual (r.line, u'bbb') - r.input (u'Control-r') - self.assertEqual (r.line, u'zzz') - r.input (u'Control-r') - self.assertEqual (r.line, u'zzz') + r._set_line ('') + r.input ('Escape') + r.input ('"Saaa"') + self.assertEqual (r.line, 'aaa') + r.input ('Escape') + r.input ('"Sbbb"') + self.assertEqual (r.line, 'bbb') + r.input ('Escape') + r.input ('"Sccc"') + r.input ('Escape') + self.assertEqual (r.line, 'ccc') + r.input ('"u"') + self.assertEqual (r.line, 'bbb') + r.input ('Control-r') + self.assertEqual (r.line, 'ccc') + r.input ('"u"') + self.assertEqual (r.line, 'bbb') + r.input ('"u"') + self.assertEqual (r.line, 'aaa') + r.input ('"u"') + self.assertEqual (r.line, '') + r.input ('"u"') + self.assertEqual (r.line, '') + r.input ('Control-r') + self.assertEqual (r.line, 'aaa') + r.input ('Control-r') + self.assertEqual (r.line, 'bbb') + r.input ('Control-r') + self.assertEqual (r.line, 'ccc') + r.input ('Control-r') + self.assertEqual (r.line, 'ccc') + r.input ('"u"') + self.assertEqual (r.line, 'bbb') + r.input ('"Szzz"') + r.input ('Escape') + self.assertEqual (r.line, 'zzz') + r.input ('"u"') + self.assertEqual (r.line, 'bbb') + r.input ('Control-r') + self.assertEqual (r.line, 'zzz') + r.input ('"U"') + self.assertEqual (r.line, '') + r.input ('Control-r') + self.assertEqual (r.line, 'aaa') + r.input ('Control-r') + self.assertEqual (r.line, 'bbb') + r.input ('Control-r') + self.assertEqual (r.line, 'zzz') + r.input ('Control-r') + self.assertEqual (r.line, 'zzz') #---------------------------------------------------------------------- # utility functions @@ -2127,20 +2127,20 @@ class Tests (unittest.TestCase): #---------------------------------------------------------------------- -if __name__ == u'__main__': +if __name__ == '__main__': Tester() - tested=ViModeTest.tested_commands.keys() + tested=list(ViModeTest.tested_commands.keys()) tested.sort() - print " Tested functions ".center(60,"-") - print "\n".join(tested) - print + print(" Tested functions ".center(60,"-")) + print("\n".join(tested)) + print() - all_funcs=dict([(x.__name__,x) for x in ViModeTest().key_dispatch.values()]) - all_funcs=all_funcs.keys() + all_funcs=dict([(x.__name__,x) for x in list(ViModeTest().key_dispatch.values())]) + all_funcs=list(all_funcs.keys()) not_tested=[x for x in all_funcs if x not in tested] not_tested.sort() - print " Not tested functions ".center(60,"-") - print "\n".join(not_tested) + print(" Not tested functions ".center(60,"-")) + print("\n".join(not_tested)) diff --git a/pyreadline/unicode_helper.py b/pyreadline/unicode_helper.py index bf171ab..71d7c29 100644 --- a/pyreadline/unicode_helper.py +++ b/pyreadline/unicode_helper.py @@ -12,25 +12,25 @@ try: except AttributeError: # This error occurs when pdb imports readline and doctest has replaced # stdout with stdout collector. We will assume ascii codepage - pyreadline_codepage = u"ascii" + pyreadline_codepage = "ascii" if pyreadline_codepage is None: - pyreadline_codepage = u"ascii" + pyreadline_codepage = "ascii" def ensure_unicode(text): - u"""helper to ensure that text passed to WriteConsoleW is unicode""" + """helper to ensure that text passed to WriteConsoleW is unicode""" if isinstance(text, str): try: - return text.decode(pyreadline_codepage, u"replace") + return text.decode(pyreadline_codepage, "replace") except (LookupError, TypeError): - return text.decode(u"ascii", u"replace") + return text.decode("ascii", "replace") return text def ensure_str(text): - u"""Convert unicode to str using pyreadline_codepage""" - if isinstance(text, unicode): + """Convert unicode to str using pyreadline_codepage""" + if isinstance(text, str): try: - return text.encode(pyreadline_codepage, u"replace") + return text.encode(pyreadline_codepage, "replace") except (LookupError, TypeError): - return text.encode(u"ascii", u"replace") + return text.encode("ascii", "replace") return text diff --git a/readline.py b/readline.py index 99db186..17107a8 100644 --- a/readline.py +++ b/readline.py @@ -39,7 +39,7 @@ if rl.disable_readline: globals()[funk] = dummy else: def GetOutputFile(): - u'''Return the console object used by readline so that it can be used for printing in color.''' + '''Return the console object used by readline so that it can be used for printing in color.''' return rl.console __all__.append("GetOutputFile") diff --git a/setup.py b/setup.py index 79a698b..504b125 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ if os.path.exists('MANIFEST'): os.remove('MANIFEST') # from distutils.core import setup -execfile('pyreadline/release.py') +exec(compile(open('pyreadline/release.py').read(), 'pyreadline/release.py', 'exec')) try: import sphinx From be456b10c8fd3810945342399c6860d87d795af3 Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Wed, 30 Mar 2011 00:46:51 +0900 Subject: [PATCH 02/19] add ignore for python3's pyc cache directory. --- .bzrignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.bzrignore b/.bzrignore index 378eac2..c095e69 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1 +1,2 @@ build +__pycache__/ From 315830d67d6c7657fecd6fc7b0fe33526924ca09 Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Wed, 30 Mar 2011 00:47:36 +0900 Subject: [PATCH 03/19] fix for python3 bytes/str type mismatch. --- pyreadline/console/console.py | 10 +++++----- pyreadline/lineeditor/history.py | 4 +--- pyreadline/modes/basemode.py | 4 ++-- pyreadline/test/test_emacs.py | 2 +- pyreadline/test/test_vi.py | 4 ++-- pyreadline/unicode_helper.py | 2 +- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/pyreadline/console/console.py b/pyreadline/console/console.py index e2d9a1f..4f03415 100644 --- a/pyreadline/console/console.py +++ b/pyreadline/console/console.py @@ -286,7 +286,7 @@ class Console(object): # This pattern should match all characters that change the cursor position differently # than a normal character. - motion_char_re = re.compile('([\n\r\t\010\007])') + motion_char_re = re.compile(b'([\n\r\t\010\007])') def write_scrolling(self, text, attr=None): '''write text at current cursor position while watching for scrolling. @@ -306,7 +306,7 @@ class Console(object): w, h = self.size() scroll = 0 # the result # split the string into ordinary characters and funny characters - chunks = self.motion_char_re.split(text) + chunks = self.motion_char_re.split(ensure_str(text)) for chunk in chunks: n = self.write_color(chunk, attr) if len(chunk) == 1: # the funny characters will be alone @@ -690,7 +690,7 @@ def hook_wrapper_23(stdin, stdout, prompt): # call the Python hook res = ensure_str(readline_hook(prompt)) # make sure it returned the right sort of thing - if res and not isinstance(res, str): + if res and not isinstance(res, bytes): raise TypeError('readline must return a string.') except KeyboardInterrupt: # GNU readline returns 0 on keyboard interrupt @@ -714,7 +714,7 @@ def hook_wrapper(prompt): # call the Python hook res = ensure_str(readline_hook(prompt)) # make sure it returned the right sort of thing - if res and not isinstance(res, str): + if res and not isinstance(res, bytes): raise TypeError('readline must return a string.') except KeyboardInterrupt: # GNU readline returns 0 on keyboard interrupt @@ -738,7 +738,7 @@ def install_readline(hook): readline_hook = hook # get the address of PyOS_ReadlineFunctionPointer so we can update it PyOS_RFP = c_int.from_address(Console.GetProcAddress(sys.dllhandle, - "PyOS_ReadlineFunctionPointer")) + b"PyOS_ReadlineFunctionPointer")) # save a reference to the generated C-callable so it doesn't go away if sys.version < '2.3': readline_ref = HOOKFUNC22(hook_wrapper) diff --git a/pyreadline/lineeditor/history.py b/pyreadline/lineeditor/history.py index d5fbe14..b561a9a 100644 --- a/pyreadline/lineeditor/history.py +++ b/pyreadline/lineeditor/history.py @@ -15,9 +15,7 @@ else: from . import lineobj -import exceptions - -class EscapeHistory(exceptions.Exception): +class EscapeHistory(Exception): pass from pyreadline.logger import log diff --git a/pyreadline/modes/basemode.py b/pyreadline/modes/basemode.py index cc8704f..35123e3 100644 --- a/pyreadline/modes/basemode.py +++ b/pyreadline/modes/basemode.py @@ -196,7 +196,7 @@ class BaseMode(object): i = 0 while 1: try: - r = ensure_unicode(self.completer(text, i)) + r = self.completer(ensure_unicode(text), i) except IndexError: break i += 1 @@ -216,7 +216,7 @@ class BaseMode(object): break text = ensure_str(''.join(buf[self.begidx:self.endidx])) log('file complete text="%s"' % ensure_unicode(text)) - completions = list(map(ensure_unicode, glob.glob(os.path.expanduser(text) + '*'))) + completions = list(map(ensure_unicode, glob.glob(os.path.expanduser(text) + b'*'))) if self.mark_directories == 'on': mc = [] for f in completions: diff --git a/pyreadline/test/test_emacs.py b/pyreadline/test/test_emacs.py index f4dcf62..765691f 100644 --- a/pyreadline/test/test_emacs.py +++ b/pyreadline/test/test_emacs.py @@ -14,7 +14,7 @@ from pyreadline.modes.emacs import * from pyreadline import keysyms from pyreadline.lineeditor import lineobj -from .common import * +from common import * from pyreadline.logger import log import pyreadline.logger as logger logger.sock_silent=True diff --git a/pyreadline/test/test_vi.py b/pyreadline/test/test_vi.py index e0be991..32d14e6 100644 --- a/pyreadline/test/test_vi.py +++ b/pyreadline/test/test_vi.py @@ -13,9 +13,9 @@ from pyreadline import keysyms from pyreadline.lineeditor import lineobj from pyreadline.logger import log import pyreadline.logger as logger -from .common import * +from common import * -from .common import * +from common import * #---------------------------------------------------------------------- class ViModeTest (ViMode): diff --git a/pyreadline/unicode_helper.py b/pyreadline/unicode_helper.py index 71d7c29..dd9b164 100644 --- a/pyreadline/unicode_helper.py +++ b/pyreadline/unicode_helper.py @@ -19,7 +19,7 @@ if pyreadline_codepage is None: def ensure_unicode(text): """helper to ensure that text passed to WriteConsoleW is unicode""" - if isinstance(text, str): + if isinstance(text, bytes): try: return text.decode(pyreadline_codepage, "replace") except (LookupError, TypeError): From fcfc113c12a4b223de4c647d2e95eae74466a367 Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Wed, 30 Mar 2011 00:51:53 +0900 Subject: [PATCH 04/19] change function name: ensure_str -> ensure_bytes. change function name: ensure_unicode -> ensure_str. --- pyreadline/clipboard/win32_clipboard.py | 6 +++--- pyreadline/console/console.py | 20 ++++++++++---------- pyreadline/keysyms/common.py | 4 ++-- pyreadline/lineeditor/history.py | 6 +++--- pyreadline/lineeditor/lineobj.py | 6 +++--- pyreadline/logger.py | 6 +++--- pyreadline/modes/basemode.py | 18 +++++++++--------- pyreadline/modes/emacs.py | 2 +- pyreadline/rlmain.py | 4 ++-- pyreadline/unicode_helper.py | 4 ++-- 10 files changed, 38 insertions(+), 38 deletions(-) diff --git a/pyreadline/clipboard/win32_clipboard.py b/pyreadline/clipboard/win32_clipboard.py index c60416e..58c8318 100644 --- a/pyreadline/clipboard/win32_clipboard.py +++ b/pyreadline/clipboard/win32_clipboard.py @@ -34,7 +34,7 @@ from ctypes import * from pyreadline.keysyms.winconstants import CF_TEXT, GHND -from pyreadline.unicode_helper import ensure_unicode,ensure_str +from pyreadline.unicode_helper import ensure_str,ensure_bytes OpenClipboard = windll.user32.OpenClipboard OpenClipboard.argtypes = [c_int] @@ -88,10 +88,10 @@ def GetClipboardText(): text = GlobalLock(hClipMem) GlobalUnlock(hClipMem) CloseClipboard() - return ensure_unicode(text) + return ensure_str(text) def SetClipboardText(text): - buffer = c_buffer(ensure_str(text)) + buffer = c_buffer(ensure_bytes(text)) bufferSize = sizeof(buffer) hGlobalMem = GlobalAlloc(c_int(GHND), c_int(bufferSize)) GlobalLock.restype = c_void_p diff --git a/pyreadline/console/console.py b/pyreadline/console/console.py index 4f03415..9fdcc9c 100644 --- a/pyreadline/console/console.py +++ b/pyreadline/console/console.py @@ -20,7 +20,7 @@ import re import pyreadline.unicode_helper as unicode_helper from pyreadline.logger import log -from pyreadline.unicode_helper import ensure_unicode, ensure_str +from pyreadline.unicode_helper import ensure_str, ensure_bytes from pyreadline.keysyms import make_KeyPress, KeyPress from pyreadline.console.ansi import AnsiState,AnsiWriter @@ -306,7 +306,7 @@ class Console(object): w, h = self.size() scroll = 0 # the result # split the string into ordinary characters and funny characters - chunks = self.motion_char_re.split(ensure_str(text)) + chunks = self.motion_char_re.split(ensure_bytes(text)) for chunk in chunks: n = self.write_color(chunk, attr) if len(chunk) == 1: # the funny characters will be alone @@ -345,7 +345,7 @@ class Console(object): return scroll def write_color(self, text, attr=None): - text = ensure_unicode(text) + text = ensure_str(text) n, res= self.ansiwriter.write_color(text, attr) junk = c_int(0) for attr,chunk in res: @@ -359,14 +359,14 @@ class Console(object): def write_plain(self, text, attr=None): '''write text at current cursor position.''' - text = ensure_unicode(text) + text = ensure_str(text) log('write("%s", %s)' %(text, attr)) if attr is None: attr = self.attr n = c_int(0) self.SetConsoleTextAttribute(self.hout, attr) for short_chunk in split_block(chunk): - self.WriteConsoleW(self.hout, ensure_unicode(short_chunk), + self.WriteConsoleW(self.hout, ensure_str(short_chunk), len(short_chunk), byref(junk), None) return len(text) @@ -374,7 +374,7 @@ class Console(object): #Emacs sets the EMACS environment variable if "EMACS" in os.environ: def write_color(self, text, attr=None): - text = ensure_str(text) + text = ensure_bytes(text) junk = c_int(0) self.WriteFile(self.hout, text, len(text), byref(junk), None) return len(text) @@ -382,7 +382,7 @@ class Console(object): # make this class look like a file object def write(self, text): - text = ensure_unicode(text) + text = ensure_str(text) log('write("%s")' % text) return self.write_color(text) @@ -455,7 +455,7 @@ class Console(object): source = SMALL_RECT(x0, y0, x1 - 1, y1 - 1) dest = self.fixcoord(x0 + dx, y0 + dy) style = CHAR_INFO() - style.Char.AsciiChar = ensure_str(fill[0]) + style.Char.AsciiChar = ensure_bytes(fill[0]) style.Attributes = attr return self.ScrollConsoleScreenBufferW(self.hout, byref(source), @@ -688,7 +688,7 @@ def hook_wrapper_23(stdin, stdout, prompt): '''Wrap a Python readline so it behaves like GNU readline.''' try: # call the Python hook - res = ensure_str(readline_hook(prompt)) + res = ensure_bytes(readline_hook(prompt)) # make sure it returned the right sort of thing if res and not isinstance(res, bytes): raise TypeError('readline must return a string.') @@ -712,7 +712,7 @@ def hook_wrapper(prompt): '''Wrap a Python readline so it behaves like GNU readline.''' try: # call the Python hook - res = ensure_str(readline_hook(prompt)) + res = ensure_bytes(readline_hook(prompt)) # make sure it returned the right sort of thing if res and not isinstance(res, bytes): raise TypeError('readline must return a string.') diff --git a/pyreadline/keysyms/common.py b/pyreadline/keysyms/common.py index b47f85f..1e6b53e 100644 --- a/pyreadline/keysyms/common.py +++ b/pyreadline/keysyms/common.py @@ -13,7 +13,7 @@ try: except NameError: from sets import Set as set -from pyreadline.unicode_helper import ensure_unicode +from pyreadline.unicode_helper import ensure_str validkey =set(['cancel', 'backspace', 'tab', 'clear', 'return', 'shift_l', 'control_l', 'alt_l', @@ -62,7 +62,7 @@ class KeyPress(object): keyname = create("keyname") def __repr__(self): - return "(%s,%s,%s,%s)"%tuple(map(ensure_unicode, self.tuple())) + return "(%s,%s,%s,%s)"%tuple(map(ensure_str, self.tuple())) def tuple(self): if self.keyname: diff --git a/pyreadline/lineeditor/history.py b/pyreadline/lineeditor/history.py index b561a9a..bff3247 100644 --- a/pyreadline/lineeditor/history.py +++ b/pyreadline/lineeditor/history.py @@ -7,7 +7,7 @@ #***************************************************************************** import re, operator,string, sys,os -from pyreadline.unicode_helper import ensure_unicode, ensure_str +from pyreadline.unicode_helper import ensure_str, ensure_bytes if "pyreadline" in sys.modules: pyreadline = sys.modules["pyreadline"] else: @@ -79,7 +79,7 @@ class LineHistory(object): filename = self.history_filename try: for line in open(filename, 'r'): - self.add_history(lineobj.ReadLineTextBuffer(ensure_unicode(line.rstrip()))) + self.add_history(lineobj.ReadLineTextBuffer(ensure_str(line.rstrip()))) except IOError: self.history = [] self.history_cursor = 0 @@ -90,7 +90,7 @@ class LineHistory(object): filename = self.history_filename fp = open(filename, 'wb') for line in self.history[-self.history_length:]: - fp.write(ensure_str(line.get_line_text())) + fp.write(ensure_bytes(line.get_line_text())) fp.write('\n') fp.close() diff --git a/pyreadline/lineeditor/lineobj.py b/pyreadline/lineeditor/lineobj.py index 0129f70..5598752 100644 --- a/pyreadline/lineeditor/lineobj.py +++ b/pyreadline/lineeditor/lineobj.py @@ -10,7 +10,7 @@ import re, operator, sys from . import wordmatcher import pyreadline.clipboard as clipboard from pyreadline.logger import log -from pyreadline.unicode_helper import ensure_unicode +from pyreadline.unicode_helper import ensure_str kill_ring_to_clipboard = False #set to true to copy every addition to kill ring to clipboard @@ -248,11 +248,11 @@ class TextLine(object): def quoted_text(self): quoted = [ quote_char(c) for c in self.line_buffer ] self.line_char_width = [ len(c) for c in quoted ] - return ''.join(map(ensure_unicode, quoted)) + return ''.join(map(ensure_str, quoted)) def get_line_text(self): buf = self.line_buffer - buf = list(map(ensure_unicode, buf)) + buf = list(map(ensure_str, buf)) return ''.join(buf) def set_line(self, text, cursor = None): diff --git a/pyreadline/logger.py b/pyreadline/logger.py index 0c42acb..da07c43 100644 --- a/pyreadline/logger.py +++ b/pyreadline/logger.py @@ -7,7 +7,7 @@ #***************************************************************************** import socket, logging, logging.handlers -from pyreadline.unicode_helper import ensure_str +from pyreadline.unicode_helper import ensure_bytes host = "localhost" port = logging.handlers.DEFAULT_TCP_LOGGING_PORT @@ -28,7 +28,7 @@ class SocketStream(object): self.logsocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) def write(self, s): - self.logsocket.sendto(ensure_str(s), (host, port)) + self.logsocket.sendto(ensure_bytes(s), (host, port)) def flush(self): pass @@ -69,5 +69,5 @@ def stop_logging(): stop_socket_log() def log(s): - s = ensure_str(s) + s = ensure_bytes(s) pyreadline_logger.debug(s) diff --git a/pyreadline/modes/basemode.py b/pyreadline/modes/basemode.py index 35123e3..b4fe03d 100644 --- a/pyreadline/modes/basemode.py +++ b/pyreadline/modes/basemode.py @@ -14,7 +14,7 @@ import pyreadline.lineeditor.lineobj as lineobj import pyreadline.lineeditor.history as history import pyreadline.clipboard as clipboard from pyreadline.error import ReadlineError,GetSetError -from pyreadline.unicode_helper import ensure_str, ensure_unicode +from pyreadline.unicode_helper import ensure_bytes, ensure_str import collections in_ironpython="IronPython" in sys.version @@ -191,12 +191,12 @@ class BaseMode(object): if buf[self.begidx] in self.completer_delims: self.begidx += 1 break - text = ensure_str(''.join(buf[self.begidx:self.endidx])) - log('complete text="%s"' % ensure_unicode(text)) + text = ensure_bytes(''.join(buf[self.begidx:self.endidx])) + log('complete text="%s"' % ensure_str(text)) i = 0 while 1: try: - r = self.completer(ensure_unicode(text), i) + r = self.completer(ensure_str(text), i) except IndexError: break i += 1 @@ -206,7 +206,7 @@ class BaseMode(object): completions.append(r) else: pass - log('text completions=<%s>' % list(map(ensure_unicode, completions))) + log('text completions=<%s>' % list(map(ensure_str, completions))) if (self.complete_filesystem == "on") and not completions: # get the filename to complete while self.begidx > 0: @@ -214,9 +214,9 @@ class BaseMode(object): if buf[self.begidx] in ' \t\n': self.begidx += 1 break - text = ensure_str(''.join(buf[self.begidx:self.endidx])) - log('file complete text="%s"' % ensure_unicode(text)) - completions = list(map(ensure_unicode, glob.glob(os.path.expanduser(text) + b'*'))) + text = ensure_bytes(''.join(buf[self.begidx:self.endidx])) + log('file complete text="%s"' % ensure_str(text)) + completions = list(map(ensure_str, glob.glob(os.path.expanduser(text) + b'*'))) if self.mark_directories == 'on': mc = [] for f in completions: @@ -225,7 +225,7 @@ class BaseMode(object): else: mc.append(f) completions = mc - log('fnames=<%s>' % list(map(ensure_unicode, completions))) + log('fnames=<%s>' % list(map(ensure_str, completions))) return completions diff --git a/pyreadline/modes/emacs.py b/pyreadline/modes/emacs.py index 80b4837..d3ac116 100644 --- a/pyreadline/modes/emacs.py +++ b/pyreadline/modes/emacs.py @@ -13,7 +13,7 @@ from pyreadline.lineeditor.lineobj import Point import pyreadline.lineeditor.lineobj as lineobj import pyreadline.lineeditor.history as history from . import basemode -from pyreadline.unicode_helper import ensure_unicode +from pyreadline.unicode_helper import ensure_str def format(keyinfo): diff --git a/pyreadline/rlmain.py b/pyreadline/rlmain.py index c7d3bfe..7b1984a 100644 --- a/pyreadline/rlmain.py +++ b/pyreadline/rlmain.py @@ -19,7 +19,7 @@ import pyreadline.console as console import pyreadline.logger as logger from pyreadline.keysyms.common import make_KeyPress_from_keydescr -from pyreadline.unicode_helper import ensure_unicode +from pyreadline.unicode_helper import ensure_str from .logger import log from .modes import editingmodes from .error import ReadlineError, GetSetError @@ -161,7 +161,7 @@ class BaseReadline(object): '''Load a readline history file. The default filename is ~/.history.''' if filename is None: filename = self.mode._history.history_filename - log("read_history_file from %s"%ensure_unicode(filename)) + log("read_history_file from %s"%ensure_str(filename)) self.mode._history.read_history_file(filename) def write_history_file(self, filename=None): diff --git a/pyreadline/unicode_helper.py b/pyreadline/unicode_helper.py index dd9b164..4e867cc 100644 --- a/pyreadline/unicode_helper.py +++ b/pyreadline/unicode_helper.py @@ -17,7 +17,7 @@ except AttributeError: if pyreadline_codepage is None: pyreadline_codepage = "ascii" -def ensure_unicode(text): +def ensure_str(text): """helper to ensure that text passed to WriteConsoleW is unicode""" if isinstance(text, bytes): try: @@ -26,7 +26,7 @@ def ensure_unicode(text): return text.decode("ascii", "replace") return text -def ensure_str(text): +def ensure_bytes(text): """Convert unicode to str using pyreadline_codepage""" if isinstance(text, str): try: From fa8ef349011843ac64830a748f00976c1a509f05 Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Wed, 30 Mar 2011 00:57:50 +0900 Subject: [PATCH 05/19] update document. --- doc/ChangeLog | 123 ++++++++++++++++++------------------ doc/source/introduction.rst | 2 +- 2 files changed, 64 insertions(+), 61 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 730a5fe..a205178 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,40 +1,43 @@ -2008-08-25 Jörgen Stenarson +2011-03-30 Takayuki SHIMIZUKAWA + * Python3 ready. + +2008-08-25 Jorgen Stenarson * Merging tab insert patch from Vivian De Smedt. Removed comments with vds initials. -2008-02-21 Jörgen Stenarson +2008-02-21 Jorgen Stenarson * unicodehelper functions now defaults to ascii if supplied pyreadline_encoding is not a valid encoding. This is a brute force solution to ticket #228 it fixes immediate symptom but may not be the correct solution to the underlying problem. -2008-01-07 Jörgen Stenarson +2008-01-07 Jorgen Stenarson * Reintroduced code to make pyreadline work with emacs. Not tested. Requested by Frank Wang. -2008-01-04 Jörgen Stenarson +2008-01-04 Jorgen Stenarson * Chunking calls to WriteConsoleW to ensure not exceeding 64k limit -2007-11-28 Jörgen Stenarson +2007-11-28 Jorgen Stenarson * Warning messages for failed calls to parse_and_bind now disabled by default Can be enabled by call to debug_output("on_nologfile") in pyreadlineconfig.ini -2007-11-20 Jörgen Stenarson +2007-11-20 Jorgen Stenarson * Applying patch from pan to fix flickering cursor problem when doing input of chinese. -2007-11-09 Jörgen Stenarson +2007-11-09 Jorgen Stenarson * make all conversion is done by ensure_unicode or ensure_str to ensure uniform handling of unicode issues. -2007-11-09 Jörgen Stenarson +2007-11-09 Jorgen Stenarson * More fixes to unicode handling. -2007-11-09 Jörgen Stenarson +2007-11-09 Jorgen Stenarson * Fixes to make clipboard play nice with unicode. Quick that treats the clipboard as being str with pyreadline_encoding data. Thus convert to unicode when pasting and converting to str when copying. -2007-11-09 Jörgen Stenarson +2007-11-09 Jorgen Stenarson * More fixes to ensure unicode works when completing on filepaths with non ascii symbols. This fix assumes sys.stdout.encoding is valid for the filesystem. A more correct fix must be applied to the completer code which is outside pyreadline. @@ -43,66 +46,66 @@ * The encoding assumed of strings is sys.stdout.encoding this can be changed by: e.g. pyreadline.unicode_helper.pyreadline_codepage="utf8" -2007-10-30 Jörgen Stenarson +2007-10-30 Jorgen Stenarson * Fixing console.title to work with wide characters * Fixing wide character bug for log_sock -2007-10-30 Jörgen Stenarson +2007-10-30 Jorgen Stenarson * Add tests for history buffer. Add ignore_leading_spaces option for history searches for forward_search_history, and reverse_search_history. -2007-10-29 Jörgen Stenarson +2007-10-29 Jorgen Stenarson * Patch as provided by pan. Changed ensure_text to decode to consoles codepage instead of utf8, to ensure proper printing of tab completion of files/directories with non ascii characters -2007-07-19 Jörgen Stenarson +2007-07-19 Jorgen Stenarson * Fix bug that made copying fail in some cases * Fix bug in parse_and_bind, reported by Michael Graz. * Change version string to 1.5.svn -2007-05-29 Jörgen Stenarson +2007-05-29 Jorgen Stenarson * Increasing version number to 1.4.4 * Fixing typo in changelog -2007-05-29 Jörgen Stenarson +2007-05-29 Jorgen Stenarson * Fixing bug in copy_selection_to_clipboard. Didn't work when selection started at beginning of line -2007-05-24 Jörgen Stenarson +2007-05-24 Jorgen Stenarson * Additions to manual -2007-05-14 Jörgen Stenarson +2007-05-14 Jorgen Stenarson * Fixing pageup pagedown scrolling of window * Begining work on killring. ctrl-k ctrl-y will not use clipboard anymore -2007-05-14 Jörgen Stenarson +2007-05-14 Jorgen Stenarson * pre_inputhook and startup_hook were not functioning properly. -2007-05-09 Jörgen Stenarson +2007-05-09 Jorgen Stenarson * Fix ticket #153, python2.3 installation problem * Updates to documentation -2007-04-20 Jörgen Stenarson +2007-04-20 Jorgen Stenarson * Change in how Ironpython proagates keyboardinterrupts in console. Still some issues to resolve to get same traceback as for plain ironpython when pressing ctrl-c. -2007-04-18 Jörgen Stenarson +2007-04-18 Jorgen Stenarson * Removing some test methods that should not have been comitted at rev 2246 -2007-04-17 Jörgen Stenarson +2007-04-17 Jorgen Stenarson * When allowing to bind ctrl-c we now issue a KeyBoardInterrupt if control-c is pressed twice within ctrl_c_tap_time_interval which is defaulted to 0.3 s and can be set from the configfile. -2007-04-16 Jörgen Stenarson +2007-04-16 Jorgen Stenarson * doctest imports pdb which imports readline, this means readline can be imported when a dummy object has replaced stdout. The dummy might miss the encoding property. We now assume stdout.encoding=="ascii" in this case. -2007-04-14 Jörgen Stenarson +2007-04-14 Jorgen Stenarson * Changing binding for control-delete to forward_delete_word, adding tests to verify binding @@ -111,24 +114,24 @@ * Fix to setup.py for new package structure * add clear_history all the way to top_level. Patch provided by Aldarion -2007-03-15 Jörgen Stenarson +2007-03-15 Jorgen Stenarson * Fix buggy get_begidx, get_endidx * Fix to ensure unicode strings can print something using the write_x methods on Console. -2007-03-06 Jörgen Stenarson +2007-03-06 Jorgen Stenarson * Changed tests for ironpython * Added possibility to bind ctrl-c to a function * Refactor clipboard handling * Restructured example config file -2006-11-15 Jörgen Stenarson +2006-11-15 Jorgen Stenarson * moved ironpython specifics from emacs.py->readline to a hook_wrapper just as in the hookwrapper for the normal console. -2006-11-15 Jörgen Stenarson +2006-11-15 Jorgen Stenarson * Rearranging pyreadlineconfig.ini -2006-11-13 Jörgen Stenarson +2006-11-13 Jorgen Stenarson * Fixed bug in tab completion when point is not at end of line * Changed clr.AddReference to clr.AddReferenceToFileAndPath (ironpython_console) * Fix points position after tab completion @@ -136,7 +139,7 @@ * added test_complete case to emacs_test.py * Ported changes to configuration/startup from trunk -2006-11-03 Jörgen Stenarson +2006-11-03 Jorgen Stenarson * Improvements in ironpython handling. * Detection of ironpython explicit on sys.version instead of relying on presense of ctypes * Lots of fixes to take care of peculiaritis of System.Console in .NET it does not have @@ -150,17 +153,17 @@ of passing it into readline explicitly. * Fixed another bug in historysearch -2006-10-25 Jörgen Stenarson +2006-10-25 Jorgen Stenarson * port set_text_color and set_prompt_color config file options from trunk * Fix bug in history search and add tests for the case. * port ansi color changes from trunk -2006-10-19 Jörgen Stenarson +2006-10-19 Jorgen Stenarson * Fixed bug in history_search_* * Fixed bug in beginning_of_line_extend_selection and end_of_line_extend_selection * Fixd bugs to make vi_test work again, one test failure remains -2006-10-19 Jörgen Stenarson +2006-10-19 Jorgen Stenarson * Adding argument handling. * Adding argument to functions:forward_char, backward_char, forward_word, backward_word forward_word_end, backward_word_end, beginning_of_line_extend_selection, end_of_line_extend_selection @@ -168,7 +171,7 @@ backward_word_extend_selection, forward_word_end_extend_selection, backward_word_end_extend_selection, delete_char, backward_delete_char, backward_delete_word, forward_delete_word, -2006-10-18 Jörgen Stenarson +2006-10-18 Jorgen Stenarson * Adding functionality to dump_functions * fixing some clipboard bugs * Added transpose_chars, transpose_words, upcase_word, downcase_word @@ -180,11 +183,11 @@ * Change paste to only paste single line and dropping trailing newline * Change paste_mulitline_code docstring -2006-10-17 Jörgen Stenarson +2006-10-17 Jorgen Stenarson * Fixed history search bug. Exception when no match was found * Added backward_kill_word. (No difference to backward_delete_word) -2006-09-11 Jörgen Stenarson +2006-09-11 Jorgen Stenarson * Added logserver. Socket based server that can receive logmessage. To be used when debugging keypresses, could be a security risk as a keyboard sniffer. * Added log_sock call to send logging to logserver @@ -193,15 +196,15 @@ * Merging bugfix for self_insert of tabs from trunk * Add bindable function that prints keybindings -2006-07-13 Jörgen Stenarson +2006-07-13 Jorgen Stenarson * Work to get selection between ironpython and cpython to work * Some editing works but there are issues with control keys for ironpython -2006-07-04 Jörgen Stenarson +2006-07-04 Jorgen Stenarson * First commit for ironpython. Typing in alphabet works but no special keys. -2006-04-18 Jörgen Stenarson +2006-04-18 Jorgen Stenarson * Added more tests for emacsmode * Made changes in lineeditor * Added some new commands for move-selection @@ -209,54 +212,54 @@ functions are tested * winconstants.py are added to remove dependency on win32all -2006-04-04 Jörgen Stenarson +2006-04-04 Jorgen Stenarson * started tests for emacsmode and lineeditor * assert in lineeditor for point<=len(l_buffer) required changes in vi_mode * Changes in history_search_forward and history_search_backward, added tests * Added a few more properties to basemode -2006-03-31 Jörgen Stenarson +2006-03-31 Jorgen Stenarson * Merged patch from Michael Graz for the vi mode * test directory now have a vi_test, should add more tests -2006-03-16 Jörgen Stenarson +2006-03-16 Jorgen Stenarson * Added vi patch * Added visible selection mode to emacs mode -2006-03-16 Jörgen Stenarson +2006-03-16 Jorgen Stenarson * Refactored emacs mode -2006-03-12 Jörgen Stenarson +2006-03-12 Jorgen Stenarson * Merged changes from trunk 1158:1201 * Did some rearranging of method order in Readline -2006-02-14 Jörgen Stenarson +2006-02-14 Jorgen Stenarson * Started Refactor branch * Refactored line_buffer to separate class * Refactored history buffer to separate class * -2006-01-31 Jörgen Stenarson +2006-01-31 Jorgen Stenarson - * Added experimental mulitline paste. Thís version ALWAYS adds + * Added experimental mulitline paste. This version ALWAYS adds a final newline so there is what you paste is always executed!!! * Moved win32paste config parameters from module level into readline class (in preparation for adding config file parameter) * Added svn url to long description -2006-01-29 Jörgen Stenarson +2006-01-29 Jorgen Stenarson * Moved exit key (control-D) logic to separate key dispatch handler * Added bind_exit_key to config file * Added un_bind_key command to configfile * Added un_bind_exit_key command to configfile -2006-01-25 Jörgen Stenarson +2006-01-25 Jorgen Stenarson * Added doc directory to setup scripts -2006-01-25 Jörgen Stenarson +2006-01-25 Jorgen Stenarson * Added copyright notices to all files * Created release.py file to contain relesase related information @@ -264,7 +267,7 @@ * Changed setup.py to use release.py * -2006-01-23 Jörgen Stenarson +2006-01-23 Jorgen Stenarson * Default is now to insert non bound characters. * rename pyreadline.py to rlmain.py @@ -273,7 +276,7 @@ * bell is now silent as deafult * removed specific keybinding code for keypad -2006-01-22 Jörgen Stenarson +2006-01-22 Jorgen Stenarson * Default is now to insert non bound characters unless they are pressed together with control. @@ -282,7 +285,7 @@ * Removed specific codepage code from keysyms -2006-01-22 Jörgen Stenarson +2006-01-22 Jorgen Stenarson * Cleaned up bell handling to make sure you can disable bell with the bell_style command @@ -292,11 +295,11 @@ though changed so that ctrl-character is not inserted.There are probably more weirdness to take into account than we do now... -2006-01-22 Jörgen Stenarson +2006-01-22 Jorgen Stenarson * Renames of Console and PyReadline complete. -2006-01-22 Jörgen Stenarson +2006-01-22 Jorgen Stenarson * This revision will not compile. Due to limitations in case insensitivethe filesystems subversion can not do casechanging @@ -304,13 +307,13 @@ renames of some files that makes the package unusable. -2006-01-21 Jörgen Stenarson +2006-01-21 Jorgen Stenarson * Added README.txt * Changed package name to pyreadline, changed setup.py to reflect this. -2006-01-21 Jörgen Stenarson +2006-01-21 Jorgen Stenarson * Added clipboard functionality. ctypes clipboard code borrowed from example code posted to ctypes-users. See @@ -334,7 +337,7 @@ * Control-q copies region between mark and cursor to clipboard * Changed version in setup.py to 1.13-svn -2006-01-21 Jörgen Stenarson +2006-01-21 Jorgen Stenarson * Patch to get swedish characters working when python is executed in a cmd window with codepage set to 1252. @@ -342,7 +345,7 @@ lucida terminal, this is done in the properties dialog of the terminal. -2006-01-21 Jörgen Stenarson +2006-01-21 Jorgen Stenarson * Changed all python files to conform to 4 space indent. * Added changelog diff --git a/doc/source/introduction.rst b/doc/source/introduction.rst index 924a7a4..d1db332 100644 --- a/doc/source/introduction.rst +++ b/doc/source/introduction.rst @@ -11,7 +11,7 @@ like python library can also be useful when implementing commandline like interfaces in GUIs. The use of pyreadline for anything but the windows console is still under development. -The pyreadline module does not yet support Python 3.x this will be targeted for the 2.0 version. +The pyreadline version 2.x module support only Python 3.x. Dependencies From 676eb1cb0b09071ab3d1e2a32285029bb55e9669 Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Wed, 30 Mar 2011 09:23:29 +0900 Subject: [PATCH 06/19] fix for python3: new.instancemethod was replaced with types.MethodType --- pyreadline/rlmain.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyreadline/rlmain.py b/pyreadline/rlmain.py index 7b1984a..f43a946 100644 --- a/pyreadline/rlmain.py +++ b/pyreadline/rlmain.py @@ -283,9 +283,9 @@ class BaseReadline(object): self.mode = modes[name] def bind_key(key, name): - import new + import types if isinstance(name, collections.Callable): - modes[mode]._bind_key(key, new.instancemethod(name, modes[mode], modes[mode].__class__)) + modes[mode]._bind_key(key, types.MethodType(name, modes[mode])) elif hasattr(modes[mode], name): modes[mode]._bind_key(key, getattr(modes[mode], name)) else: From c7f618184563f62d3eb94196e8169c1f9f00524c Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Wed, 30 Mar 2011 09:34:12 +0900 Subject: [PATCH 07/19] fix for python3: fp.write() need bytes object instead of str. --- pyreadline/lineeditor/history.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyreadline/lineeditor/history.py b/pyreadline/lineeditor/history.py index bff3247..034cc1e 100644 --- a/pyreadline/lineeditor/history.py +++ b/pyreadline/lineeditor/history.py @@ -91,7 +91,7 @@ class LineHistory(object): fp = open(filename, 'wb') for line in self.history[-self.history_length:]: fp.write(ensure_bytes(line.get_line_text())) - fp.write('\n') + fp.write(b'\n') fp.close() From e3e4299233baa73f04fed8c1fd2f0819c93aed24 Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Sat, 9 Apr 2011 16:18:47 +0900 Subject: [PATCH 08/19] revert python3 support. --- .bzrignore | 1 - doc/ChangeLog | 123 +- doc/do_sphinx.py | 160 +- doc/source/introduction.rst | 2 +- eggsetup.py | 2 +- pyreadline/__init__.py | 6 +- pyreadline/clipboard/__init__.py | 32 +- pyreadline/clipboard/ironpython_clipboard.py | 6 +- pyreadline/clipboard/no_clipboard.py | 2 +- pyreadline/clipboard/win32_clipboard.py | 12 +- pyreadline/configuration/startup.py | 2 +- pyreadline/console/__init__.py | 4 +- pyreadline/console/ansi.py | 80 +- pyreadline/console/console.py | 216 +- pyreadline/console/consolebase.py | 12 +- pyreadline/console/event.py | 28 +- pyreadline/console/ironpython_console.py | 162 +- pyreadline/examples/callback_example.py | 16 +- pyreadline/examples/tk_gui.py | 12 +- pyreadline/get_doc.py | 9 +- pyreadline/keysyms/__init__.py | 12 +- pyreadline/keysyms/common.py | 252 +- pyreadline/keysyms/ironpython_keysyms.py | 404 +-- pyreadline/keysyms/keysyms.py | 264 +- pyreadline/lineeditor/history.py | 84 +- pyreadline/lineeditor/lineobj.py | 84 +- pyreadline/lineeditor/wordmatcher.py | 32 +- pyreadline/logger.py | 12 +- pyreadline/logserver.py | 30 +- pyreadline/modes/__init__.py | 2 +- pyreadline/modes/basemode.py | 197 +- pyreadline/modes/emacs.py | 326 +-- pyreadline/modes/notemacs.py | 232 +- pyreadline/modes/vi.py | 2348 ++++++++-------- pyreadline/release.py | 50 +- pyreadline/rlmain.py | 1181 ++++---- pyreadline/test/common.py | 22 +- pyreadline/test/test_emacs.py | 368 +-- pyreadline/test/test_history.py | 54 +- pyreadline/test/test_lineeditor.py | 248 +- pyreadline/test/test_vi.py | 2566 +++++++++--------- pyreadline/unicode_helper.py | 30 +- readline.py | 2 +- setup.py | 2 +- 44 files changed, 4842 insertions(+), 4847 deletions(-) diff --git a/.bzrignore b/.bzrignore index c095e69..378eac2 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1,2 +1 @@ build -__pycache__/ diff --git a/doc/ChangeLog b/doc/ChangeLog index a205178..730a5fe 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,43 +1,40 @@ -2011-03-30 Takayuki SHIMIZUKAWA - * Python3 ready. - -2008-08-25 Jorgen Stenarson +2008-08-25 Jörgen Stenarson * Merging tab insert patch from Vivian De Smedt. Removed comments with vds initials. -2008-02-21 Jorgen Stenarson +2008-02-21 Jörgen Stenarson * unicodehelper functions now defaults to ascii if supplied pyreadline_encoding is not a valid encoding. This is a brute force solution to ticket #228 it fixes immediate symptom but may not be the correct solution to the underlying problem. -2008-01-07 Jorgen Stenarson +2008-01-07 Jörgen Stenarson * Reintroduced code to make pyreadline work with emacs. Not tested. Requested by Frank Wang. -2008-01-04 Jorgen Stenarson +2008-01-04 Jörgen Stenarson * Chunking calls to WriteConsoleW to ensure not exceeding 64k limit -2007-11-28 Jorgen Stenarson +2007-11-28 Jörgen Stenarson * Warning messages for failed calls to parse_and_bind now disabled by default Can be enabled by call to debug_output("on_nologfile") in pyreadlineconfig.ini -2007-11-20 Jorgen Stenarson +2007-11-20 Jörgen Stenarson * Applying patch from pan to fix flickering cursor problem when doing input of chinese. -2007-11-09 Jorgen Stenarson +2007-11-09 Jörgen Stenarson * make all conversion is done by ensure_unicode or ensure_str to ensure uniform handling of unicode issues. -2007-11-09 Jorgen Stenarson +2007-11-09 Jörgen Stenarson * More fixes to unicode handling. -2007-11-09 Jorgen Stenarson +2007-11-09 Jörgen Stenarson * Fixes to make clipboard play nice with unicode. Quick that treats the clipboard as being str with pyreadline_encoding data. Thus convert to unicode when pasting and converting to str when copying. -2007-11-09 Jorgen Stenarson +2007-11-09 Jörgen Stenarson * More fixes to ensure unicode works when completing on filepaths with non ascii symbols. This fix assumes sys.stdout.encoding is valid for the filesystem. A more correct fix must be applied to the completer code which is outside pyreadline. @@ -46,66 +43,66 @@ * The encoding assumed of strings is sys.stdout.encoding this can be changed by: e.g. pyreadline.unicode_helper.pyreadline_codepage="utf8" -2007-10-30 Jorgen Stenarson +2007-10-30 Jörgen Stenarson * Fixing console.title to work with wide characters * Fixing wide character bug for log_sock -2007-10-30 Jorgen Stenarson +2007-10-30 Jörgen Stenarson * Add tests for history buffer. Add ignore_leading_spaces option for history searches for forward_search_history, and reverse_search_history. -2007-10-29 Jorgen Stenarson +2007-10-29 Jörgen Stenarson * Patch as provided by pan. Changed ensure_text to decode to consoles codepage instead of utf8, to ensure proper printing of tab completion of files/directories with non ascii characters -2007-07-19 Jorgen Stenarson +2007-07-19 Jörgen Stenarson * Fix bug that made copying fail in some cases * Fix bug in parse_and_bind, reported by Michael Graz. * Change version string to 1.5.svn -2007-05-29 Jorgen Stenarson +2007-05-29 Jörgen Stenarson * Increasing version number to 1.4.4 * Fixing typo in changelog -2007-05-29 Jorgen Stenarson +2007-05-29 Jörgen Stenarson * Fixing bug in copy_selection_to_clipboard. Didn't work when selection started at beginning of line -2007-05-24 Jorgen Stenarson +2007-05-24 Jörgen Stenarson * Additions to manual -2007-05-14 Jorgen Stenarson +2007-05-14 Jörgen Stenarson * Fixing pageup pagedown scrolling of window * Begining work on killring. ctrl-k ctrl-y will not use clipboard anymore -2007-05-14 Jorgen Stenarson +2007-05-14 Jörgen Stenarson * pre_inputhook and startup_hook were not functioning properly. -2007-05-09 Jorgen Stenarson +2007-05-09 Jörgen Stenarson * Fix ticket #153, python2.3 installation problem * Updates to documentation -2007-04-20 Jorgen Stenarson +2007-04-20 Jörgen Stenarson * Change in how Ironpython proagates keyboardinterrupts in console. Still some issues to resolve to get same traceback as for plain ironpython when pressing ctrl-c. -2007-04-18 Jorgen Stenarson +2007-04-18 Jörgen Stenarson * Removing some test methods that should not have been comitted at rev 2246 -2007-04-17 Jorgen Stenarson +2007-04-17 Jörgen Stenarson * When allowing to bind ctrl-c we now issue a KeyBoardInterrupt if control-c is pressed twice within ctrl_c_tap_time_interval which is defaulted to 0.3 s and can be set from the configfile. -2007-04-16 Jorgen Stenarson +2007-04-16 Jörgen Stenarson * doctest imports pdb which imports readline, this means readline can be imported when a dummy object has replaced stdout. The dummy might miss the encoding property. We now assume stdout.encoding=="ascii" in this case. -2007-04-14 Jorgen Stenarson +2007-04-14 Jörgen Stenarson * Changing binding for control-delete to forward_delete_word, adding tests to verify binding @@ -114,24 +111,24 @@ * Fix to setup.py for new package structure * add clear_history all the way to top_level. Patch provided by Aldarion -2007-03-15 Jorgen Stenarson +2007-03-15 Jörgen Stenarson * Fix buggy get_begidx, get_endidx * Fix to ensure unicode strings can print something using the write_x methods on Console. -2007-03-06 Jorgen Stenarson +2007-03-06 Jörgen Stenarson * Changed tests for ironpython * Added possibility to bind ctrl-c to a function * Refactor clipboard handling * Restructured example config file -2006-11-15 Jorgen Stenarson +2006-11-15 Jörgen Stenarson * moved ironpython specifics from emacs.py->readline to a hook_wrapper just as in the hookwrapper for the normal console. -2006-11-15 Jorgen Stenarson +2006-11-15 Jörgen Stenarson * Rearranging pyreadlineconfig.ini -2006-11-13 Jorgen Stenarson +2006-11-13 Jörgen Stenarson * Fixed bug in tab completion when point is not at end of line * Changed clr.AddReference to clr.AddReferenceToFileAndPath (ironpython_console) * Fix points position after tab completion @@ -139,7 +136,7 @@ * added test_complete case to emacs_test.py * Ported changes to configuration/startup from trunk -2006-11-03 Jorgen Stenarson +2006-11-03 Jörgen Stenarson * Improvements in ironpython handling. * Detection of ironpython explicit on sys.version instead of relying on presense of ctypes * Lots of fixes to take care of peculiaritis of System.Console in .NET it does not have @@ -153,17 +150,17 @@ of passing it into readline explicitly. * Fixed another bug in historysearch -2006-10-25 Jorgen Stenarson +2006-10-25 Jörgen Stenarson * port set_text_color and set_prompt_color config file options from trunk * Fix bug in history search and add tests for the case. * port ansi color changes from trunk -2006-10-19 Jorgen Stenarson +2006-10-19 Jörgen Stenarson * Fixed bug in history_search_* * Fixed bug in beginning_of_line_extend_selection and end_of_line_extend_selection * Fixd bugs to make vi_test work again, one test failure remains -2006-10-19 Jorgen Stenarson +2006-10-19 Jörgen Stenarson * Adding argument handling. * Adding argument to functions:forward_char, backward_char, forward_word, backward_word forward_word_end, backward_word_end, beginning_of_line_extend_selection, end_of_line_extend_selection @@ -171,7 +168,7 @@ backward_word_extend_selection, forward_word_end_extend_selection, backward_word_end_extend_selection, delete_char, backward_delete_char, backward_delete_word, forward_delete_word, -2006-10-18 Jorgen Stenarson +2006-10-18 Jörgen Stenarson * Adding functionality to dump_functions * fixing some clipboard bugs * Added transpose_chars, transpose_words, upcase_word, downcase_word @@ -183,11 +180,11 @@ * Change paste to only paste single line and dropping trailing newline * Change paste_mulitline_code docstring -2006-10-17 Jorgen Stenarson +2006-10-17 Jörgen Stenarson * Fixed history search bug. Exception when no match was found * Added backward_kill_word. (No difference to backward_delete_word) -2006-09-11 Jorgen Stenarson +2006-09-11 Jörgen Stenarson * Added logserver. Socket based server that can receive logmessage. To be used when debugging keypresses, could be a security risk as a keyboard sniffer. * Added log_sock call to send logging to logserver @@ -196,15 +193,15 @@ * Merging bugfix for self_insert of tabs from trunk * Add bindable function that prints keybindings -2006-07-13 Jorgen Stenarson +2006-07-13 Jörgen Stenarson * Work to get selection between ironpython and cpython to work * Some editing works but there are issues with control keys for ironpython -2006-07-04 Jorgen Stenarson +2006-07-04 Jörgen Stenarson * First commit for ironpython. Typing in alphabet works but no special keys. -2006-04-18 Jorgen Stenarson +2006-04-18 Jörgen Stenarson * Added more tests for emacsmode * Made changes in lineeditor * Added some new commands for move-selection @@ -212,54 +209,54 @@ functions are tested * winconstants.py are added to remove dependency on win32all -2006-04-04 Jorgen Stenarson +2006-04-04 Jörgen Stenarson * started tests for emacsmode and lineeditor * assert in lineeditor for point<=len(l_buffer) required changes in vi_mode * Changes in history_search_forward and history_search_backward, added tests * Added a few more properties to basemode -2006-03-31 Jorgen Stenarson +2006-03-31 Jörgen Stenarson * Merged patch from Michael Graz for the vi mode * test directory now have a vi_test, should add more tests -2006-03-16 Jorgen Stenarson +2006-03-16 Jörgen Stenarson * Added vi patch * Added visible selection mode to emacs mode -2006-03-16 Jorgen Stenarson +2006-03-16 Jörgen Stenarson * Refactored emacs mode -2006-03-12 Jorgen Stenarson +2006-03-12 Jörgen Stenarson * Merged changes from trunk 1158:1201 * Did some rearranging of method order in Readline -2006-02-14 Jorgen Stenarson +2006-02-14 Jörgen Stenarson * Started Refactor branch * Refactored line_buffer to separate class * Refactored history buffer to separate class * -2006-01-31 Jorgen Stenarson +2006-01-31 Jörgen Stenarson - * Added experimental mulitline paste. This version ALWAYS adds + * Added experimental mulitline paste. Thís version ALWAYS adds a final newline so there is what you paste is always executed!!! * Moved win32paste config parameters from module level into readline class (in preparation for adding config file parameter) * Added svn url to long description -2006-01-29 Jorgen Stenarson +2006-01-29 Jörgen Stenarson * Moved exit key (control-D) logic to separate key dispatch handler * Added bind_exit_key to config file * Added un_bind_key command to configfile * Added un_bind_exit_key command to configfile -2006-01-25 Jorgen Stenarson +2006-01-25 Jörgen Stenarson * Added doc directory to setup scripts -2006-01-25 Jorgen Stenarson +2006-01-25 Jörgen Stenarson * Added copyright notices to all files * Created release.py file to contain relesase related information @@ -267,7 +264,7 @@ * Changed setup.py to use release.py * -2006-01-23 Jorgen Stenarson +2006-01-23 Jörgen Stenarson * Default is now to insert non bound characters. * rename pyreadline.py to rlmain.py @@ -276,7 +273,7 @@ * bell is now silent as deafult * removed specific keybinding code for keypad -2006-01-22 Jorgen Stenarson +2006-01-22 Jörgen Stenarson * Default is now to insert non bound characters unless they are pressed together with control. @@ -285,7 +282,7 @@ * Removed specific codepage code from keysyms -2006-01-22 Jorgen Stenarson +2006-01-22 Jörgen Stenarson * Cleaned up bell handling to make sure you can disable bell with the bell_style command @@ -295,11 +292,11 @@ though changed so that ctrl-character is not inserted.There are probably more weirdness to take into account than we do now... -2006-01-22 Jorgen Stenarson +2006-01-22 Jörgen Stenarson * Renames of Console and PyReadline complete. -2006-01-22 Jorgen Stenarson +2006-01-22 Jörgen Stenarson * This revision will not compile. Due to limitations in case insensitivethe filesystems subversion can not do casechanging @@ -307,13 +304,13 @@ renames of some files that makes the package unusable. -2006-01-21 Jorgen Stenarson +2006-01-21 Jörgen Stenarson * Added README.txt * Changed package name to pyreadline, changed setup.py to reflect this. -2006-01-21 Jorgen Stenarson +2006-01-21 Jörgen Stenarson * Added clipboard functionality. ctypes clipboard code borrowed from example code posted to ctypes-users. See @@ -337,7 +334,7 @@ * Control-q copies region between mark and cursor to clipboard * Changed version in setup.py to 1.13-svn -2006-01-21 Jorgen Stenarson +2006-01-21 Jörgen Stenarson * Patch to get swedish characters working when python is executed in a cmd window with codepage set to 1252. @@ -345,7 +342,7 @@ lucida terminal, this is done in the properties dialog of the terminal. -2006-01-21 Jorgen Stenarson +2006-01-21 Jörgen Stenarson * Changed all python files to conform to 4 space indent. * Added changelog diff --git a/doc/do_sphinx.py b/doc/do_sphinx.py index f8a5d10..6a79b9f 100644 --- a/doc/do_sphinx.py +++ b/doc/do_sphinx.py @@ -1,80 +1,80 @@ -#!/usr/bin/env python -"""Script to build documentation using Sphinx. -""" - -import fileinput, os, sys - -def oscmd(c): - os.system(c) - -if os.path.isdir("build"): - os.removedirs("build") - -os.makedirs("build/html") -os.makedirs("build/latex") - -# html manual. -oscmd('sphinx-build -d build/doctrees source build/html') - -if sys.platform != 'win32': - # LaTeX format. - oscmd('sphinx-build -b latex -d build/doctrees source build/latex') - - # Produce pdf. - topdir = os.getcwd() - os.chdir('build/latex') - - # Change chapter style to section style: allows chapters to start on - # the current page. Works much better for the short chapters we have. - # This must go in the class file rather than the preamble, so we modify - # manual.cls at runtime. - chapter_cmds=r''' -% Local changes. -\renewcommand\chapter{ - \thispagestyle{plain} - \global\@topnum\z@ - \@afterindentfalse - \secdef\@chapter\@schapter -} -\def\@makechapterhead#1{ - \vspace*{10\p@} - {\raggedright \reset@font \Huge \bfseries \thechapter \quad #1} - \par\nobreak - \hrulefill - \par\nobreak - \vspace*{10\p@} -} -\def\@makeschapterhead#1{ - \vspace*{10\p@} - {\raggedright \reset@font \Huge \bfseries #1} - \par\nobreak - \hrulefill - \par\nobreak - \vspace*{10\p@} -} -''' - - unmodified=True - for line in fileinput.FileInput('manual.cls',inplace=1): - if 'Support for module synopsis' in line and unmodified: - line=chapter_cmds+line - elif 'makechapterhead' in line: - # Already have altered manual.cls: don't need to again. - unmodified=False - print(line, end=' ') - - # Copying the makefile produced by sphinx... - oscmd('pdflatex pyreadline.tex') - oscmd('pdflatex pyreadline.tex') - oscmd('pdflatex pyreadline.tex') - oscmd('makeindex -s python.ist pyreadline.idx') - oscmd('makeindex -s python.ist modpyreadline.idx') - oscmd('pdflatex pyreadline.tex') - oscmd('pdflatex pyreadline.tex') - - # Create a manual/ directory with final html/pdf output -# os.chdir(topdir) -# oscmd('rm -rf manual') -# oscmd('mkdir manual') -# oscmd('cp -r build/html/*.html build/html/_static manual/') -# oscmd('cp build/latex/ipython.pdf manual/') +#!/usr/bin/env python +"""Script to build documentation using Sphinx. +""" + +import fileinput, os, sys + +def oscmd(c): + os.system(c) + +if os.path.isdir("build"): + os.removedirs("build") + +os.makedirs("build/html") +os.makedirs("build/latex") + +# html manual. +oscmd('sphinx-build -d build/doctrees source build/html') + +if sys.platform != 'win32': + # LaTeX format. + oscmd('sphinx-build -b latex -d build/doctrees source build/latex') + + # Produce pdf. + topdir = os.getcwd() + os.chdir('build/latex') + + # Change chapter style to section style: allows chapters to start on + # the current page. Works much better for the short chapters we have. + # This must go in the class file rather than the preamble, so we modify + # manual.cls at runtime. + chapter_cmds=r''' +% Local changes. +\renewcommand\chapter{ + \thispagestyle{plain} + \global\@topnum\z@ + \@afterindentfalse + \secdef\@chapter\@schapter +} +\def\@makechapterhead#1{ + \vspace*{10\p@} + {\raggedright \reset@font \Huge \bfseries \thechapter \quad #1} + \par\nobreak + \hrulefill + \par\nobreak + \vspace*{10\p@} +} +\def\@makeschapterhead#1{ + \vspace*{10\p@} + {\raggedright \reset@font \Huge \bfseries #1} + \par\nobreak + \hrulefill + \par\nobreak + \vspace*{10\p@} +} +''' + + unmodified=True + for line in fileinput.FileInput('manual.cls',inplace=1): + if 'Support for module synopsis' in line and unmodified: + line=chapter_cmds+line + elif 'makechapterhead' in line: + # Already have altered manual.cls: don't need to again. + unmodified=False + print line, + + # Copying the makefile produced by sphinx... + oscmd('pdflatex pyreadline.tex') + oscmd('pdflatex pyreadline.tex') + oscmd('pdflatex pyreadline.tex') + oscmd('makeindex -s python.ist pyreadline.idx') + oscmd('makeindex -s python.ist modpyreadline.idx') + oscmd('pdflatex pyreadline.tex') + oscmd('pdflatex pyreadline.tex') + + # Create a manual/ directory with final html/pdf output +# os.chdir(topdir) +# oscmd('rm -rf manual') +# oscmd('mkdir manual') +# oscmd('cp -r build/html/*.html build/html/_static manual/') +# oscmd('cp build/latex/ipython.pdf manual/') diff --git a/doc/source/introduction.rst b/doc/source/introduction.rst index d1db332..924a7a4 100644 --- a/doc/source/introduction.rst +++ b/doc/source/introduction.rst @@ -11,7 +11,7 @@ like python library can also be useful when implementing commandline like interfaces in GUIs. The use of pyreadline for anything but the windows console is still under development. -The pyreadline version 2.x module support only Python 3.x. +The pyreadline module does not yet support Python 3.x this will be targeted for the 2.0 version. Dependencies diff --git a/eggsetup.py b/eggsetup.py index 7661d85..b5bcf75 100644 --- a/eggsetup.py +++ b/eggsetup.py @@ -8,7 +8,7 @@ #***************************************************************************** import glob from setuptools import setup,find_packages -exec(compile(open('pyreadline/release.py').read(), 'pyreadline/release.py', 'exec')) +execfile('pyreadline/release.py') setup(name=name, version = version, diff --git a/pyreadline/__init__.py b/pyreadline/__init__.py index 6e8417e..7a50e1c 100644 --- a/pyreadline/__init__.py +++ b/pyreadline/__init__.py @@ -6,6 +6,6 @@ # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #***************************************************************************** -from . import unicode_helper, logger, clipboard, lineeditor, modes, console -from .rlmain import * -from . import rlmain +import unicode_helper, logger, clipboard, lineeditor, modes, console +from rlmain import * +import rlmain diff --git a/pyreadline/clipboard/__init__.py b/pyreadline/clipboard/__init__.py index e22b1be..ec9fff2 100644 --- a/pyreadline/clipboard/__init__.py +++ b/pyreadline/clipboard/__init__.py @@ -1,17 +1,17 @@ import sys success = True -in_ironpython = "IronPython" in sys.version +in_ironpython = u"IronPython" in sys.version if in_ironpython: try: - from .ironpython_clipboard import GetClipboardText, SetClipboardText + from ironpython_clipboard import GetClipboardText, SetClipboardText except ImportError: - from .no_clipboard import GetClipboardText, SetClipboardText + from no_clipboard import GetClipboardText, SetClipboardText else: try: - from .win32_clipboard import GetClipboardText, SetClipboardText + from win32_clipboard import GetClipboardText, SetClipboardText except ImportError: - from .no_clipboard import GetClipboardText, SetClipboardText + from no_clipboard import GetClipboardText, SetClipboardText def send_data(lists): @@ -22,15 +22,15 @@ def set_clipboard_text(toclipboard): SetClipboardText(str(toclipboard)) def make_tab(lists): - if hasattr(lists, "tolist"): + if hasattr(lists, u"tolist"): lists = lists.tolist() ut = [] for rad in lists: if type(rad) in [list, tuple]: - ut.append("\t".join(["%s"%x for x in rad])) + ut.append(u"\t".join([u"%s"%x for x in rad])) else: - ut.append("%s"%rad) - return "\n".join(ut) + ut.append(u"%s"%rad) + return u"\n".join(ut) def make_list_of_list(txt): def make_num(x): @@ -47,26 +47,26 @@ def make_list_of_list(txt): return x ut = [] flag = False - for rad in [x for x in txt.split("\r\n") if x != ""]: - raden=[make_num(x) for x in rad.split("\t")] - if str in list(map(type,raden)): + for rad in [x for x in txt.split(u"\r\n") if x != u""]: + raden=[make_num(x) for x in rad.split(u"\t")] + if str in map(type,raden): flag = True ut.append(raden) return ut, flag def get_clipboard_text_and_convert(paste_list=False): - """Get txt from clipboard. if paste_list==True the convert tab separated + u"""Get txt from clipboard. if paste_list==True the convert tab separated data to list of lists. Enclose list of list in array() if all elements are numeric""" txt = GetClipboardText() if txt: - if paste_list and "\t" in txt: + if paste_list and u"\t" in txt: array, flag = make_list_of_list(txt) if flag: txt = repr(array) else: - txt = "array(%s)"%repr(array) - txt = "".join([c for c in txt if c not in " \t\r\n"]) + txt = u"array(%s)"%repr(array) + txt = u"".join([c for c in txt if c not in u" \t\r\n"]) return txt diff --git a/pyreadline/clipboard/ironpython_clipboard.py b/pyreadline/clipboard/ironpython_clipboard.py index 83789c2..10187d4 100644 --- a/pyreadline/clipboard/ironpython_clipboard.py +++ b/pyreadline/clipboard/ironpython_clipboard.py @@ -6,7 +6,7 @@ # the file COPYING, distributed as part of this software. #***************************************************************************** import clr -clr.AddReferenceByPartialName("System.Windows.Forms") +clr.AddReferenceByPartialName(u"System.Windows.Forms") import System.Windows.Forms.Clipboard as cb def GetClipboardText(): @@ -19,9 +19,9 @@ def GetClipboardText(): def SetClipboardText(text): cb.SetText(text) -if __name__ == '__main__': +if __name__ == u'__main__': txt = GetClipboardText() # display last text clipped - print(txt) + print txt diff --git a/pyreadline/clipboard/no_clipboard.py b/pyreadline/clipboard/no_clipboard.py index 9c61e1d..195b0ad 100644 --- a/pyreadline/clipboard/no_clipboard.py +++ b/pyreadline/clipboard/no_clipboard.py @@ -7,7 +7,7 @@ #***************************************************************************** -mybuffer = "" +mybuffer = u"" def GetClipboardText(): return mybuffer diff --git a/pyreadline/clipboard/win32_clipboard.py b/pyreadline/clipboard/win32_clipboard.py index 58c8318..c0f4ef4 100644 --- a/pyreadline/clipboard/win32_clipboard.py +++ b/pyreadline/clipboard/win32_clipboard.py @@ -34,7 +34,7 @@ from ctypes import * from pyreadline.keysyms.winconstants import CF_TEXT, GHND -from pyreadline.unicode_helper import ensure_str,ensure_bytes +from pyreadline.unicode_helper import ensure_unicode,ensure_str OpenClipboard = windll.user32.OpenClipboard OpenClipboard.argtypes = [c_int] @@ -80,7 +80,7 @@ def getformatname(format): return buffer.value def GetClipboardText(): - text = "" + text = u"" if OpenClipboard(0): hClipMem = GetClipboardData(CF_TEXT) if hClipMem: @@ -88,10 +88,10 @@ def GetClipboardText(): text = GlobalLock(hClipMem) GlobalUnlock(hClipMem) CloseClipboard() - return ensure_str(text) + return ensure_unicode(text) def SetClipboardText(text): - buffer = c_buffer(ensure_bytes(text)) + buffer = c_buffer(ensure_str(text)) bufferSize = sizeof(buffer) hGlobalMem = GlobalAlloc(c_int(GHND), c_int(bufferSize)) GlobalLock.restype = c_void_p @@ -103,6 +103,6 @@ def SetClipboardText(text): SetClipboardData(c_int(CF_TEXT), c_int(hGlobalMem)) CloseClipboard() -if __name__ == '__main__': +if __name__ == u'__main__': txt = GetClipboardText() # display last text clipped - print(txt) + print txt diff --git a/pyreadline/configuration/startup.py b/pyreadline/configuration/startup.py index 1a1ae12..acda5e9 100644 --- a/pyreadline/configuration/startup.py +++ b/pyreadline/configuration/startup.py @@ -11,7 +11,7 @@ try: #if you need to change this uncomment the following line #pyreadline.unicode_helper.pyreadline_codepage="utf8" except ImportError: - print("Module readline not available.") + print "Module readline not available." else: #import tab completion functionality import rlcompleter diff --git a/pyreadline/console/__init__.py b/pyreadline/console/__init__.py index d85a093..805fb95 100644 --- a/pyreadline/console/__init__.py +++ b/pyreadline/console/__init__.py @@ -5,13 +5,13 @@ in_ironpython = "IronPython" in sys.version if in_ironpython: try: - from .ironpython_console import * + from ironpython_console import * success = True except ImportError: raise else: try: - from .console import * + from console import * success = True except ImportError: pass diff --git a/pyreadline/console/ansi.py b/pyreadline/console/ansi.py index 7e98c40..13fd8dc 100644 --- a/pyreadline/console/ansi.py +++ b/pyreadline/console/ansi.py @@ -1,21 +1,21 @@ # -*- coding: ISO-8859-1 -*- import re,sys,os -terminal_escape = re.compile('(\001?\033\\[[0-9;]*m\002?)') -escape_parts = re.compile('\001?\033\\[([0-9;]*)m\002?') +terminal_escape = re.compile(u'(\001?\033\\[[0-9;]*m\002?)') +escape_parts = re.compile(u'\001?\033\\[([0-9;]*)m\002?') class AnsiState(object): - def __init__(self,bold=False,inverse=False,color="white",background="black",backgroundbold=False): + def __init__(self,bold=False,inverse=False,color=u"white",background=u"black",backgroundbold=False): self.bold = bold self.inverse = inverse self.color = color self.background = background self.backgroundbold = backgroundbold - trtable = {"black":0, "red":4, "green":2, "yellow":6, - "blue":1, "magenta":5, "cyan":3, "white":7} - revtable = dict(list(zip(list(trtable.values()),list(trtable.keys())))) + trtable = {u"black":0, u"red":4, u"green":2, u"yellow":6, + u"blue":1, u"magenta":5, u"cyan":3, u"white":7} + revtable = dict(zip(trtable.values(),trtable.keys())) def get_winattr(self): attr = 0 if self.bold: @@ -37,8 +37,8 @@ class AnsiState(object): winattr=property(get_winattr,set_winattr) def __repr__(self): - return 'AnsiState(bold=%s,inverse=%s,color=%9s,' \ - 'background=%9s,backgroundbold=%s)# 0x%x'% \ + return u'AnsiState(bold=%s,inverse=%s,color=%9s,' \ + u'background=%9s,backgroundbold=%s)# 0x%x'% \ (self.bold, self.inverse, '"%s"'%self.color, '"%s"'%self.background, self.backgroundbold, self.winattr) @@ -52,10 +52,10 @@ class AnsiState(object): x.backgroundbold = self.backgroundbold return x -defaultstate = AnsiState(False,False,"white") +defaultstate = AnsiState(False,False,u"white") -trtable = {0:"black", 1:"red", 2:"green", 3:"yellow", - 4:"blue", 5:"magenta", 6:"cyan", 7:"white"} +trtable = {0:u"black", 1:u"red", 2:u"green", 3:u"yellow", + 4:u"blue", 5:u"magenta", 6:u"cyan", 7:u"white"} class AnsiWriter(object): def __init__(self, default=defaultstate): @@ -67,7 +67,7 @@ class AnsiWriter(object): def write_color(self,text, attr=None): - '''write text at current cursor position and interpret color escapes. + u'''write text at current cursor position and interpret color escapes. return the number of characters written. ''' @@ -85,21 +85,21 @@ class AnsiWriter(object): for chunk in chunks: m = escape_parts.match(chunk) if m: - parts = m.group(1).split(";") - if len(parts) == 1 and parts[0] == "0": + parts = m.group(1).split(u";") + if len(parts) == 1 and parts[0] == u"0": attr = self.defaultstate.copy() continue for part in parts: - if part == "0": # No text attribute + if part == u"0": # No text attribute attr = self.defaultstate.copy() attr.bold=False - elif part == "7": # switch on reverse + elif part == u"7": # switch on reverse attr.inverse=True - elif part == "1": # switch on bold (i.e. intensify foreground color) + elif part == u"1": # switch on bold (i.e. intensify foreground color) attr.bold=True - elif len(part) == 2 and "30" <= part <= "37": # set foreground color + elif len(part) == 2 and u"30" <= part <= u"37": # set foreground color attr.color = trtable[int(part) - 30] - elif len(part) == 2 and "40" <= part <= "47": # set background color + elif len(part) == 2 and u"40" <= part <= u"47": # set background color attr.backgroundcolor = trtable[int(part) - 40] continue n += len(chunk) @@ -116,7 +116,7 @@ def write_color(text, attr=None): return a.write_color(text, attr) def write_color_old( text, attr=None): - '''write text at current cursor position and interpret color escapes. + u'''write text at current cursor position and interpret color escapes. return the number of characters written. ''' @@ -128,18 +128,18 @@ def write_color_old( text, attr=None): for chunk in chunks: m = escape_parts.match(chunk) if m: - for part in m.group(1).split(";"): - if part == "0": # No text attribute + for part in m.group(1).split(u";"): + if part == u"0": # No text attribute attr = 0 - elif part == "7": # switch on reverse + elif part == u"7": # switch on reverse attr |= 0x4000 - if part == "1": # switch on bold (i.e. intensify foreground color) + if part == u"1": # switch on bold (i.e. intensify foreground color) attr |= 0x08 - elif len(part) == 2 and "30" <= part <= "37": # set foreground color + elif len(part) == 2 and u"30" <= part <= u"37": # set foreground color part = int(part)-30 # we have to mirror bits attr = (attr & ~0x07) | ((part & 0x1) << 2) | (part & 0x2) | ((part & 0x4) >> 2) - elif len(part) == 2 and "40" <= part <= "47": # set background color + elif len(part) == 2 and u"40" <= part <= u"47": # set background color part = int(part) - 40 # we have to mirror bits attr = (attr & ~0x70) | ((part & 0x1) << 6) | ((part & 0x2) << 4) | ((part & 0x4) << 2) @@ -147,44 +147,44 @@ def write_color_old( text, attr=None): continue n += len(chunk) if chunk: - res.append(("0x%x"%attr, chunk)) + res.append((u"0x%x"%attr, chunk)) return res #trtable={0:"black",1:"red",2:"green",3:"yellow",4:"blue",5:"magenta",6:"cyan",7:"white"} -if __name__=="__main__x": +if __name__==u"__main__x": import pprint pprint=pprint.pprint - s="\033[0;31mred\033[0;32mgreen\033[0;33myellow\033[0;34mblue\033[0;35mmagenta\033[0;36mcyan\033[0;37mwhite\033[0m" + s=u"\033[0;31mred\033[0;32mgreen\033[0;33myellow\033[0;34mblue\033[0;35mmagenta\033[0;36mcyan\033[0;37mwhite\033[0m" pprint (write_color(s)) pprint (write_color_old(s)) - s="\033[1;31mred\033[1;32mgreen\033[1;33myellow\033[1;34mblue\033[1;35mmagenta\033[1;36mcyan\033[1;37mwhite\033[0m" + s=u"\033[1;31mred\033[1;32mgreen\033[1;33myellow\033[1;34mblue\033[1;35mmagenta\033[1;36mcyan\033[1;37mwhite\033[0m" pprint (write_color(s)) pprint (write_color_old(s)) - s="\033[0;7;31mred\033[0;7;32mgreen\033[0;7;33myellow\033[0;7;34mblue\033[0;7;35mmagenta\033[0;7;36mcyan\033[0;7;37mwhite\033[0m" + s=u"\033[0;7;31mred\033[0;7;32mgreen\033[0;7;33myellow\033[0;7;34mblue\033[0;7;35mmagenta\033[0;7;36mcyan\033[0;7;37mwhite\033[0m" pprint (write_color(s)) pprint (write_color_old(s)) - s="\033[1;7;31mred\033[1;7;32mgreen\033[1;7;33myellow\033[1;7;34mblue\033[1;7;35mmagenta\033[1;7;36mcyan\033[1;7;37mwhite\033[0m" + s=u"\033[1;7;31mred\033[1;7;32mgreen\033[1;7;33myellow\033[1;7;34mblue\033[1;7;35mmagenta\033[1;7;36mcyan\033[1;7;37mwhite\033[0m" pprint (write_color(s)) pprint (write_color_old(s)) -if __name__=="__main__": - from . import console +if __name__==u"__main__": + import console import pprint pprint=pprint.pprint c=console.Console() - c.write_color("dhsjdhs") - c.write_color("\033[0;32mIn [\033[1;32m1\033[0;32m]:") - print() - pprint (write_color("\033[0;32mIn [\033[1;32m1\033[0;32m]:")) + c.write_color(u"dhsjdhs") + c.write_color(u"\033[0;32mIn [\033[1;32m1\033[0;32m]:") + print + pprint (write_color(u"\033[0;32mIn [\033[1;32m1\033[0;32m]:")) -if __name__=="__main__x": +if __name__==u"__main__x": import pprint pprint=pprint.pprint - s="\033[0;31mred\033[0;32mgreen\033[0;33myellow\033[0;34mblue\033[0;35mmagenta\033[0;36mcyan\033[0;37mwhite\033[0m" + s=u"\033[0;31mred\033[0;32mgreen\033[0;33myellow\033[0;34mblue\033[0;35mmagenta\033[0;36mcyan\033[0;37mwhite\033[0m" pprint (write_color(s)) diff --git a/pyreadline/console/console.py b/pyreadline/console/console.py index 9fdcc9c..2204003 100644 --- a/pyreadline/console/console.py +++ b/pyreadline/console/console.py @@ -6,7 +6,7 @@ # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #***************************************************************************** -'''Cursor control and color for the Windows console. +u'''Cursor control and color for the Windows console. This was modeled after the C extension of the same name by Fredrik Lundh. ''' @@ -20,7 +20,7 @@ import re import pyreadline.unicode_helper as unicode_helper from pyreadline.logger import log -from pyreadline.unicode_helper import ensure_str, ensure_bytes +from pyreadline.unicode_helper import ensure_unicode, ensure_str from pyreadline.keysyms import make_KeyPress, KeyPress from pyreadline.console.ansi import AnsiState,AnsiWriter @@ -28,7 +28,7 @@ try: from ctypes import * from _ctypes import call_function except ImportError: - raise ImportError("You need ctypes to run this code") + raise ImportError(u"You need ctypes to run this code") def nolog(string): pass @@ -54,7 +54,7 @@ MENU_EVENT = 0x0008 VK_SHIFT = 0x10 VK_CONTROL = 0x11 VK_MENU = 0x12 -GENERIC_READ = int(0x80000000) +GENERIC_READ = int(0x80000000L) GENERIC_WRITE = 0x40000000 # Windows structures we'll need later @@ -168,12 +168,12 @@ def split_block(text, size=1000): class Console(object): - '''Console driver for Windows. + u'''Console driver for Windows. ''' def __init__(self, newbuffer=0): - '''Initialize the Console object. + u'''Initialize the Console object. newbuffer=1 will allocate a new buffer so the old content will be restored on exit. @@ -208,18 +208,18 @@ class Console(object): for escape in self.escape_to_color: if self.escape_to_color[escape] is not None: self.escape_to_color[escape] |= background - log('initial attr=%x' % self.attr) + log(u'initial attr=%x' % self.attr) self.softspace = 0 # this is for using it as a file-like object self.serial = 0 self.pythondll = \ - CDLL('python%s%s' % (sys.version[0], sys.version[2])) + CDLL(u'python%s%s' % (sys.version[0], sys.version[2])) self.inputHookPtr = \ c_int.from_address(addressof(self.pythondll.PyOS_InputHook)).value - setattr(Console, 'PyMem_Malloc', self.pythondll.PyMem_Malloc) + setattr(Console, u'PyMem_Malloc', self.pythondll.PyMem_Malloc) def __del__(self): - '''Cleanup the console when finished.''' + u'''Cleanup the console when finished.''' # I don't think this ever gets called self.SetConsoleTextAttribute(self.hout, self.saveattr) self.SetConsoleMode(self.hin, self.inmode) @@ -234,7 +234,7 @@ class Console(object): return top,bot def fixcoord(self, x, y): - '''Return a long with x and y packed inside, + u'''Return a long with x and y packed inside, also handle negative x and y.''' if x < 0 or y < 0: info = CONSOLE_SCREEN_BUFFER_INFO() @@ -248,7 +248,7 @@ class Console(object): return c_int(y << 16 | x) def pos(self, x=None, y=None): - '''Move or query the window cursor.''' + u'''Move or query the window cursor.''' if x is None: info = CONSOLE_SCREEN_BUFFER_INFO() self.GetConsoleScreenBufferInfo(self.hout, byref(info)) @@ -258,38 +258,38 @@ class Console(object): self.fixcoord(x, y)) def home(self): - '''Move to home.''' + u'''Move to home.''' self.pos(0, 0) # Map ANSI color escape sequences into Windows Console Attributes - terminal_escape = re.compile('(\001?\033\\[[0-9;]+m\002?)') - escape_parts = re.compile('\001?\033\\[([0-9;]+)m\002?') - escape_to_color = { '0;30': 0x0, #black - '0;31': 0x4, #red - '0;32': 0x2, #green - '0;33': 0x4+0x2, #brown? - '0;34': 0x1, #blue - '0;35': 0x1+0x4, #purple - '0;36': 0x2+0x4, #cyan - '0;37': 0x1+0x2+0x4, #grey - '1;30': 0x1+0x2+0x4, #dark gray - '1;31': 0x4+0x8, #red - '1;32': 0x2+0x8, #light green - '1;33': 0x4+0x2+0x8, #yellow - '1;34': 0x1+0x8, #light blue - '1;35': 0x1+0x4+0x8, #light purple - '1;36': 0x1+0x2+0x8, #light cyan - '1;37': 0x1+0x2+0x4+0x8, #white - '0': None, + terminal_escape = re.compile(u'(\001?\033\\[[0-9;]+m\002?)') + escape_parts = re.compile(u'\001?\033\\[([0-9;]+)m\002?') + escape_to_color = { u'0;30': 0x0, #black + u'0;31': 0x4, #red + u'0;32': 0x2, #green + u'0;33': 0x4+0x2, #brown? + u'0;34': 0x1, #blue + u'0;35': 0x1+0x4, #purple + u'0;36': 0x2+0x4, #cyan + u'0;37': 0x1+0x2+0x4, #grey + u'1;30': 0x1+0x2+0x4, #dark gray + u'1;31': 0x4+0x8, #red + u'1;32': 0x2+0x8, #light green + u'1;33': 0x4+0x2+0x8, #yellow + u'1;34': 0x1+0x8, #light blue + u'1;35': 0x1+0x4+0x8, #light purple + u'1;36': 0x1+0x2+0x8, #light cyan + u'1;37': 0x1+0x2+0x4+0x8, #white + u'0': None, } # This pattern should match all characters that change the cursor position differently # than a normal character. - motion_char_re = re.compile(b'([\n\r\t\010\007])') + motion_char_re = re.compile(u'([\n\r\t\010\007])') def write_scrolling(self, text, attr=None): - '''write text at current cursor position while watching for scrolling. + u'''write text at current cursor position while watching for scrolling. If the window scrolls because you are at the bottom of the screen buffer, all positions that you are storing will be shifted by the @@ -306,23 +306,23 @@ class Console(object): w, h = self.size() scroll = 0 # the result # split the string into ordinary characters and funny characters - chunks = self.motion_char_re.split(ensure_bytes(text)) + chunks = self.motion_char_re.split(text) for chunk in chunks: n = self.write_color(chunk, attr) if len(chunk) == 1: # the funny characters will be alone - if chunk[0] == '\n': # newline + if chunk[0] == u'\n': # newline x = 0 y += 1 - elif chunk[0] == '\r': # carriage return + elif chunk[0] == u'\r': # carriage return x = 0 - elif chunk[0] == '\t': # tab + elif chunk[0] == u'\t': # tab x = 8 * (int(x / 8) + 1) if x > w: # newline x -= w y += 1 - elif chunk[0] == '\007': # bell + elif chunk[0] == u'\007': # bell pass - elif chunk[0] == '\010': + elif chunk[0] == u'\010': x -= 1 if x < 0: y -= 1 # backed up 1 line @@ -345,12 +345,12 @@ class Console(object): return scroll def write_color(self, text, attr=None): - text = ensure_str(text) + text = ensure_unicode(text) n, res= self.ansiwriter.write_color(text, attr) junk = c_int(0) for attr,chunk in res: - log("console.attr:%s"%str(attr)) - log("console.chunk:%s"%str(chunk)) + log(u"console.attr:%s"%unicode(attr)) + log(u"console.chunk:%s"%unicode(chunk)) self.SetConsoleTextAttribute(self.hout, attr.winattr) for short_chunk in split_block(chunk): self.WriteConsoleW(self.hout, short_chunk, @@ -358,23 +358,23 @@ class Console(object): return n def write_plain(self, text, attr=None): - '''write text at current cursor position.''' - text = ensure_str(text) - log('write("%s", %s)' %(text, attr)) + u'''write text at current cursor position.''' + text = ensure_unicode(text) + log(u'write("%s", %s)' %(text, attr)) if attr is None: attr = self.attr n = c_int(0) self.SetConsoleTextAttribute(self.hout, attr) for short_chunk in split_block(chunk): - self.WriteConsoleW(self.hout, ensure_str(short_chunk), + self.WriteConsoleW(self.hout, ensure_unicode(short_chunk), len(short_chunk), byref(junk), None) return len(text) #This function must be used to ensure functioning with EMACS #Emacs sets the EMACS environment variable - if "EMACS" in os.environ: + if os.environ.has_key(u"EMACS"): def write_color(self, text, attr=None): - text = ensure_bytes(text) + text = ensure_str(text) junk = c_int(0) self.WriteFile(self.hout, text, len(text), byref(junk), None) return len(text) @@ -382,8 +382,8 @@ class Console(object): # make this class look like a file object def write(self, text): - text = ensure_str(text) - log('write("%s")' % text) + text = ensure_unicode(text) + log(u'write("%s")' % text) return self.write_color(text) #write = write_scrolling @@ -394,8 +394,8 @@ class Console(object): def flush(self): pass - def page(self, attr=None, fill=' '): - '''Fill the entire screen.''' + def page(self, attr=None, fill=u' '): + u'''Fill the entire screen.''' if attr is None: attr = self.attr if len(fill) != 1: @@ -416,7 +416,7 @@ class Console(object): self.attr = attr def text(self, x, y, text, attr=None): - '''Write text at the given position.''' + u'''Write text at the given position.''' if attr is None: attr = self.attr @@ -434,8 +434,8 @@ class Console(object): if pos[1] < bot: self.rectangle((0, pos[1] + 1, w, bot + 1)) - def rectangle(self, rect, attr=None, fill=' '): - '''Fill Rectangle.''' + def rectangle(self, rect, attr=None, fill=u' '): + u'''Fill Rectangle.''' x0, y0, x1, y1 = rect n = c_int(0) if attr is None: @@ -448,25 +448,25 @@ class Console(object): pos, byref(n)) def scroll(self, rect, dx, dy, attr=None, fill=' '): - '''Scroll a rectangle.''' + u'''Scroll a rectangle.''' if attr is None: attr = self.attr x0, y0, x1, y1 = rect source = SMALL_RECT(x0, y0, x1 - 1, y1 - 1) dest = self.fixcoord(x0 + dx, y0 + dy) style = CHAR_INFO() - style.Char.AsciiChar = ensure_bytes(fill[0]) + style.Char.AsciiChar = ensure_str(fill[0]) style.Attributes = attr return self.ScrollConsoleScreenBufferW(self.hout, byref(source), byref(source), dest, byref(style)) def scroll_window(self, lines): - '''Scroll the window by the indicated number of lines.''' + u'''Scroll the window by the indicated number of lines.''' info = CONSOLE_SCREEN_BUFFER_INFO() self.GetConsoleScreenBufferInfo(self.hout, byref(info)) rect = info.srWindow - log('sw: rtop=%d rbot=%d' % (rect.Top, rect.Bottom)) + log(u'sw: rtop=%d rbot=%d' % (rect.Top, rect.Bottom)) top = rect.Top + lines bot = rect.Bottom + lines h = bot - top @@ -483,12 +483,12 @@ class Console(object): nrect.Bottom = bot nrect.Left = rect.Left nrect.Right = rect.Right - log('sn: top=%d bot=%d' % (top, bot)) + log(u'sn: top=%d bot=%d' % (top, bot)) r=self.SetConsoleWindowInfo(self.hout, True, byref(nrect)) - log('r=%d' % r) + log(u'r=%d' % r) def get(self): - '''Get next event from queue.''' + u'''Get next event from queue.''' inputHookFunc = c_int.from_address(self.inputHookPtr).value Cevent = INPUT_RECORD() @@ -503,25 +503,25 @@ class Console(object): return e def getkeypress(self): - '''Return next key press event from the queue, ignoring others.''' + u'''Return next key press event from the queue, ignoring others.''' while 1: e = self.get() - if e.type == 'KeyPress' and e.keycode not in key_modifiers: - log("console.getkeypress %s"%e) - if e.keyinfo.keyname == 'next': + if e.type == u'KeyPress' and e.keycode not in key_modifiers: + log(u"console.getkeypress %s"%e) + if e.keyinfo.keyname == u'next': self.scroll_window(12) - elif e.keyinfo.keyname == 'prior': + elif e.keyinfo.keyname == u'prior': self.scroll_window(-12) else: return e - elif ((e.type == 'KeyRelease') and + elif ((e.type == u'KeyRelease') and (e.keyinfo == KeyPress('S', False, True, False, 'S'))): - log("getKeypress:%s,%s,%s"%(e.keyinfo, e.keycode, e.type)) + log(u"getKeypress:%s,%s,%s"%(e.keyinfo, e.keycode, e.type)) return e def getchar(self): - '''Get next character from queue.''' + u'''Get next character from queue.''' Cevent = INPUT_RECORD() count = c_int(0) @@ -538,7 +538,7 @@ class Console(object): return sym def peek(self): - '''Check event queue.''' + u'''Check event queue.''' Cevent = INPUT_RECORD() count = c_int(0) status = self.PeekConsoleInputW(self.hin, @@ -547,7 +547,7 @@ class Console(object): return event(self, Cevent) def title(self, txt=None): - '''Set/get title.''' + u'''Set/get title.''' if txt: self.SetConsoleTitleW(txt) else: @@ -557,7 +557,7 @@ class Console(object): return buffer.value[:n] def size(self, width=None, height=None): - '''Set/get window size.''' + u'''Set/get window size.''' info = CONSOLE_SCREEN_BUFFER_INFO() status = self.GetConsoleScreenBufferInfo(self.hout, byref(info)) if not status: @@ -575,7 +575,7 @@ class Console(object): return (info.dwSize.X, info.dwSize.Y) def cursor(self, visible=None, size=None): - '''Set cursor on or off.''' + u'''Set cursor on or off.''' info = CONSOLE_CURSOR_INFO() if self.GetConsoleCursorInfo(self.hout, byref(info)): if visible is not None: @@ -585,10 +585,10 @@ class Console(object): self.SetConsoleCursorInfo(self.hout, byref(info)) def bell(self): - self.write('\007') + self.write(u'\007') def next_serial(self): - '''Get next event serial number.''' + u'''Get next event serial number.''' self.serial += 1 return self.serial @@ -598,32 +598,32 @@ for func in funcs: windll.kernel32.SetConsoleTitleW.argtypes = [c_wchar_p] windll.kernel32.GetConsoleTitleW.argtypes = [c_wchar_p,c_short] -from .event import Event +from event import Event VkKeyScan = windll.user32.VkKeyScanA class event(Event): - '''Represent events from the console.''' + u'''Represent events from the console.''' def __init__(self, console, input): '''Initialize an event from the Windows input structure.''' - self.type = '??' + self.type = u'??' self.serial = console.next_serial() self.width = 0 self.height = 0 self.x = 0 self.y = 0 - self.char = '' + self.char = u'' self.keycode = 0 - self.keysym = '??' + self.keysym = u'??' self.keyinfo = None # a tuple with (control, meta, shift, keycode) for dispatch self.width = None if input.EventType == KEY_EVENT: if input.Event.KeyEvent.bKeyDown: - self.type = "KeyPress" + self.type = u"KeyPress" else: - self.type = "KeyRelease" + self.type = u"KeyRelease" self.char = input.Event.KeyEvent.uChar.UnicodeChar self.keycode = input.Event.KeyEvent.wVirtualKeyCode self.state = input.Event.KeyEvent.dwControlKeyState @@ -631,23 +631,23 @@ class event(Event): elif input.EventType == MOUSE_EVENT: if input.Event.MouseEvent.dwEventFlags & MOUSE_MOVED: - self.type = "Motion" + self.type = u"Motion" else: - self.type = "Button" + self.type = u"Button" self.x = input.Event.MouseEvent.dwMousePosition.X self.y = input.Event.MouseEvent.dwMousePosition.Y self.state = input.Event.MouseEvent.dwButtonState elif input.EventType == WINDOW_BUFFER_SIZE_EVENT: - self.type = "Configure" + self.type = u"Configure" self.width = input.Event.WindowBufferSizeEvent.dwSize.X self.height = input.Event.WindowBufferSizeEvent.dwSize.Y elif input.EventType == FOCUS_EVENT: if input.Event.FocusEvent.bSetFocus: - self.type = "FocusIn" + self.type = u"FocusIn" else: - self.type = "FocusOut" + self.type = u"FocusOut" elif input.EventType == MENU_EVENT: - self.type = "Menu" + self.type = u"Menu" self.state = input.Event.MenuEvent.dwCommandId @@ -685,23 +685,23 @@ readline_hook = None # the python hook goes here readline_ref = None # reference to the c-callable to keep it alive def hook_wrapper_23(stdin, stdout, prompt): - '''Wrap a Python readline so it behaves like GNU readline.''' + u'''Wrap a Python readline so it behaves like GNU readline.''' try: # call the Python hook - res = ensure_bytes(readline_hook(prompt)) + res = ensure_str(readline_hook(prompt)) # make sure it returned the right sort of thing - if res and not isinstance(res, bytes): - raise TypeError('readline must return a string.') + if res and not isinstance(res, str): + raise TypeError, u'readline must return a string.' except KeyboardInterrupt: # GNU readline returns 0 on keyboard interrupt return 0 except EOFError: # It returns an empty string on EOF - res = '' + res = u'' except: - print('Readline internal error', file=sys.stderr) + print >>sys.stderr, u'Readline internal error' traceback.print_exc() - res = '\n' + res = u'\n' # we have to make a copy because the caller expects to free the result n = len(res) p = Console.PyMem_Malloc(n + 1) @@ -709,23 +709,23 @@ def hook_wrapper_23(stdin, stdout, prompt): return p def hook_wrapper(prompt): - '''Wrap a Python readline so it behaves like GNU readline.''' + u'''Wrap a Python readline so it behaves like GNU readline.''' try: # call the Python hook - res = ensure_bytes(readline_hook(prompt)) + res = ensure_str(readline_hook(prompt)) # make sure it returned the right sort of thing - if res and not isinstance(res, bytes): - raise TypeError('readline must return a string.') + if res and not isinstance(res, str): + raise TypeError, u'readline must return a string.' except KeyboardInterrupt: # GNU readline returns 0 on keyboard interrupt return 0 except EOFError: # It returns an empty string on EOF - res = '' + res = u'' except: - print('Readline internal error', file=sys.stderr) + print >>sys.stderr, u'Readline internal error' traceback.print_exc() - res = '\n' + res = u'\n' # we have to make a copy because the caller expects to free the result p = cdll.msvcrt._strdup(res) return p @@ -738,7 +738,7 @@ def install_readline(hook): readline_hook = hook # get the address of PyOS_ReadlineFunctionPointer so we can update it PyOS_RFP = c_int.from_address(Console.GetProcAddress(sys.dllhandle, - b"PyOS_ReadlineFunctionPointer")) + "PyOS_ReadlineFunctionPointer")) # save a reference to the generated C-callable so it doesn't go away if sys.version < '2.3': readline_ref = HOOKFUNC22(hook_wrapper) @@ -760,11 +760,11 @@ if __name__ == '__main__': sys.stdout = c sys.stderr = c c.page() - print(p("d"), p("D")) + print p("d"), p("D") c.pos(5, 10) c.write('hi there') - print('some printed output') + print 'some printed output' for i in range(10): q = c.getkeypress() - print(q) + print q del c diff --git a/pyreadline/console/consolebase.py b/pyreadline/console/consolebase.py index 3409ced..d15350e 100644 --- a/pyreadline/console/consolebase.py +++ b/pyreadline/console/consolebase.py @@ -6,18 +6,18 @@ class baseconsole: raise NotImplementedError def pos(self, x=None, y=None): - '''Move or query the window cursor.''' + u'''Move or query the window cursor.''' raise NotImplementedError def size(self): raise NotImplementedError - def rectangle(self, rect, attr=None, fill=' '): - '''Fill Rectangle.''' + def rectangle(self, rect, attr=None, fill=u' '): + u'''Fill Rectangle.''' raise NotImplementedError def write_scrolling(self, text, attr=None): - '''write text at current cursor position while watching for scrolling. + u'''write text at current cursor position while watching for scrolling. If the window scrolls because you are at the bottom of the screen buffer, all positions that you are storing will be shifted by the @@ -33,14 +33,14 @@ class baseconsole: raise NotImplementedError def getkeypress(self): - '''Return next key press event from the queue, ignoring others.''' + u'''Return next key press event from the queue, ignoring others.''' raise NotImplementedError def write(self, text): raise NotImplementedError def page(self, attr=None, fill=' '): - '''Fill the entire screen.''' + u'''Fill the entire screen.''' raise NotImplementedError def isatty(self): diff --git a/pyreadline/console/event.py b/pyreadline/console/event.py index 2207e29..c03e503 100644 --- a/pyreadline/console/event.py +++ b/pyreadline/console/event.py @@ -1,27 +1,27 @@ class Event(object): - '''Represent events from the console.''' + u'''Represent events from the console.''' def __init__(self, console, input): pass def __repr__(self): - '''Display an event for debugging.''' - if self.type in ['KeyPress', 'KeyRelease']: + u'''Display an event for debugging.''' + if self.type in [u'KeyPress', u'KeyRelease']: chr = self.char - if ord(chr) w: # newline x -= w y += 1 - elif chunk[0] == '\007': # bell + elif chunk[0] == u'\007': # bell pass - elif chunk[0] == '\010': + elif chunk[0] == u'\010': x -= 1 if x < 0: y -= 1 # backed up 1 line @@ -197,9 +197,9 @@ class Console(object): return the number of characters written. ''' - log('write_color("%s", %s)' % (text, attr)) + log(u'write_color("%s", %s)' % (text, attr)) chunks = self.terminal_escape.split(text) - log('chunks=%s' % repr(chunks)) + log(u'chunks=%s' % repr(chunks)) bg = self.savebg n = 0 # count the characters we actually write, omitting the escapes if attr is None:#use attribute from initial console @@ -222,8 +222,8 @@ class Console(object): return n def write_plain(self, text, attr=None): - '''write text at current cursor position.''' - log('write("%s", %s)' %(text, attr)) + u'''write text at current cursor position.''' + log(u'write("%s", %s)' %(text, attr)) if attr is None: attr = self.attr n = c_int(0) @@ -231,7 +231,7 @@ class Console(object): self.WriteConsoleA(self.hout, text, len(text), byref(n), None) return len(text) - if "EMACS" in os.environ: + if os.environ.has_key(u"EMACS"): def write_color(self, text, attr=None): junk = c_int(0) self.WriteFile(self.hout, text, len(text), byref(junk), None) @@ -240,7 +240,7 @@ class Console(object): # make this class look like a file object def write(self, text): - log('write("%s")' % text) + log(u'write("%s")' % text) return self.write_color(text) #write = write_scrolling @@ -251,12 +251,12 @@ class Console(object): def flush(self): pass - def page(self, attr=None, fill=' '): - '''Fill the entire screen.''' + def page(self, attr=None, fill=u' '): + u'''Fill the entire screen.''' System.Console.Clear() def text(self, x, y, text, attr=None): - '''Write text at the given position.''' + u'''Write text at the given position.''' self.pos(x, y) self.write_color(text, attr) @@ -266,12 +266,12 @@ class Console(object): pos = self.pos() w, h = self.size() length = w - pos[0] + min((lastline - pos[1] - 1), 5) * w - 1 - self.write_color(length * " ") + self.write_color(length * u" ") self.pos(*pos) self.WindowTop = oldtop - def rectangle(self, rect, attr=None, fill=' '): - '''Fill Rectangle.''' + def rectangle(self, rect, attr=None, fill=u' '): + u'''Fill Rectangle.''' oldtop = self.WindowTop oldpos = self.pos() #raise NotImplementedError @@ -281,18 +281,18 @@ class Console(object): if fill: rowfill = fill[:1] * abs(x1 - x0) else: - rowfill = ' ' * abs(x1 - x0) + rowfill = u' ' * abs(x1 - x0) for y in range(y0, y1): System.Console.SetCursorPosition(x0, y) self.write_color(rowfill, attr) self.pos(*oldpos) def scroll(self, rect, dx, dy, attr=None, fill=' '): - '''Scroll a rectangle.''' + u'''Scroll a rectangle.''' raise NotImplementedError def scroll_window(self, lines): - '''Scroll the window by the indicated number of lines.''' + u'''Scroll the window by the indicated number of lines.''' top = self.WindowTop + lines if top < 0: top = 0 @@ -301,7 +301,7 @@ class Console(object): self.WindowTop = top def getkeypress(self): - '''Return next key press event from the queue, ignoring others.''' + u'''Return next key press event from the queue, ignoring others.''' ck = System.ConsoleKey while 1: e = System.Console.ReadKey(True) @@ -309,21 +309,21 @@ class Console(object): self.scroll_window(12) elif e.Key == System.ConsoleKey.PageUp:#PageUp self.scroll_window(-12) - elif str(e.KeyChar) == "\000":#Drop deadkeys - log("Deadkey: %s"%e) + elif str(e.KeyChar) == u"\000":#Drop deadkeys + log(u"Deadkey: %s"%e) return event(self, e) else: return event(self, e) def title(self, txt=None): - '''Set/get title.''' + u'''Set/get title.''' if txt: System.Console.Title = txt else: return System.Console.Title def size(self, width=None, height=None): - '''Set/get window size.''' + u'''Set/get window size.''' sc = System.Console if width is not None and height is not None: sc.BufferWidth, sc.BufferHeight = width,height @@ -336,22 +336,22 @@ class Console(object): return sc.WindowWidth - 1, sc.WindowHeight - 1 def cursor(self, visible=True, size=None): - '''Set cursor on or off.''' + u'''Set cursor on or off.''' System.Console.CursorVisible = visible def bell(self): System.Console.Beep() def next_serial(self): - '''Get next event serial number.''' + u'''Get next event serial number.''' self.serial += 1 return self.serial class event(Event): - '''Represent events from the console.''' + u'''Represent events from the console.''' def __init__(self, console, input): - '''Initialize an event from the Windows input structure.''' - self.type = '??' + u'''Initialize an event from the Windows input structure.''' + self.type = u'??' self.serial = console.next_serial() self.width = 0 self.height = 0 @@ -360,7 +360,7 @@ class event(Event): self.char = str(input.KeyChar) self.keycode = input.Key self.state = input.Modifiers - log("%s,%s,%s"%(input.Modifiers, input.Key, input.KeyChar)) + log(u"%s,%s,%s"%(input.Modifiers, input.Key, input.KeyChar)) self.type = "KeyRelease" self.keysym = make_keysym(self.keycode) self.keyinfo = make_KeyPress(self.char, self.state, self.keycode) @@ -368,7 +368,7 @@ class event(Event): def make_event_from_keydescr(keydescr): def input(): return 1 - input.KeyChar = "a" + input.KeyChar = u"a" input.Key = System.ConsoleKey.A input.Modifiers = System.ConsoleModifiers.Shift input.next_serial = input @@ -378,17 +378,17 @@ def make_event_from_keydescr(keydescr): e.keyinfo = keyinfo return e -CTRL_C_EVENT=make_event_from_keydescr("Control-c") +CTRL_C_EVENT=make_event_from_keydescr(u"Control-c") def install_readline(hook): def hook_wrap(): try: res = hook() - except KeyboardInterrupt as x: #this exception does not seem to be caught - res = "" + except KeyboardInterrupt,x: #this exception does not seem to be caught + res = u"" except EOFError: return None - if res[-1:] == "\n": + if res[-1:] == u"\n": return res[:-1] else: return res @@ -403,22 +403,22 @@ def install_readline(hook): -if __name__ == '__main__': +if __name__ == u'__main__': import time, sys c = Console(0) sys.stdout = c sys.stderr = c c.page() c.pos(5, 10) - c.write('hi there') - c.title("Testing console") + c.write(u'hi there') + c.title(u"Testing console") # c.bell() - print() - print("size", c.size()) - print(' some printed output') + print + print u"size", c.size() + print u' some printed output' for i in range(10): e = c.getkeypress() - print(e.Key, chr(e.KeyChar), ord(e.KeyChar), e.Modifiers) + print e.Key, chr(e.KeyChar), ord(e.KeyChar), e.Modifiers del c System.Console.Clear() diff --git a/pyreadline/examples/callback_example.py b/pyreadline/examples/callback_example.py index a9b3c7d..dac6e88 100644 --- a/pyreadline/examples/callback_example.py +++ b/pyreadline/examples/callback_example.py @@ -1,10 +1,10 @@ -''' +u''' Example script using the callback interface of readline. :author: strank ''' -__docformat__ = "restructuredtext en" +__docformat__ = u"restructuredtext en" import sys import os @@ -21,33 +21,33 @@ maxlines = 10 def main(): - readline.callback_handler_install('Starting test, please do type:' + os.linesep, lineReceived) + readline.callback_handler_install(u'Starting test, please do type:' + os.linesep, lineReceived) index = 0 start = int(time.time()) while prompting: # demonstrate that async stuff is possible: if start + index < time.time(): - rl.console.title("NON-BLOCKING: %d" % index) + rl.console.title(u"NON-BLOCKING: %d" % index) index += 1 # ugly busy waiting/polling on windows, using 'select' on Unix: (or use twisted) if msvcrt.kbhit(): readline.callback_read_char() - print("Done, index =", index) + print u"Done, index =", index def lineReceived(line): global count, prompting count += 1 - print("Got line: %s" % line) + print u"Got line: %s" % line if count > maxlines: prompting = False readline.callback_handler_remove() else: - readline.callback_handler_install('Got %s of %s, more typing please:' % (count, maxlines) + readline.callback_handler_install(u'Got %s of %s, more typing please:' % (count, maxlines) + os.linesep, lineReceived) -if __name__ == '__main__': +if __name__ == u'__main__': main() diff --git a/pyreadline/examples/tk_gui.py b/pyreadline/examples/tk_gui.py index 7392fdd..e8ef83e 100644 --- a/pyreadline/examples/tk_gui.py +++ b/pyreadline/examples/tk_gui.py @@ -14,7 +14,7 @@ from pyreadline.rlmain import BaseReadline from pyreadline.keysyms.common import KeyPress import pyreadline.logger as log log.sock_silent=False -import tkinter,sys +import Tkinter,sys translate={"plus":"+","minus":"-","asterisk":"*","slash":"/","exclam":"!","quotedbl":'"', "parenleft":"(","parenright":")",} @@ -41,17 +41,17 @@ def KeyPress_from_event(event): class App: def __init__(self, master): - self.frame=frame=tkinter.Frame(master) + self.frame=frame=Tkinter.Frame(master) frame.pack() self.lines=["Hello"] self.RL=BaseReadline() self.RL.read_inputrc() self.prompt=">>>" self.readline_setup(self.prompt) - self.textvar = tkinter.StringVar() + self.textvar = Tkinter.StringVar() self._update_line() - self.text=tkinter.Label(frame, textvariable=self.textvar,width=50,height=40,justify=tkinter.LEFT,anchor=tkinter.NW) - self.text.pack(side=tkinter.LEFT) + self.text=Tkinter.Label(frame, textvariable=self.textvar,width=50,height=40,justify=Tkinter.LEFT,anchor=Tkinter.NW) + self.text.pack(side=Tkinter.LEFT) master.bind("",self.handler) self.locals={} @@ -83,7 +83,7 @@ class App: -root=tkinter.Tk() +root=Tkinter.Tk() display=App(root) root.mainloop() \ No newline at end of file diff --git a/pyreadline/get_doc.py b/pyreadline/get_doc.py index 7070a78..b56eb95 100644 --- a/pyreadline/get_doc.py +++ b/pyreadline/get_doc.py @@ -1,11 +1,10 @@ import sys,textwrap -import collections -rlmain = sys.modules["pyreadline.rlmain"] +rlmain = sys.modules[u"pyreadline.rlmain"] rl = rlmain.rl def get_doc(rl): - methods = [(x, getattr(rl, x)) for x in dir(rl) if isinstance(getattr(rl, x), collections.Callable)] + methods = [(x, getattr(rl, x)) for x in dir(rl) if callable(getattr(rl, x))] return [ (x, m.__doc__ )for x, m in methods if m.__doc__] @@ -14,6 +13,6 @@ def get_rest(rl): out = [] for funcname, doc in q: out.append(funcname) - out.append("\n".join(textwrap.wrap(doc, 80, initial_indent=" "))) - out.append("") + out.append(u"\n".join(textwrap.wrap(doc, 80, initial_indent=u" "))) + out.append(u"") return out \ No newline at end of file diff --git a/pyreadline/keysyms/__init__.py b/pyreadline/keysyms/__init__.py index 8875056..ae3aec2 100644 --- a/pyreadline/keysyms/__init__.py +++ b/pyreadline/keysyms/__init__.py @@ -1,20 +1,20 @@ import sys success = False -in_ironpython = "IronPython" in sys.version +in_ironpython = u"IronPython" in sys.version if in_ironpython: try: - from .ironpython_keysyms import * + from ironpython_keysyms import * success = True - except ImportError as x: + except ImportError, x: raise else: try: - from .keysyms import * + from keysyms import * success = True - except ImportError as x: + except ImportError, x: pass if not success: - raise ImportError("Could not import keysym for local pythonversion", x) \ No newline at end of file + raise ImportError(u"Could not import keysym for local pythonversion", x) \ No newline at end of file diff --git a/pyreadline/keysyms/common.py b/pyreadline/keysyms/common.py index 1e6b53e..d76b356 100644 --- a/pyreadline/keysyms/common.py +++ b/pyreadline/keysyms/common.py @@ -1,127 +1,127 @@ -# -*- coding: utf-8 -*- -#***************************************************************************** -# Copyright (C) 2003-2006 Gary Bishop. -# Copyright (C) 2006 Jorgen Stenarson. -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** -# table for translating virtual keys to X windows key symbols - -try: - set -except NameError: - from sets import Set as set - -from pyreadline.unicode_helper import ensure_str - -validkey =set(['cancel', 'backspace', 'tab', 'clear', - 'return', 'shift_l', 'control_l', 'alt_l', - 'pause', 'caps_lock', 'escape', 'space', - 'prior', 'next', 'end', 'home', - 'left', 'up', 'right', 'down', - 'select', 'print', 'execute', 'snapshot', - 'insert', 'delete', 'help', 'f1', - 'f2', 'f3', 'f4', 'f5', - 'f6', 'f7', 'f8', 'f9', - 'f10', 'f11', 'f12', 'f13', - 'f14', 'f15', 'f16', 'f17', - 'f18', 'f19', 'f20', 'f21', - 'f22', 'f23', 'f24', 'num_lock', - 'scroll_lock', 'vk_apps', 'vk_processkey','vk_attn', - 'vk_crsel', 'vk_exsel', 'vk_ereof', 'vk_play', - 'vk_zoom', 'vk_noname', 'vk_pa1', 'vk_oem_clear', - 'numpad0', 'numpad1', 'numpad2', 'numpad3', - 'numpad4', 'numpad5', 'numpad6', 'numpad7', - 'numpad8', 'numpad9', 'divide', 'multiply', - 'add', 'subtract', 'vk_decimal']) - -escape_sequence_to_special_key = {"\\e[a" : "up", "\\e[b" : "down", "del" : "delete"} - -class KeyPress(object): - def __init__(self, char="", shift=False, control=False, meta=False, keyname=""): - if control or meta or shift: - char = char.upper() - self.info = dict(char=char, - shift=shift, - control=control, - meta=meta, - keyname=keyname) - - def create(name): - def get(self): - return self.info[name] - - def set(self, value): - self.info[name] = value - return property(get, set) - char = create("char") - shift = create("shift") - control = create("control") - meta = create("meta") - keyname = create("keyname") - - def __repr__(self): - return "(%s,%s,%s,%s)"%tuple(map(ensure_str, self.tuple())) - - def tuple(self): - if self.keyname: - return (self.control, self.meta, self.shift, self.keyname) - else: - if self.control or self.meta or self.shift: - return (self.control, self.meta, self.shift, self.char.upper()) - else: - return (self.control, self.meta, self.shift, self.char) - - def __eq__(self, other): - if isinstance(other, KeyPress): - s = self.tuple() - o = other.tuple() - return s == o - else: - return False - -def make_KeyPress_from_keydescr(keydescr): - keyinfo = KeyPress() - if len(keydescr) > 2 and keydescr[:1] == '"' and keydescr[-1:] == '"': - keydescr = keydescr[1:-1] - - while 1: - lkeyname = keydescr.lower() - if lkeyname.startswith('control-'): - keyinfo.control = True - keydescr = keydescr[8:] - elif lkeyname.startswith('ctrl-'): - keyinfo.control = True - keydescr = keydescr[5:] - elif keydescr.lower().startswith('\\c-'): - keyinfo.control = True - keydescr = keydescr[3:] - elif keydescr.lower().startswith('\\m-'): - keyinfo.meta = True - keydescr = keydescr[3:] - elif keydescr in escape_sequence_to_special_key: - keydescr = escape_sequence_to_special_key[keydescr] - elif lkeyname.startswith('meta-'): - keyinfo.meta = True - keydescr = keydescr[5:] - elif lkeyname.startswith('alt-'): - keyinfo.meta = True - keydescr = keydescr[4:] - elif lkeyname.startswith('shift-'): - keyinfo.shift = True - keydescr = keydescr[6:] - else: - if len(keydescr) > 1: - if keydescr.strip().lower() in validkey: - keyinfo.keyname = keydescr.strip().lower() - keyinfo.char = "" - else: - raise IndexError("Not a valid key: '%s'"%keydescr) - else: - keyinfo.char = keydescr - return keyinfo - -if __name__ == "__main__": - import startup +# -*- coding: utf-8 -*- +#***************************************************************************** +# Copyright (C) 2003-2006 Gary Bishop. +# Copyright (C) 2006 Jorgen Stenarson. +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** +# table for translating virtual keys to X windows key symbols + +try: + set +except NameError: + from sets import Set as set + +from pyreadline.unicode_helper import ensure_unicode + +validkey =set([u'cancel', u'backspace', u'tab', u'clear', + u'return', u'shift_l', u'control_l', u'alt_l', + u'pause', u'caps_lock', u'escape', u'space', + u'prior', u'next', u'end', u'home', + u'left', u'up', u'right', u'down', + u'select', u'print', u'execute', u'snapshot', + u'insert', u'delete', u'help', u'f1', + u'f2', u'f3', u'f4', u'f5', + u'f6', u'f7', u'f8', u'f9', + u'f10', u'f11', u'f12', u'f13', + u'f14', u'f15', u'f16', u'f17', + u'f18', u'f19', u'f20', u'f21', + u'f22', u'f23', u'f24', u'num_lock', + u'scroll_lock', u'vk_apps', u'vk_processkey',u'vk_attn', + u'vk_crsel', u'vk_exsel', u'vk_ereof', u'vk_play', + u'vk_zoom', u'vk_noname', u'vk_pa1', u'vk_oem_clear', + u'numpad0', u'numpad1', u'numpad2', u'numpad3', + u'numpad4', u'numpad5', u'numpad6', u'numpad7', + u'numpad8', u'numpad9', u'divide', u'multiply', + u'add', u'subtract', u'vk_decimal']) + +escape_sequence_to_special_key = {u"\\e[a" : u"up", u"\\e[b" : u"down", u"del" : u"delete"} + +class KeyPress(object): + def __init__(self, char=u"", shift=False, control=False, meta=False, keyname=u""): + if control or meta or shift: + char = char.upper() + self.info = dict(char=char, + shift=shift, + control=control, + meta=meta, + keyname=keyname) + + def create(name): + def get(self): + return self.info[name] + + def set(self, value): + self.info[name] = value + return property(get, set) + char = create(u"char") + shift = create(u"shift") + control = create(u"control") + meta = create(u"meta") + keyname = create(u"keyname") + + def __repr__(self): + return u"(%s,%s,%s,%s)"%tuple(map(ensure_unicode, self.tuple())) + + def tuple(self): + if self.keyname: + return (self.control, self.meta, self.shift, self.keyname) + else: + if self.control or self.meta or self.shift: + return (self.control, self.meta, self.shift, self.char.upper()) + else: + return (self.control, self.meta, self.shift, self.char) + + def __eq__(self, other): + if isinstance(other, KeyPress): + s = self.tuple() + o = other.tuple() + return s == o + else: + return False + +def make_KeyPress_from_keydescr(keydescr): + keyinfo = KeyPress() + if len(keydescr) > 2 and keydescr[:1] == u'"' and keydescr[-1:] == u'"': + keydescr = keydescr[1:-1] + + while 1: + lkeyname = keydescr.lower() + if lkeyname.startswith(u'control-'): + keyinfo.control = True + keydescr = keydescr[8:] + elif lkeyname.startswith(u'ctrl-'): + keyinfo.control = True + keydescr = keydescr[5:] + elif keydescr.lower().startswith(u'\\c-'): + keyinfo.control = True + keydescr = keydescr[3:] + elif keydescr.lower().startswith(u'\\m-'): + keyinfo.meta = True + keydescr = keydescr[3:] + elif keydescr in escape_sequence_to_special_key: + keydescr = escape_sequence_to_special_key[keydescr] + elif lkeyname.startswith(u'meta-'): + keyinfo.meta = True + keydescr = keydescr[5:] + elif lkeyname.startswith(u'alt-'): + keyinfo.meta = True + keydescr = keydescr[4:] + elif lkeyname.startswith(u'shift-'): + keyinfo.shift = True + keydescr = keydescr[6:] + else: + if len(keydescr) > 1: + if keydescr.strip().lower() in validkey: + keyinfo.keyname = keydescr.strip().lower() + keyinfo.char = "" + else: + raise IndexError(u"Not a valid key: '%s'"%keydescr) + else: + keyinfo.char = keydescr + return keyinfo + +if __name__ == u"__main__": + import startup \ No newline at end of file diff --git a/pyreadline/keysyms/ironpython_keysyms.py b/pyreadline/keysyms/ironpython_keysyms.py index f4c74e9..783940c 100644 --- a/pyreadline/keysyms/ironpython_keysyms.py +++ b/pyreadline/keysyms/ironpython_keysyms.py @@ -1,202 +1,202 @@ -# -*- coding: utf-8 -*- -#***************************************************************************** -# Copyright (C) 2003-2006 Gary Bishop. -# Copyright (C) 2006 Jorgen Stenarson. -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** -import System -from .common import validkey, KeyPress, make_KeyPress_from_keydescr - -c32 = System.ConsoleKey -Shift = System.ConsoleModifiers.Shift -Control = System.ConsoleModifiers.Control -Alt = System.ConsoleModifiers.Alt -# table for translating virtual keys to X windows key symbols -code2sym_map = {#c32.CANCEL: u'Cancel', - c32.Backspace: 'BackSpace', - c32.Tab: 'Tab', - c32.Clear: 'Clear', - c32.Enter: 'Return', -# c32.Shift: u'Shift_L', -# c32.Control: u'Control_L', -# c32.Menu: u'Alt_L', - c32.Pause: 'Pause', -# c32.Capital: u'Caps_Lock', - c32.Escape: 'Escape', -# c32.Space: u'space', - c32.PageUp: 'Prior', - c32.PageDown: 'Next', - c32.End: 'End', - c32.Home: 'Home', - c32.LeftArrow: 'Left', - c32.UpArrow: 'Up', - c32.RightArrow: 'Right', - c32.DownArrow: 'Down', - c32.Select: 'Select', - c32.Print: 'Print', - c32.Execute: 'Execute', -# c32.Snapshot: u'Snapshot', - c32.Insert: 'Insert', - c32.Delete: 'Delete', - c32.Help: 'Help', - c32.F1: 'F1', - c32.F2: 'F2', - c32.F3: 'F3', - c32.F4: 'F4', - c32.F5: 'F5', - c32.F6: 'F6', - c32.F7: 'F7', - c32.F8: 'F8', - c32.F9: 'F9', - c32.F10: 'F10', - c32.F11: 'F11', - c32.F12: 'F12', - c32.F13: 'F13', - c32.F14: 'F14', - c32.F15: 'F15', - c32.F16: 'F16', - c32.F17: 'F17', - c32.F18: 'F18', - c32.F19: 'F19', - c32.F20: 'F20', - c32.F21: 'F21', - c32.F22: 'F22', - c32.F23: 'F23', - c32.F24: 'F24', -# c32.Numlock: u'Num_Lock,', -# c32.Scroll: u'Scroll_Lock', -# c32.Apps: u'VK_APPS', -# c32.ProcesskeY: u'VK_PROCESSKEY', -# c32.Attn: u'VK_ATTN', -# c32.Crsel: u'VK_CRSEL', -# c32.Exsel: u'VK_EXSEL', -# c32.Ereof: u'VK_EREOF', -# c32.Play: u'VK_PLAY', -# c32.Zoom: u'VK_ZOOM', -# c32.Noname: u'VK_NONAME', -# c32.Pa1: u'VK_PA1', - c32.OemClear: 'VK_OEM_CLEAR', - c32.NumPad0: 'NUMPAD0', - c32.NumPad1: 'NUMPAD1', - c32.NumPad2: 'NUMPAD2', - c32.NumPad3: 'NUMPAD3', - c32.NumPad4: 'NUMPAD4', - c32.NumPad5: 'NUMPAD5', - c32.NumPad6: 'NUMPAD6', - c32.NumPad7: 'NUMPAD7', - c32.NumPad8: 'NUMPAD8', - c32.NumPad9: 'NUMPAD9', - c32.Divide: 'Divide', - c32.Multiply: 'Multiply', - c32.Add: 'Add', - c32.Subtract: 'Subtract', - c32.Decimal: 'VK_DECIMAL' - } - -# function to handle the mapping -def make_keysym(keycode): - try: - sym = code2sym_map[keycode] - except KeyError: - sym = '' - return sym - -sym2code_map = {} -for code,sym in code2sym_map.items(): - sym2code_map[sym.lower()] = code - -def key_text_to_keyinfo(keytext): - '''Convert a GNU readline style textual description of a key to keycode with modifiers''' - if keytext.startswith('"'): # " - return keyseq_to_keyinfo(keytext[1:-1]) - else: - return keyname_to_keyinfo(keytext) - - -def char_to_keyinfo(char, control=False, meta=False, shift=False): - vk = (ord(char)) - if vk & 0xffff == 0xffff: - print('VkKeyScan("%s") = %x' % (char, vk)) - raise ValueError('bad key') - if vk & 0x100: - shift = True - if vk & 0x200: - control = True - if vk & 0x400: - meta = True - return (control, meta, shift, vk & 0xff) - -def keyname_to_keyinfo(keyname): - control = False - meta = False - shift = False - - while 1: - lkeyname = keyname.lower() - if lkeyname.startswith('control-'): - control = True - keyname = keyname[8:] - elif lkeyname.startswith('ctrl-'): - control = True - keyname = keyname[5:] - elif lkeyname.startswith('meta-'): - meta = True - keyname = keyname[5:] - elif lkeyname.startswith('alt-'): - meta = True - keyname = keyname[4:] - elif lkeyname.startswith('shift-'): - shift = True - keyname = keyname[6:] - else: - if len(keyname) > 1: - return (control, meta, shift, sym2code_map.get(keyname.lower()," ")) - else: - return char_to_keyinfo(keyname, control, meta, shift) - -def keyseq_to_keyinfo(keyseq): - res = [] - control = False - meta = False - shift = False - - while 1: - if keyseq.startswith('\\C-'): - control = True - keyseq = keyseq[3:] - elif keyseq.startswith('\\M-'): - meta = True - keyseq = keyseq[3:] - elif keyseq.startswith('\\e'): - res.append(char_to_keyinfo('\033', control, meta, shift)) - control = meta = shift = False - keyseq = keyseq[2:] - elif len(keyseq) >= 1: - res.append(char_to_keyinfo(keyseq[0], control, meta, shift)) - control = meta = shift = False - keyseq = keyseq[1:] - else: - return res[0] - -def make_keyinfo(keycode, state): - control = False - meta =False - shift = False - return (control, meta, shift, keycode) - - -def make_KeyPress(char, state, keycode): - - shift = bool(int(state) & int(Shift)) - control = bool(int(state) & int(Control)) - meta = bool(int(state) & int(Alt)) - keyname = code2sym_map.get(keycode, "").lower() - if control and meta: #equivalent to altgr so clear flags - control = False - meta = False - elif control: - char = str(keycode) - return KeyPress(char, shift, control, meta, keyname) - +# -*- coding: utf-8 -*- +#***************************************************************************** +# Copyright (C) 2003-2006 Gary Bishop. +# Copyright (C) 2006 Jorgen Stenarson. +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** +import System +from common import validkey, KeyPress, make_KeyPress_from_keydescr + +c32 = System.ConsoleKey +Shift = System.ConsoleModifiers.Shift +Control = System.ConsoleModifiers.Control +Alt = System.ConsoleModifiers.Alt +# table for translating virtual keys to X windows key symbols +code2sym_map = {#c32.CANCEL: u'Cancel', + c32.Backspace: u'BackSpace', + c32.Tab: u'Tab', + c32.Clear: u'Clear', + c32.Enter: u'Return', +# c32.Shift: u'Shift_L', +# c32.Control: u'Control_L', +# c32.Menu: u'Alt_L', + c32.Pause: u'Pause', +# c32.Capital: u'Caps_Lock', + c32.Escape: u'Escape', +# c32.Space: u'space', + c32.PageUp: u'Prior', + c32.PageDown: u'Next', + c32.End: u'End', + c32.Home: u'Home', + c32.LeftArrow: u'Left', + c32.UpArrow: u'Up', + c32.RightArrow: u'Right', + c32.DownArrow: u'Down', + c32.Select: u'Select', + c32.Print: u'Print', + c32.Execute: u'Execute', +# c32.Snapshot: u'Snapshot', + c32.Insert: u'Insert', + c32.Delete: u'Delete', + c32.Help: u'Help', + c32.F1: u'F1', + c32.F2: u'F2', + c32.F3: u'F3', + c32.F4: u'F4', + c32.F5: u'F5', + c32.F6: u'F6', + c32.F7: u'F7', + c32.F8: u'F8', + c32.F9: u'F9', + c32.F10: u'F10', + c32.F11: u'F11', + c32.F12: u'F12', + c32.F13: u'F13', + c32.F14: u'F14', + c32.F15: u'F15', + c32.F16: u'F16', + c32.F17: u'F17', + c32.F18: u'F18', + c32.F19: u'F19', + c32.F20: u'F20', + c32.F21: u'F21', + c32.F22: u'F22', + c32.F23: u'F23', + c32.F24: u'F24', +# c32.Numlock: u'Num_Lock,', +# c32.Scroll: u'Scroll_Lock', +# c32.Apps: u'VK_APPS', +# c32.ProcesskeY: u'VK_PROCESSKEY', +# c32.Attn: u'VK_ATTN', +# c32.Crsel: u'VK_CRSEL', +# c32.Exsel: u'VK_EXSEL', +# c32.Ereof: u'VK_EREOF', +# c32.Play: u'VK_PLAY', +# c32.Zoom: u'VK_ZOOM', +# c32.Noname: u'VK_NONAME', +# c32.Pa1: u'VK_PA1', + c32.OemClear: u'VK_OEM_CLEAR', + c32.NumPad0: u'NUMPAD0', + c32.NumPad1: u'NUMPAD1', + c32.NumPad2: u'NUMPAD2', + c32.NumPad3: u'NUMPAD3', + c32.NumPad4: u'NUMPAD4', + c32.NumPad5: u'NUMPAD5', + c32.NumPad6: u'NUMPAD6', + c32.NumPad7: u'NUMPAD7', + c32.NumPad8: u'NUMPAD8', + c32.NumPad9: u'NUMPAD9', + c32.Divide: u'Divide', + c32.Multiply: u'Multiply', + c32.Add: u'Add', + c32.Subtract: u'Subtract', + c32.Decimal: u'VK_DECIMAL' + } + +# function to handle the mapping +def make_keysym(keycode): + try: + sym = code2sym_map[keycode] + except KeyError: + sym = u'' + return sym + +sym2code_map = {} +for code,sym in code2sym_map.iteritems(): + sym2code_map[sym.lower()] = code + +def key_text_to_keyinfo(keytext): + u'''Convert a GNU readline style textual description of a key to keycode with modifiers''' + if keytext.startswith('"'): # " + return keyseq_to_keyinfo(keytext[1:-1]) + else: + return keyname_to_keyinfo(keytext) + + +def char_to_keyinfo(char, control=False, meta=False, shift=False): + vk = (ord(char)) + if vk & 0xffff == 0xffff: + print u'VkKeyScan("%s") = %x' % (char, vk) + raise ValueError, u'bad key' + if vk & 0x100: + shift = True + if vk & 0x200: + control = True + if vk & 0x400: + meta = True + return (control, meta, shift, vk & 0xff) + +def keyname_to_keyinfo(keyname): + control = False + meta = False + shift = False + + while 1: + lkeyname = keyname.lower() + if lkeyname.startswith(u'control-'): + control = True + keyname = keyname[8:] + elif lkeyname.startswith(u'ctrl-'): + control = True + keyname = keyname[5:] + elif lkeyname.startswith(u'meta-'): + meta = True + keyname = keyname[5:] + elif lkeyname.startswith(u'alt-'): + meta = True + keyname = keyname[4:] + elif lkeyname.startswith(u'shift-'): + shift = True + keyname = keyname[6:] + else: + if len(keyname) > 1: + return (control, meta, shift, sym2code_map.get(keyname.lower(),u" ")) + else: + return char_to_keyinfo(keyname, control, meta, shift) + +def keyseq_to_keyinfo(keyseq): + res = [] + control = False + meta = False + shift = False + + while 1: + if keyseq.startswith(u'\\C-'): + control = True + keyseq = keyseq[3:] + elif keyseq.startswith(u'\\M-'): + meta = True + keyseq = keyseq[3:] + elif keyseq.startswith(u'\\e'): + res.append(char_to_keyinfo(u'\033', control, meta, shift)) + control = meta = shift = False + keyseq = keyseq[2:] + elif len(keyseq) >= 1: + res.append(char_to_keyinfo(keyseq[0], control, meta, shift)) + control = meta = shift = False + keyseq = keyseq[1:] + else: + return res[0] + +def make_keyinfo(keycode, state): + control = False + meta =False + shift = False + return (control, meta, shift, keycode) + + +def make_KeyPress(char, state, keycode): + + shift = bool(int(state) & int(Shift)) + control = bool(int(state) & int(Control)) + meta = bool(int(state) & int(Alt)) + keyname = code2sym_map.get(keycode, u"").lower() + if control and meta: #equivalent to altgr so clear flags + control = False + meta = False + elif control: + char = str(keycode) + return KeyPress(char, shift, control, meta, keyname) + diff --git a/pyreadline/keysyms/keysyms.py b/pyreadline/keysyms/keysyms.py index 0e1b813..fd7d0c7 100644 --- a/pyreadline/keysyms/keysyms.py +++ b/pyreadline/keysyms/keysyms.py @@ -1,133 +1,133 @@ -# -*- coding: utf-8 -*- -#***************************************************************************** -# Copyright (C) 2003-2006 Gary Bishop. -# Copyright (C) 2006 Jorgen Stenarson. -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** -from . import winconstants as c32 -from pyreadline.logger import log -from ctypes import windll -import ctypes -# table for translating virtual keys to X windows key symbols - -from .common import validkey, KeyPress, make_KeyPress_from_keydescr - -code2sym_map = {c32.VK_CANCEL: 'cancel', - c32.VK_BACK: 'backspace', - c32.VK_TAB: 'tab', - c32.VK_CLEAR: 'clear', - c32.VK_RETURN: 'return', - c32.VK_SHIFT: 'shift_l', - c32.VK_CONTROL: 'control_l', - c32.VK_MENU: 'alt_l', - c32.VK_PAUSE: 'pause', - c32.VK_CAPITAL: 'caps_lock', - c32.VK_ESCAPE: 'escape', - c32.VK_SPACE: 'space', - c32.VK_PRIOR: 'prior', - c32.VK_NEXT: 'next', - c32.VK_END: 'end', - c32.VK_HOME: 'home', - c32.VK_LEFT: 'left', - c32.VK_UP: 'up', - c32.VK_RIGHT: 'right', - c32.VK_DOWN: 'down', - c32.VK_SELECT: 'select', - c32.VK_PRINT: 'print', - c32.VK_EXECUTE: 'execute', - c32.VK_SNAPSHOT: 'snapshot', - c32.VK_INSERT: 'insert', - c32.VK_DELETE: 'delete', - c32.VK_HELP: 'help', - c32.VK_F1: 'f1', - c32.VK_F2: 'f2', - c32.VK_F3: 'f3', - c32.VK_F4: 'f4', - c32.VK_F5: 'f5', - c32.VK_F6: 'f6', - c32.VK_F7: 'f7', - c32.VK_F8: 'f8', - c32.VK_F9: 'f9', - c32.VK_F10: 'f10', - c32.VK_F11: 'f11', - c32.VK_F12: 'f12', - c32.VK_F13: 'f13', - c32.VK_F14: 'f14', - c32.VK_F15: 'f15', - c32.VK_F16: 'f16', - c32.VK_F17: 'f17', - c32.VK_F18: 'f18', - c32.VK_F19: 'f19', - c32.VK_F20: 'f20', - c32.VK_F21: 'f21', - c32.VK_F22: 'f22', - c32.VK_F23: 'f23', - c32.VK_F24: 'f24', - c32.VK_NUMLOCK: 'num_lock,', - c32.VK_SCROLL: 'scroll_lock', - c32.VK_APPS: 'vk_apps', - c32.VK_PROCESSKEY: 'vk_processkey', - c32.VK_ATTN: 'vk_attn', - c32.VK_CRSEL: 'vk_crsel', - c32.VK_EXSEL: 'vk_exsel', - c32.VK_EREOF: 'vk_ereof', - c32.VK_PLAY: 'vk_play', - c32.VK_ZOOM: 'vk_zoom', - c32.VK_NONAME: 'vk_noname', - c32.VK_PA1: 'vk_pa1', - c32.VK_OEM_CLEAR: 'vk_oem_clear', - c32.VK_NUMPAD0: 'numpad0', - c32.VK_NUMPAD1: 'numpad1', - c32.VK_NUMPAD2: 'numpad2', - c32.VK_NUMPAD3: 'numpad3', - c32.VK_NUMPAD4: 'numpad4', - c32.VK_NUMPAD5: 'numpad5', - c32.VK_NUMPAD6: 'numpad6', - c32.VK_NUMPAD7: 'numpad7', - c32.VK_NUMPAD8: 'numpad8', - c32.VK_NUMPAD9: 'numpad9', - c32.VK_DIVIDE: 'divide', - c32.VK_MULTIPLY: 'multiply', - c32.VK_ADD: 'add', - c32.VK_SUBTRACT: 'subtract', - c32.VK_DECIMAL: 'vk_decimal' - } - -VkKeyScan = windll.user32.VkKeyScanA - -def char_to_keyinfo(char, control=False, meta=False, shift=False): - k=KeyPress() - vk = VkKeyScan(ord(char)) - if vk & 0xffff == 0xffff: - print('VkKeyScan("%s") = %x' % (char, vk)) - raise ValueError('bad key') - if vk & 0x100: - k.shift = True - if vk & 0x200: - k.control = True - if vk & 0x400: - k.meta = True - k.char=chr(vk & 0xff) - return k - -def make_KeyPress(char, state, keycode): - control = (state & (4+8)) != 0 - meta = (state & (1+2)) != 0 - shift = (state & 0x10) != 0 - if control and not meta:#Matches ctrl- chords should pass keycode as char - char = chr(keycode) - elif control and meta: #Matches alt gr and should just pass on char - control = False - meta = False - try: - keyname=code2sym_map[keycode] - except KeyError: - keyname = "" - out = KeyPress(char, shift, control, meta, keyname) - return out - -if __name__=="__main__": - import startup +# -*- coding: utf-8 -*- +#***************************************************************************** +# Copyright (C) 2003-2006 Gary Bishop. +# Copyright (C) 2006 Jorgen Stenarson. +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** +import winconstants as c32 +from pyreadline.logger import log +from ctypes import windll +import ctypes +# table for translating virtual keys to X windows key symbols + +from common import validkey, KeyPress, make_KeyPress_from_keydescr + +code2sym_map = {c32.VK_CANCEL: u'cancel', + c32.VK_BACK: u'backspace', + c32.VK_TAB: u'tab', + c32.VK_CLEAR: u'clear', + c32.VK_RETURN: u'return', + c32.VK_SHIFT: u'shift_l', + c32.VK_CONTROL: u'control_l', + c32.VK_MENU: u'alt_l', + c32.VK_PAUSE: u'pause', + c32.VK_CAPITAL: u'caps_lock', + c32.VK_ESCAPE: u'escape', + c32.VK_SPACE: u'space', + c32.VK_PRIOR: u'prior', + c32.VK_NEXT: u'next', + c32.VK_END: u'end', + c32.VK_HOME: u'home', + c32.VK_LEFT: u'left', + c32.VK_UP: u'up', + c32.VK_RIGHT: u'right', + c32.VK_DOWN: u'down', + c32.VK_SELECT: u'select', + c32.VK_PRINT: u'print', + c32.VK_EXECUTE: u'execute', + c32.VK_SNAPSHOT: u'snapshot', + c32.VK_INSERT: u'insert', + c32.VK_DELETE: u'delete', + c32.VK_HELP: u'help', + c32.VK_F1: u'f1', + c32.VK_F2: u'f2', + c32.VK_F3: u'f3', + c32.VK_F4: u'f4', + c32.VK_F5: u'f5', + c32.VK_F6: u'f6', + c32.VK_F7: u'f7', + c32.VK_F8: u'f8', + c32.VK_F9: u'f9', + c32.VK_F10: u'f10', + c32.VK_F11: u'f11', + c32.VK_F12: u'f12', + c32.VK_F13: u'f13', + c32.VK_F14: u'f14', + c32.VK_F15: u'f15', + c32.VK_F16: u'f16', + c32.VK_F17: u'f17', + c32.VK_F18: u'f18', + c32.VK_F19: u'f19', + c32.VK_F20: u'f20', + c32.VK_F21: u'f21', + c32.VK_F22: u'f22', + c32.VK_F23: u'f23', + c32.VK_F24: u'f24', + c32.VK_NUMLOCK: u'num_lock,', + c32.VK_SCROLL: u'scroll_lock', + c32.VK_APPS: u'vk_apps', + c32.VK_PROCESSKEY: u'vk_processkey', + c32.VK_ATTN: u'vk_attn', + c32.VK_CRSEL: u'vk_crsel', + c32.VK_EXSEL: u'vk_exsel', + c32.VK_EREOF: u'vk_ereof', + c32.VK_PLAY: u'vk_play', + c32.VK_ZOOM: u'vk_zoom', + c32.VK_NONAME: u'vk_noname', + c32.VK_PA1: u'vk_pa1', + c32.VK_OEM_CLEAR: u'vk_oem_clear', + c32.VK_NUMPAD0: u'numpad0', + c32.VK_NUMPAD1: u'numpad1', + c32.VK_NUMPAD2: u'numpad2', + c32.VK_NUMPAD3: u'numpad3', + c32.VK_NUMPAD4: u'numpad4', + c32.VK_NUMPAD5: u'numpad5', + c32.VK_NUMPAD6: u'numpad6', + c32.VK_NUMPAD7: u'numpad7', + c32.VK_NUMPAD8: u'numpad8', + c32.VK_NUMPAD9: u'numpad9', + c32.VK_DIVIDE: u'divide', + c32.VK_MULTIPLY: u'multiply', + c32.VK_ADD: u'add', + c32.VK_SUBTRACT: u'subtract', + c32.VK_DECIMAL: u'vk_decimal' + } + +VkKeyScan = windll.user32.VkKeyScanA + +def char_to_keyinfo(char, control=False, meta=False, shift=False): + k=KeyPress() + vk = VkKeyScan(ord(char)) + if vk & 0xffff == 0xffff: + print u'VkKeyScan("%s") = %x' % (char, vk) + raise ValueError, u'bad key' + if vk & 0x100: + k.shift = True + if vk & 0x200: + k.control = True + if vk & 0x400: + k.meta = True + k.char=chr(vk & 0xff) + return k + +def make_KeyPress(char, state, keycode): + control = (state & (4+8)) != 0 + meta = (state & (1+2)) != 0 + shift = (state & 0x10) != 0 + if control and not meta:#Matches ctrl- chords should pass keycode as char + char = chr(keycode) + elif control and meta: #Matches alt gr and should just pass on char + control = False + meta = False + try: + keyname=code2sym_map[keycode] + except KeyError: + keyname = u"" + out = KeyPress(char, shift, control, meta, keyname) + return out + +if __name__==u"__main__": + import startup \ No newline at end of file diff --git a/pyreadline/lineeditor/history.py b/pyreadline/lineeditor/history.py index 034cc1e..3eae6dd 100644 --- a/pyreadline/lineeditor/history.py +++ b/pyreadline/lineeditor/history.py @@ -7,15 +7,17 @@ #***************************************************************************** import re, operator,string, sys,os -from pyreadline.unicode_helper import ensure_str, ensure_bytes -if "pyreadline" in sys.modules: - pyreadline = sys.modules["pyreadline"] +from pyreadline.unicode_helper import ensure_unicode, ensure_str +if u"pyreadline" in sys.modules: + pyreadline = sys.modules[u"pyreadline"] else: import pyreadline -from . import lineobj +import lineobj -class EscapeHistory(Exception): +import exceptions + +class EscapeHistory(exceptions.Exception): pass from pyreadline.logger import log @@ -29,74 +31,74 @@ class LineHistory(object): self._history_cursor = 0 self.history_filename = os.path.expanduser('~/.history') #Cannot expand unicode strings correctly on python2.4 self.lastcommand = None - self.query = "" + self.query = u"" def get_current_history_length(self): - '''Return the number of lines currently in the history. + u'''Return the number of lines currently in the history. (This is different from get_history_length(), which returns the maximum number of lines that will be written to a history file.)''' value = len(self.history) - log("get_current_history_length:%d"%value) + log(u"get_current_history_length:%d"%value) return value def get_history_length(self): - '''Return the desired length of the history file. Negative values imply + u'''Return the desired length of the history file. Negative values imply unlimited history file size.''' value = self._history_length - log("get_history_length:%d"%value) + log(u"get_history_length:%d"%value) return value def get_history_item(self, index): - '''Return the current contents of history item at index.''' + u'''Return the current contents of history item at index.''' item = self.history[index] - log("get_history_item: index:%d item:%r"%(index, item)) + log(u"get_history_item: index:%d item:%r"%(index, item)) return item.get_line_text() def set_history_length(self, value): - log("set_history_length: old:%d new:%d"%(self._history_length, value)) + log(u"set_history_length: old:%d new:%d"%(self._history_length, value)) self._history_length = value def get_history_cursor(self): value = self._history_cursor - log("get_history_cursor:%d"%value) + log(u"get_history_cursor:%d"%value) return value def set_history_cursor(self, value): - log("set_history_cursor: old:%d new:%d"%(self._history_cursor, value)) + log(u"set_history_cursor: old:%d new:%d"%(self._history_cursor, value)) self._history_cursor = value history_length = property(get_history_length, set_history_length) history_cursor = property(get_history_cursor, set_history_cursor) def clear_history(self): - '''Clear readline history.''' + u'''Clear readline history.''' self.history[:] = [] self.history_cursor = 0 def read_history_file(self, filename=None): - '''Load a readline history file.''' + u'''Load a readline history file.''' if filename is None: filename = self.history_filename try: - for line in open(filename, 'r'): - self.add_history(lineobj.ReadLineTextBuffer(ensure_str(line.rstrip()))) + for line in open(filename, u'r'): + self.add_history(lineobj.ReadLineTextBuffer(ensure_unicode(line.rstrip()))) except IOError: self.history = [] self.history_cursor = 0 def write_history_file(self, filename = None): - '''Save a readline history file.''' + u'''Save a readline history file.''' if filename is None: filename = self.history_filename - fp = open(filename, 'wb') + fp = open(filename, u'wb') for line in self.history[-self.history_length:]: - fp.write(ensure_bytes(line.get_line_text())) - fp.write(b'\n') + fp.write(ensure_str(line.get_line_text())) + fp.write(u'\n') fp.close() def add_history(self, line): - '''Append a line to the history buffer, as if it was the last line typed.''' + u'''Append a line to the history buffer, as if it was the last line typed.''' if not hasattr(line, "get_line_text"): line = lineobj.ReadLineTextBuffer(line) if not line.get_line_text(): @@ -108,7 +110,7 @@ class LineHistory(object): self.history_cursor = len(self.history) def previous_history(self, current): # (C-p) - '''Move back through the history list, fetching the previous command. ''' + u'''Move back through the history list, fetching the previous command. ''' if self.history_cursor == len(self.history): self.history.append(current.copy()) #do not use add_history since we do not want to increment cursor @@ -118,19 +120,19 @@ class LineHistory(object): current.point = lineobj.EndOfLine def next_history(self, current): # (C-n) - '''Move forward through the history list, fetching the next command. ''' + u'''Move forward through the history list, fetching the next command. ''' if self.history_cursor < len(self.history) - 1: self.history_cursor += 1 current.set_line(self.history[self.history_cursor].get_line_text()) def beginning_of_history(self): # (M-<) - '''Move to the first line in the history.''' + u'''Move to the first line in the history.''' self.history_cursor = 0 if len(self.history) > 0: self.l_buffer = self.history[0] def end_of_history(self, current): # (M->) - '''Move to the end of the input history, i.e., the line currently + u'''Move to the end of the input history, i.e., the line currently being entered.''' self.history_cursor = len(self.history) current.set_line(self.history[-1].get_line_text()) @@ -149,7 +151,7 @@ class LineHistory(object): if res: self.history_cursor -= res[0][0] return res[0][1].get_line_text() - return "" + return u"" def forward_search_history(self, searchfor, startpos=None): if startpos is None: @@ -165,13 +167,13 @@ class LineHistory(object): if res: self.history_cursor += res[0][0] return res[0][1].get_line_text() - return "" + return u"" def _search(self, direction, partial): try: if (self.lastcommand != self.history_search_forward and self.lastcommand != self.history_search_backward): - self.query = ''.join(partial[0:partial.point].get_line_text()) + self.query = u''.join(partial[0:partial.point].get_line_text()) hcstart = max(self.history_cursor,0) hc = self.history_cursor + direction while (direction < 0 and hc >= 0) or (direction > 0 and hc < len(self.history)): @@ -190,7 +192,7 @@ class LineHistory(object): pass elif hc >= len(self.history) and not self.query: self.history_cursor = len(self.history) - return lineobj.ReadLineTextBuffer("", point=0) + return lineobj.ReadLineTextBuffer(u"", point=0) elif self.history[max(min(hcstart, len(self.history) - 1), 0)]\ .get_line_text().startswith(self.query) and self.query: return lineobj.ReadLineTextBuffer(self.history\ @@ -206,26 +208,26 @@ class LineHistory(object): raise def history_search_forward(self, partial): # () - '''Search forward through the history for the string of characters + u'''Search forward through the history for the string of characters between the start of the current line and the point. This is a non-incremental search. By default, this command is unbound.''' q= self._search(1, partial) return q def history_search_backward(self, partial): # () - '''Search backward through the history for the string of characters + u'''Search backward through the history for the string of characters between the start of the current line and the point. This is a non-incremental search. By default, this command is unbound.''' q= self._search(-1, partial) return q -if __name__=="__main__": +if __name__==u"__main__": q = LineHistory() RL = lineobj.ReadLineTextBuffer - q.add_history(RL("aaaa")) - q.add_history(RL("aaba")) - q.add_history(RL("aaca")) - q.add_history(RL("akca")) - q.add_history(RL("bbb")) - q.add_history(RL("ako")) + q.add_history(RL(u"aaaa")) + q.add_history(RL(u"aaba")) + q.add_history(RL(u"aaca")) + q.add_history(RL(u"akca")) + q.add_history(RL(u"bbb")) + q.add_history(RL(u"ako")) diff --git a/pyreadline/lineeditor/lineobj.py b/pyreadline/lineeditor/lineobj.py index 5598752..4347ffb 100644 --- a/pyreadline/lineeditor/lineobj.py +++ b/pyreadline/lineeditor/lineobj.py @@ -7,10 +7,10 @@ #***************************************************************************** import re, operator, sys -from . import wordmatcher +import wordmatcher import pyreadline.clipboard as clipboard from pyreadline.logger import log -from pyreadline.unicode_helper import ensure_str +from pyreadline.unicode_helper import ensure_unicode kill_ring_to_clipboard = False #set to true to copy every addition to kill ring to clipboard @@ -27,7 +27,7 @@ def quote_char(c): class LinePositioner(object): def __call__(self, line): - NotImplementedError("Base class !!!") + NotImplementedError(u"Base class !!!") class NextChar(LinePositioner): def __call__(self, line): @@ -69,7 +69,7 @@ class WordStart(LinePositioner): else: return line.point else: - raise NotAWordError("Point is not in a word") + raise NotAWordError(u"Point is not in a word") WordStart = WordStart() class WordEnd(LinePositioner): @@ -80,7 +80,7 @@ class WordEnd(LinePositioner): else: return line.point else: - raise NotAWordError("Point is not in a word") + raise NotAWordError(u"Point is not in a word") WordEnd = WordEnd() class PrevWordEnd(LinePositioner): @@ -91,10 +91,10 @@ PrevWordEnd = PrevWordEnd() class PrevSpace(LinePositioner): def __call__(self, line): point = line.point - if line[point - 1:point].get_line_text() == " ": - while point > 0 and line[point - 1:point].get_line_text() == " ": + if line[point - 1:point].get_line_text() == u" ": + while point > 0 and line[point - 1:point].get_line_text() == u" ": point -= 1 - while point > 0 and line[point - 1:point].get_line_text() != " ": + while point > 0 and line[point - 1:point].get_line_text() != u" ": point -= 1 return point PrevSpace = PrevSpace() @@ -121,7 +121,7 @@ class Mark(LinePositioner): k = Mark() all_positioners = [(value.__class__.__name__, value) - for key, value in list(globals().items()) + for key, value in globals().items() if isinstance(value, LinePositioner)] all_positioners.sort() @@ -129,7 +129,7 @@ all_positioners.sort() class LineSlice(object): def __call__(self, line): - NotImplementedError("Base class !!!") + NotImplementedError(u"Base class !!!") class CurrentWord(LineSlice): @@ -223,7 +223,7 @@ class TextLine(object): pass def __repr__(self): - return 'TextLine("%s",point=%s,mark=%s)'%(self.line_buffer, self.point, self.mark) + return u'TextLine("%s",point=%s,mark=%s)'%(self.line_buffer, self.point, self.mark) def copy(self): return self.__class__(self) @@ -243,17 +243,17 @@ class TextLine(object): def visible_line_width(self, position = Point): """Return the visible width of the text in line buffer up to position.""" extra_char_width = len([ None for c in self[:position].line_buffer if 0x2013 <= ord(c) <= 0xFFFD]) - return len(self[:position].quoted_text()) + self[:position].line_buffer.count("\t")*7 + extra_char_width + return len(self[:position].quoted_text()) + self[:position].line_buffer.count(u"\t")*7 + extra_char_width def quoted_text(self): quoted = [ quote_char(c) for c in self.line_buffer ] self.line_char_width = [ len(c) for c in quoted ] - return ''.join(map(ensure_str, quoted)) + return u''.join(map(ensure_unicode, quoted)) def get_line_text(self): buf = self.line_buffer - buf = list(map(ensure_str, buf)) - return ''.join(buf) + buf = map(ensure_unicode, buf) + return u''.join(buf) def set_line(self, text, cursor = None): self.line_buffer = [ c for c in str(text) ] @@ -307,7 +307,7 @@ class TextLine(object): elif isinstance(key, LinePositioner): return self.line_buffer[key(self)] elif isinstance(key, tuple): - raise IndexError("Cannot use step in line buffer indexing") #Multiple slice not allowed + raise IndexError(u"Cannot use step in line buffer indexing") #Multiple slice not allowed else: # return TextLine(self.line_buffer[key]) return self.line_buffer[key] @@ -387,10 +387,10 @@ class TextLine(object): return txt in self.get_line_text() -lines = [TextLine("abc"), - TextLine("abc def"), - TextLine("abc def ghi"), - TextLine(" abc def "), +lines = [TextLine(u"abc"), + TextLine(u"abc def"), + TextLine(u"abc def ghi"), + TextLine(u" abc def "), ] l = lines[2] l.point = 5 @@ -406,8 +406,8 @@ class ReadLineTextBuffer(TextLine): self.kill_ring = [] def __repr__(self): - return 'ReadLineTextBuffer'\ - '("%s",point=%s,mark=%s,selection_mark=%s)'%\ + return u'ReadLineTextBuffer'\ + u'("%s",point=%s,mark=%s,selection_mark=%s)'%\ (self.line_buffer, self.point, self.mark,self.selection_mark) @@ -712,7 +712,7 @@ class ReadLineTextBuffer(TextLine): def copy_region_to_clipboard(self): # () - '''Copy the text in the region to the windows clipboard.''' + u'''Copy the text in the region to the windows clipboard.''' if self.enable_win32_clipboard: mark = min(self.mark, len(self.line_buffer)) cursor = min(self.point, len(self.line_buffer)) @@ -720,11 +720,11 @@ class ReadLineTextBuffer(TextLine): return begin = min(cursor, mark) end = max(cursor, mark) - toclipboard = "".join(self.line_buffer[begin:end]) + toclipboard = u"".join(self.line_buffer[begin:end]) clipboard.SetClipboardText(toclipboard) def copy_selection_to_clipboard(self): # () - '''Copy the text in the region to the windows clipboard.''' + u'''Copy the text in the region to the windows clipboard.''' if self.enable_win32_clipboard and self.enable_selection and self.selection_mark >= 0: selection_mark = min(self.selection_mark,len(self.line_buffer)) cursor = min(self.point,len(self.line_buffer)) @@ -732,7 +732,7 @@ class ReadLineTextBuffer(TextLine): return begin = min(cursor, selection_mark) end = max(cursor, selection_mark) - toclipboard = "".join(self.line_buffer[begin:end]) + toclipboard = u"".join(self.line_buffer[begin:end]) clipboard.SetClipboardText(toclipboard) @@ -755,45 +755,45 @@ class ReadLineTextBuffer(TextLine): ################################################################## -q = ReadLineTextBuffer("asff asFArw ewrWErhg", point=8) -q = TextLine("asff asFArw ewrWErhg", point=8) +q = ReadLineTextBuffer(u"asff asFArw ewrWErhg", point=8) +q = TextLine(u"asff asFArw ewrWErhg", point=8) -def show_pos(buff, pos, chr = "."): +def show_pos(buff, pos, chr = u"."): l = len(buff.line_buffer) def choice(bool): if bool: return chr else: - return " " - return "".join([choice(pos==idx) for idx in range(l + 1)]) + return u" " + return u"".join([choice(pos==idx) for idx in range(l + 1)]) def test_positioner(buff, points, positioner): - print((" %s "%positioner.__class__.__name__).center(40, "-")) + print (u" %s "%positioner.__class__.__name__).center(40, u"-") buffstr = buff.line_buffer - print('"%s"'%(buffstr)) + print u'"%s"'%(buffstr) for point in points: b = TextLine(buff, point = point) - out=[" "] * (len(buffstr) + 1) + out=[u" "] * (len(buffstr) + 1) pos = positioner(b) if pos == point: - out[pos] = "&" + out[pos] = u"&" else: - out[point] = "." - out[pos] = "^" - print('"%s"'%("".join(out))) + out[point] = u"." + out[pos] = u"^" + print u'"%s"'%(u"".join(out)) if __name__ == "__main__": - print('%-15s "%s"'%("Position", q.get_line_text())) - print('%-15s "%s"'%("Point", show_pos(q, q.point))) + print u'%-15s "%s"'%(u"Position", q.get_line_text()) + print u'%-15s "%s"'%(u"Point", show_pos(q, q.point)) for name, positioner in all_positioners: pos = positioner(q) [] - print('%-15s "%s"'%(name, show_pos(q, pos, "^"))) + print u'%-15s "%s"'%(name, show_pos(q, pos, u"^")) - l = ReadLineTextBuffer("kjjk asads asad") + l = ReadLineTextBuffer(u"kjjk asads asad") l.point = EndOfLine diff --git a/pyreadline/lineeditor/wordmatcher.py b/pyreadline/lineeditor/wordmatcher.py index a0caa8a..7454516 100644 --- a/pyreadline/lineeditor/wordmatcher.py +++ b/pyreadline/lineeditor/wordmatcher.py @@ -20,36 +20,36 @@ def str_find_all(str, ch): return result -word_pattern = re.compile("(x*)") +word_pattern = re.compile(u"(x*)") def markwords(str, iswordfun): - markers = {True : "x", False : "o"} + markers = {True : u"x", False : u"o"} return "".join([markers[iswordfun(ch)] for ch in str]) def split_words(str, iswordfun): - return [x for x in word_pattern.split(markwords(str,iswordfun)) if x != ""] + return [x for x in word_pattern.split(markwords(str,iswordfun)) if x != u""] def mark_start_segment(str, is_segment): def mark_start(s): - if s[0:1] == "x": - return "s" + s[1:] + if s[0:1] == u"x": + return u"s" + s[1:] else: return s - return "".join(map(mark_start, split_words(str, is_segment))) + return u"".join(map(mark_start, split_words(str, is_segment))) def mark_end_segment(str, is_segment): def mark_start(s): - if s[0:1] == "x": - return s[:-1] + "s" + if s[0:1] == u"x": + return s[:-1] + u"s" else: return s - return "".join(map(mark_start, split_words(str, is_segment))) + return u"".join(map(mark_start, split_words(str, is_segment))) def mark_start_segment_index(str, is_segment): - return str_find_all(mark_start_segment(str, is_segment), "s") + return str_find_all(mark_start_segment(str, is_segment), u"s") def mark_end_segment_index(str, is_segment): - return [x + 1 for x in str_find_all(mark_end_segment(str, is_segment), "s")] + return [x + 1 for x in str_find_all(mark_end_segment(str, is_segment), u"s")] ################ Following are used in lineobj ########################### @@ -58,13 +58,13 @@ def is_word_token(str): return not is_non_word_token(str) def is_non_word_token(str): - if len(str) != 1 or str in " \t\n": + if len(str) != 1 or str in u" \t\n": return True else: return False def next_start_segment(str, is_segment): - str = "".join(str) + str = u"".join(str) result = [] for start in mark_start_segment_index(str, is_segment): result[len(result):start] = [start for x in range(start - len(result))] @@ -72,7 +72,7 @@ def next_start_segment(str, is_segment): return result def next_end_segment(str, is_segment): - str = "".join(str) + str = u"".join(str) result = [] for start in mark_end_segment_index(str, is_segment): result[len(result):start] = [start for x in range(start - len(result))] @@ -81,7 +81,7 @@ def next_end_segment(str, is_segment): def prev_start_segment(str, is_segment): - str = "".join(str) + str = u"".join(str) result = [] prev = 0 for start in mark_start_segment_index(str, is_segment): @@ -91,7 +91,7 @@ def prev_start_segment(str, is_segment): return result def prev_end_segment(str, is_segment): - str = "".join(str) + str = u"".join(str) result = [] prev = 0 for start in mark_end_segment_index(str, is_segment): diff --git a/pyreadline/logger.py b/pyreadline/logger.py index da07c43..81e3dc4 100644 --- a/pyreadline/logger.py +++ b/pyreadline/logger.py @@ -7,13 +7,13 @@ #***************************************************************************** import socket, logging, logging.handlers -from pyreadline.unicode_helper import ensure_bytes +from pyreadline.unicode_helper import ensure_str -host = "localhost" +host = u"localhost" port = logging.handlers.DEFAULT_TCP_LOGGING_PORT -pyreadline_logger = logging.getLogger('PYREADLINE') +pyreadline_logger = logging.getLogger(u'PYREADLINE') pyreadline_logger.setLevel(logging.DEBUG) pyreadline_logger.propagate = False formatter = logging.Formatter('%(message)s') @@ -28,7 +28,7 @@ class SocketStream(object): self.logsocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) def write(self, s): - self.logsocket.sendto(ensure_bytes(s), (host, port)) + self.logsocket.sendto(ensure_str(s), (host, port)) def flush(self): pass @@ -64,10 +64,10 @@ def stop_file_log(): file_handler = None def stop_logging(): - log("STOPING LOG") + log(u"STOPING LOG") stop_file_log() stop_socket_log() def log(s): - s = ensure_bytes(s) + s = ensure_str(s) pyreadline_logger.debug(s) diff --git a/pyreadline/logserver.py b/pyreadline/logserver.py index 5692bce..df2f365 100644 --- a/pyreadline/logserver.py +++ b/pyreadline/logserver.py @@ -5,21 +5,21 @@ # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #***************************************************************************** -import pickle +import cPickle import logging import logging.handlers -import socketserver +import SocketServer import struct,socket try: import msvcrt except ImportError: msvcrt = None - print("problem") + print u"problem" port = logging.handlers.DEFAULT_TCP_LOGGING_PORT -host = 'localhost' +host = u'localhost' def check_key(): if msvcrt is None: @@ -28,30 +28,30 @@ def check_key(): if msvcrt.kbhit() != 0: q = msvcrt.getch() return q - return "" + return u"" singleline=False def main(): - print("Starting TCP logserver on port:", port) - print("Press q to quit logserver", port) - print("Press c to clear screen", port) + print u"Starting TCP logserver on port:", port + print u"Press q to quit logserver", port + print u"Press c to clear screen", port s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.bind(("", port)) + s.bind((u"", port)) s.settimeout(1) while 1: try: data, addr = s.recvfrom(100000) - print(data, end=' ') + print data, except socket.timeout: key = check_key().lower() - if "q" == key: - print("Quitting logserver") + if u"q" == key: + print u"Quitting logserver" break - elif "c" == key: - print("\n" * 100) + elif u"c" == key: + print u"\n" * 100 -if __name__ == "__main__": +if __name__ == u"__main__": main() \ No newline at end of file diff --git a/pyreadline/modes/__init__.py b/pyreadline/modes/__init__.py index ae3e61a..b4d6544 100644 --- a/pyreadline/modes/__init__.py +++ b/pyreadline/modes/__init__.py @@ -1,5 +1,5 @@ __all__=["emacs","notemacs","vi"] -from . import emacs,notemacs,vi +import emacs,notemacs,vi editingmodes=[emacs.EmacsMode,notemacs.NotEmacsMode,vi.ViMode] #add check to ensure all modes have unique mode names \ No newline at end of file diff --git a/pyreadline/modes/basemode.py b/pyreadline/modes/basemode.py index b4fe03d..df1147d 100644 --- a/pyreadline/modes/basemode.py +++ b/pyreadline/modes/basemode.py @@ -14,12 +14,11 @@ import pyreadline.lineeditor.lineobj as lineobj import pyreadline.lineeditor.history as history import pyreadline.clipboard as clipboard from pyreadline.error import ReadlineError,GetSetError -from pyreadline.unicode_helper import ensure_bytes, ensure_str -import collections -in_ironpython="IronPython" in sys.version +from pyreadline.unicode_helper import ensure_str, ensure_unicode +in_ironpython=u"IronPython" in sys.version class BaseMode(object): - mode="base" + mode=u"base" def __init__(self,rlobj): self.argument=0 self.rlobj=rlobj @@ -29,10 +28,10 @@ class BaseMode(object): self.prevargument=None self.l_buffer=lineobj.ReadLineTextBuffer("") self._history=history.LineHistory() - self.completer_delims = " \t\n\"\\'`@$><=;|&{(" - self.show_all_if_ambiguous = 'off' - self.mark_directories = 'on' - self.complete_filesystem = 'off' + self.completer_delims = u" \t\n\"\\'`@$><=;|&{(" + self.show_all_if_ambiguous = u'off' + self.mark_directories = u'on' + self.complete_filesystem = u'off' self.completer = None self.begidx = 0 self.endidx = 0 @@ -42,7 +41,7 @@ class BaseMode(object): self.first_prompt = True self.cursor_size=25 - self.prompt = ">>> " + self.prompt = u">>> " #Paste settings #assumes data on clipboard is path if shorter than 300 characters and doesn't contain \t or \n @@ -59,7 +58,7 @@ class BaseMode(object): def __repr__(self): - return "" + return u"" def _gs(x): def g(self): @@ -82,29 +81,29 @@ class BaseMode(object): argument_reset=property(_argreset) #used in readline - ctrl_c_tap_time_interval=property(*_gs("ctrl_c_tap_time_interval")) - allow_ctrl_c=property(*_gs("allow_ctrl_c")) - _print_prompt=property(_g("_print_prompt")) - _update_line=property(_g("_update_line")) - console=property(_g("console")) - prompt_begin_pos=property(_g("prompt_begin_pos")) - prompt_end_pos=property(_g("prompt_end_pos")) + ctrl_c_tap_time_interval=property(*_gs(u"ctrl_c_tap_time_interval")) + allow_ctrl_c=property(*_gs(u"allow_ctrl_c")) + _print_prompt=property(_g(u"_print_prompt")) + _update_line=property(_g(u"_update_line")) + console=property(_g(u"console")) + prompt_begin_pos=property(_g(u"prompt_begin_pos")) + prompt_end_pos=property(_g(u"prompt_end_pos")) #used in completer _completions # completer_delims=property(*_gs("completer_delims")) - _bell=property(_g("_bell")) - bell_style=property(_g("bell_style")) + _bell=property(_g(u"_bell")) + bell_style=property(_g(u"bell_style")) #used in emacs - _clear_after=property(_g("_clear_after")) - _update_prompt_pos=property(_g("_update_prompt_pos")) + _clear_after=property(_g(u"_clear_after")) + _update_prompt_pos=property(_g(u"_update_prompt_pos")) #not used in basemode or emacs def process_keyevent(self, keyinfo): raise NotImplementedError - def readline_setup(self, prompt=''): + def readline_setup(self, prompt=u''): self.l_buffer.selection_mark=-1 if self.first_prompt: self.first_prompt = False @@ -112,7 +111,7 @@ class BaseMode(object): try: self.startup_hook() except: - print('startup hook failed') + print u'startup hook failed' traceback.print_exc() self.l_buffer.reset_line() @@ -122,7 +121,7 @@ class BaseMode(object): try: self.pre_input_hook() except: - print('pre_input_hook failed') + print u'pre_input_hook failed' traceback.print_exc() self.pre_input_hook = None @@ -131,7 +130,7 @@ class BaseMode(object): def finalize(self): - """Every bindable command should call this function for cleanup. + u"""Every bindable command should call this function for cleanup. Except those that want to set argument to a non-zero value. """ self.argument=0 @@ -143,13 +142,13 @@ class BaseMode(object): #Create key bindings: def rl_settings_to_string(self): - out=["%-20s: %s"%("show all if ambigous",self.show_all_if_ambiguous)] - out.append("%-20s: %s"%("mark_directories",self.mark_directories)) - out.append("%-20s: %s"%("bell_style",self.bell_style)) - out.append("------------- key bindings ------------") - tablepat="%-7s %-7s %-7s %-15s %-15s " - out.append(tablepat%("Control","Meta","Shift","Keycode/char","Function")) - bindings=[(k[0],k[1],k[2],k[3],v.__name__) for k,v in self.key_dispatch.items()] + out=[u"%-20s: %s"%(u"show all if ambigous",self.show_all_if_ambiguous)] + out.append(u"%-20s: %s"%(u"mark_directories",self.mark_directories)) + out.append(u"%-20s: %s"%(u"bell_style",self.bell_style)) + out.append(u"------------- key bindings ------------") + tablepat=u"%-7s %-7s %-7s %-15s %-15s " + out.append(tablepat%(u"Control",u"Meta",u"Shift",u"Keycode/char",u"Function")) + bindings=[(k[0],k[1],k[2],k[3],v.__name__) for k,v in self.key_dispatch.iteritems()] bindings.sort() for key in bindings: out.append(tablepat%(key)) @@ -157,16 +156,16 @@ class BaseMode(object): def _bind_key(self, key, func): - """setup the mapping from key to call the function.""" - if not isinstance(func, collections.Callable): - print("Trying to bind non method to keystroke:%s,%s"%(key,func)) - raise ReadlineError("Trying to bind non method to keystroke:%s,%s,%s,%s"%(key,func,type(func),type(self._bind_key))) + u"""setup the mapping from key to call the function.""" + if not callable(func): + print u"Trying to bind non method to keystroke:%s,%s"%(key,func) + raise ReadlineError(u"Trying to bind non method to keystroke:%s,%s,%s,%s"%(key,func,type(func),type(self._bind_key))) keyinfo = make_KeyPress_from_keydescr(key.lower()).tuple() - log(">>>%s -> %s<<<"%(keyinfo,func.__name__)) + log(u">>>%s -> %s<<<"%(keyinfo,func.__name__)) self.key_dispatch[keyinfo] = func def _bind_exit_key(self, key): - """setup the mapping from key to call the function.""" + u"""setup the mapping from key to call the function.""" keyinfo = make_KeyPress_from_keydescr(key.lower()).tuple() self.exit_dispatch[keyinfo] = None @@ -191,12 +190,12 @@ class BaseMode(object): if buf[self.begidx] in self.completer_delims: self.begidx += 1 break - text = ensure_bytes(''.join(buf[self.begidx:self.endidx])) - log('complete text="%s"' % ensure_str(text)) + text = ensure_str(u''.join(buf[self.begidx:self.endidx])) + log(u'complete text="%s"' % ensure_unicode(text)) i = 0 while 1: try: - r = self.completer(ensure_str(text), i) + r = ensure_unicode(self.completer(text, i)) except IndexError: break i += 1 @@ -206,18 +205,18 @@ class BaseMode(object): completions.append(r) else: pass - log('text completions=<%s>' % list(map(ensure_str, completions))) + log(u'text completions=<%s>' % map(ensure_unicode, completions)) if (self.complete_filesystem == "on") and not completions: # get the filename to complete while self.begidx > 0: self.begidx -= 1 - if buf[self.begidx] in ' \t\n': + if buf[self.begidx] in u' \t\n': self.begidx += 1 break - text = ensure_bytes(''.join(buf[self.begidx:self.endidx])) - log('file complete text="%s"' % ensure_str(text)) - completions = list(map(ensure_str, glob.glob(os.path.expanduser(text) + b'*'))) - if self.mark_directories == 'on': + text = ensure_str(u''.join(buf[self.begidx:self.endidx])) + log(u'file complete text="%s"' % ensure_unicode(text)) + completions = map(ensure_unicode, glob.glob(os.path.expanduser(text) + '*')) + if self.mark_directories == u'on': mc = [] for f in completions: if os.path.isdir(f): @@ -225,32 +224,32 @@ class BaseMode(object): else: mc.append(f) completions = mc - log('fnames=<%s>' % list(map(ensure_str, completions))) + log(u'fnames=<%s>' % map(ensure_unicode, completions)) return completions def _display_completions(self, completions): if not completions: return - self.console.write('\n') - wmax = max(list(map(len, completions))) + self.console.write(u'\n') + wmax = max(map(len, completions)) w, h = self.console.size() cols = max(1, int((w-1) / (wmax+1))) rows = int(math.ceil(float(len(completions)) / cols)) for row in range(rows): - s = '' + s = u'' for col in range(cols): i = col*rows + row if i < len(completions): self.console.write(completions[i].ljust(wmax+1)) - self.console.write('\n') + self.console.write(u'\n') if in_ironpython: self.prompt=sys.ps1 self._print_prompt() def complete(self, e): # (TAB) - """Attempt to perform completion on the text before point. The + u"""Attempt to perform completion on the text before point. The actual completion performed is application-specific. The default is filename completion.""" completions = self._get_completions() @@ -262,7 +261,7 @@ class BaseMode(object): self.l_buffer[self.begidx:self.endidx] = rep self.l_buffer.point = point + len(rep) - (self.endidx - self.begidx) if len(completions) > 1: - if self.show_all_if_ambiguous == 'on': + if self.show_all_if_ambiguous == u'on': self._display_completions(completions) else: self._bell() @@ -271,13 +270,13 @@ class BaseMode(object): self.finalize() def possible_completions(self, e): # (M-?) - """List the possible completions of the text before point. """ + u"""List the possible completions of the text before point. """ completions = self._get_completions() self._display_completions(completions) self.finalize() def insert_completions(self, e): # (M-*) - """Insert all completions of the text before point that would have + u"""Insert all completions of the text before point that would have been generated by possible-completions.""" completions = self._get_completions() b = self.begidx @@ -292,7 +291,7 @@ class BaseMode(object): self.finalize() def menu_complete(self, e): # () - """Similar to complete, but replaces the word to be completed with a + u"""Similar to complete, but replaces the word to be completed with a single match from the list of possible completions. Repeated execution of menu-complete steps through the list of possible completions, inserting each match in turn. At the end of the list of @@ -307,95 +306,95 @@ class BaseMode(object): def insert_text(self, string): - """Insert text into the command line.""" + u"""Insert text into the command line.""" self.l_buffer.insert_text(string, self.argument_reset) self.finalize() def beginning_of_line(self, e): # (C-a) - """Move to the start of the current line. """ + u"""Move to the start of the current line. """ self.l_buffer.beginning_of_line() self.finalize() def end_of_line(self, e): # (C-e) - """Move to the end of the line. """ + u"""Move to the end of the line. """ self.l_buffer.end_of_line() self.finalize() def forward_char(self, e): # (C-f) - """Move forward a character. """ + u"""Move forward a character. """ self.l_buffer.forward_char(self.argument_reset) self.finalize() def backward_char(self, e): # (C-b) - """Move back a character. """ + u"""Move back a character. """ self.l_buffer.backward_char(self.argument_reset) self.finalize() def forward_word(self, e): # (M-f) - """Move forward to the end of the next word. Words are composed of + u"""Move forward to the end of the next word. Words are composed of letters and digits.""" self.l_buffer.forward_word(self.argument_reset) self.finalize() def backward_word(self, e): # (M-b) - """Move back to the start of the current or previous word. Words are + u"""Move back to the start of the current or previous word. Words are composed of letters and digits.""" self.l_buffer.backward_word(self.argument_reset) self.finalize() def forward_word_end(self, e): # () - """Move forward to the end of the next word. Words are composed of + u"""Move forward to the end of the next word. Words are composed of letters and digits.""" self.l_buffer.forward_word_end(self.argument_reset) self.finalize() def backward_word_end(self, e): # () - """Move forward to the end of the next word. Words are composed of + u"""Move forward to the end of the next word. Words are composed of letters and digits.""" self.l_buffer.backward_word_end(self.argument_reset) self.finalize() ### Movement with extend selection def beginning_of_line_extend_selection(self, e): # - """Move to the start of the current line. """ + u"""Move to the start of the current line. """ self.l_buffer.beginning_of_line_extend_selection() self.finalize() def end_of_line_extend_selection(self, e): # - """Move to the end of the line. """ + u"""Move to the end of the line. """ self.l_buffer.end_of_line_extend_selection() self.finalize() def forward_char_extend_selection(self, e): # - """Move forward a character. """ + u"""Move forward a character. """ self.l_buffer.forward_char_extend_selection(self.argument_reset) self.finalize() def backward_char_extend_selection(self, e): # - """Move back a character. """ + u"""Move back a character. """ self.l_buffer.backward_char_extend_selection(self.argument_reset) self.finalize() def forward_word_extend_selection(self, e): # - """Move forward to the end of the next word. Words are composed of + u"""Move forward to the end of the next word. Words are composed of letters and digits.""" self.l_buffer.forward_word_extend_selection(self.argument_reset) self.finalize() def backward_word_extend_selection(self, e): # - """Move back to the start of the current or previous word. Words are + u"""Move back to the start of the current or previous word. Words are composed of letters and digits.""" self.l_buffer.backward_word_extend_selection(self.argument_reset) self.finalize() def forward_word_end_extend_selection(self, e): # - """Move forward to the end of the next word. Words are composed of + u"""Move forward to the end of the next word. Words are composed of letters and digits.""" self.l_buffer.forward_word_end_extend_selection(self.argument_reset) self.finalize() def backward_word_end_extend_selection(self, e): # - """Move forward to the end of the next word. Words are composed of + u"""Move forward to the end of the next word. Words are composed of letters and digits.""" self.l_buffer.forward_word_end_extend_selection(self.argument_reset) self.finalize() @@ -404,19 +403,19 @@ class BaseMode(object): ######## Change case def upcase_word(self, e): # (M-u) - """Uppercase the current (or following) word. With a negative + u"""Uppercase the current (or following) word. With a negative argument, uppercase the previous word, but do not move the cursor.""" self.l_buffer.upcase_word() self.finalize() def downcase_word(self, e): # (M-l) - """Lowercase the current (or following) word. With a negative + u"""Lowercase the current (or following) word. With a negative argument, lowercase the previous word, but do not move the cursor.""" self.l_buffer.downcase_word() self.finalize() def capitalize_word(self, e): # (M-c) - """Capitalize the current (or following) word. With a negative + u"""Capitalize the current (or following) word. With a negative argument, capitalize the previous word, but do not move the cursor.""" self.l_buffer.capitalize_word() self.finalize() @@ -424,17 +423,17 @@ class BaseMode(object): ######## def clear_screen(self, e): # (C-l) - """Clear the screen and redraw the current line, leaving the current + u"""Clear the screen and redraw the current line, leaving the current line at the top of the screen.""" self.console.page() self.finalize() def redraw_current_line(self, e): # () - """Refresh the current line. By default, this is unbound.""" + u"""Refresh the current line. By default, this is unbound.""" self.finalize() def accept_line(self, e): # (Newline or Return) - """Accept the line regardless of where the cursor is. If this line + u"""Accept the line regardless of where the cursor is. If this line is non-empty, it may be added to the history list for future recall with add_history(). If this line is a modified history line, the history line is restored to its original state.""" @@ -442,37 +441,37 @@ class BaseMode(object): return True def delete_char(self, e): # (C-d) - """Delete the character at point. If point is at the beginning of + u"""Delete the character at point. If point is at the beginning of the line, there are no characters in the line, and the last character typed was not bound to delete-char, then return EOF.""" self.l_buffer.delete_char(self.argument_reset) self.finalize() def backward_delete_char(self, e): # (Rubout) - """Delete the character behind the cursor. A numeric argument means + u"""Delete the character behind the cursor. A numeric argument means to kill the characters instead of deleting them.""" self.l_buffer.backward_delete_char(self.argument_reset) self.finalize() def backward_delete_word(self, e): # (Control-Rubout) - """Delete the character behind the cursor. A numeric argument means + u"""Delete the character behind the cursor. A numeric argument means to kill the characters instead of deleting them.""" self.l_buffer.backward_delete_word(self.argument_reset) self.finalize() def forward_delete_word(self, e): # (Control-Delete) - """Delete the character behind the cursor. A numeric argument means + u"""Delete the character behind the cursor. A numeric argument means to kill the characters instead of deleting them.""" self.l_buffer.forward_delete_word(self.argument_reset) self.finalize() def delete_horizontal_space(self, e): # () - """Delete all spaces and tabs around point. By default, this is unbound. """ + u"""Delete all spaces and tabs around point. By default, this is unbound. """ self.l_buffer.delete_horizontal_space() self.finalize() def self_insert(self, e): # (a, b, A, 1, !, ...) - """Insert yourself. """ + u"""Insert yourself. """ if e.char and ord(e.char)!=0: #don't insert null character in buffer, can happen with dead keys. self.insert_text(e.char) self.finalize() @@ -481,17 +480,17 @@ class BaseMode(object): # Paste from clipboard def paste(self,e): - """Paste windows clipboard. + u"""Paste windows clipboard. Assume single line strip other lines and end of line markers and trailing spaces""" #(Control-v) if self.enable_win32_clipboard: txt=clipboard.get_clipboard_text_and_convert(False) txt=txt.split("\n")[0].strip("\r").strip("\n") - log("paste: >%s<"%list(map(ord,txt))) + log("paste: >%s<"%map(ord,txt)) self.insert_text(txt) self.finalize() def paste_mulitline_code(self,e): - """Paste windows clipboard as multiline code. + u"""Paste windows clipboard as multiline code. Removes any empty lines in the code""" reg=re.compile("\r?\n") if self.enable_win32_clipboard: @@ -509,7 +508,7 @@ class BaseMode(object): self.finalize() def ipython_paste(self,e): - """Paste windows clipboard. If enable_ipython_paste_list_of_lists is + u"""Paste windows clipboard. If enable_ipython_paste_list_of_lists is True then try to convert tabseparated data to repr of list of lists or repr of array. If enable_ipython_paste_for_paths==True then change \\ to / and spaces to \space""" @@ -524,39 +523,39 @@ class BaseMode(object): def copy_region_to_clipboard(self, e): # () - """Copy the text in the region to the windows clipboard.""" + u"""Copy the text in the region to the windows clipboard.""" self.l_buffer.copy_region_to_clipboard() self.finalize() def copy_selection_to_clipboard(self, e): # () - """Copy the text in the region to the windows clipboard.""" + u"""Copy the text in the region to the windows clipboard.""" self.l_buffer.copy_selection_to_clipboard() self.finalize() def cut_selection_to_clipboard(self, e): # () - """Copy the text in the region to the windows clipboard.""" + u"""Copy the text in the region to the windows clipboard.""" self.l_buffer.cut_selection_to_clipboard() self.finalize() def dump_functions(self, e): # () - """Print all of the functions and their key bindings to the Readline + u"""Print all of the functions and their key bindings to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.""" - print() + print txt="\n".join(self.rl_settings_to_string()) - print(txt) + print txt self._print_prompt() self.finalize() def commonprefix(m): - "Given a list of pathnames, returns the longest common leading component" - if not m: return '' + u"Given a list of pathnames, returns the longest common leading component" + if not m: return u'' prefix = m[0] for item in m: for i in range(len(prefix)): if prefix[:i+1].lower() != item[:i+1].lower(): prefix = prefix[:i] - if i == 0: return '' + if i == 0: return u'' break return prefix diff --git a/pyreadline/modes/emacs.py b/pyreadline/modes/emacs.py index d3ac116..a388b91 100644 --- a/pyreadline/modes/emacs.py +++ b/pyreadline/modes/emacs.py @@ -12,8 +12,8 @@ from pyreadline.logger import log from pyreadline.lineeditor.lineobj import Point import pyreadline.lineeditor.lineobj as lineobj import pyreadline.lineeditor.history as history -from . import basemode -from pyreadline.unicode_helper import ensure_str +import basemode +from pyreadline.unicode_helper import ensure_unicode def format(keyinfo): @@ -21,9 +21,9 @@ def format(keyinfo): k = keyinfo + (-1,) else: k = keyinfo + (ord(keyinfo[-1]),) - return "(%s,%s,%s,%s,%x)"%k + return u"(%s,%s,%s,%s,%x)"%k -in_ironpython = "IronPython" in sys.version +in_ironpython = u"IronPython" in sys.version class IncrementalSearchPromptMode(object): @@ -32,20 +32,20 @@ class IncrementalSearchPromptMode(object): def _process_incremental_search_keyevent(self, keyinfo): keytuple = keyinfo.tuple() - log("IncrementalSearchPromptMode %s %s"%(keyinfo, keytuple)) - if keyinfo.keyname == 'backspace': + log(u"IncrementalSearchPromptMode %s %s"%(keyinfo, keytuple)) + if keyinfo.keyname == u'backspace': self.subsearch_query = self.subsearch_query[:-1] if len(self.subsearch_query) > 0: self.line = self.subsearch_fun(self.subsearch_query) else: self._bell() self.line = "" # empty query means no search result - elif keyinfo.keyname in ['return', 'escape']: + elif keyinfo.keyname in [u'return', u'escape']: self._bell() self.prompt = self.subsearch_oldprompt self.process_keyevent_queue = self.process_keyevent_queue[:-1] self._history.history_cursor = len(self._history.history) - if keyinfo.keyname == 'escape': + if keyinfo.keyname == u'escape': self.l_buffer.set_line(self.subsearch_old_line) return False elif keyinfo.keyname: @@ -62,11 +62,11 @@ class IncrementalSearchPromptMode(object): self.l_buffer.set_line(self.line) def _init_incremental_search(self, searchfun, direction, init_event): - """Initialize search prompt + u"""Initialize search prompt """ self.subsearch_init_event = init_event.tuple() self.subsearch_direction = direction - self.subsearch_query = '' + self.subsearch_query = u'' self.subsearch_fun = searchfun self.subsearch_old_line = self.l_buffer.get_line_text() @@ -80,16 +80,16 @@ class IncrementalSearchPromptMode(object): self.subsearch_query = self.l_buffer[0:Point].get_line_text() if self.subsearch_direction < 0: - self.subsearch_prompt = "reverse-i-search`%s': " + self.subsearch_prompt = u"reverse-i-search`%s': " else: - self.subsearch_prompt = "forward-i-search`%s': " + self.subsearch_prompt = u"forward-i-search`%s': " self.prompt = self.subsearch_prompt%"" if self.subsearch_query: self.line = self._process_incremental_search_keyevent(init_event) else: - self.line = "" + self.line = u"" class SearchPromptMode(object): @@ -98,12 +98,12 @@ class SearchPromptMode(object): def _process_non_incremental_search_keyevent(self, keyinfo): keytuple = keyinfo.tuple() - log("SearchPromptMode %s %s"%(keyinfo, keytuple)) + log(u"SearchPromptMode %s %s"%(keyinfo, keytuple)) history = self._history - if keyinfo.keyname == 'backspace': + if keyinfo.keyname == u'backspace': self.non_inc_query = self.non_inc_query[:-1] - elif keyinfo.keyname in ['return', 'escape']: + elif keyinfo.keyname in [u'return', u'escape']: if self.non_inc_query: if self.non_inc_direction == -1: res = history.reverse_search_history(self.non_inc_query) @@ -114,7 +114,7 @@ class SearchPromptMode(object): self.prompt = self.non_inc_oldprompt self.process_keyevent_queue = self.process_keyevent_queue[:-1] self._history.history_cursor = len(self._history.history) - if keyinfo.keyname == 'escape': + if keyinfo.keyname == u'escape': self.l_buffer = self.non_inc_oldline else: self.l_buffer.set_line(res) @@ -125,26 +125,26 @@ class SearchPromptMode(object): self.non_inc_query += keyinfo.char else: pass - self.prompt = self.non_inc_oldprompt + ":" + self.non_inc_query + self.prompt = self.non_inc_oldprompt + u":" + self.non_inc_query def _init_non_i_search(self, direction): self.non_inc_direction = direction - self.non_inc_query = "" + self.non_inc_query = u"" self.non_inc_oldprompt = self.prompt self.non_inc_oldline = self.l_buffer.copy() self.l_buffer.reset_line() - self.prompt = self.non_inc_oldprompt + ":" + self.prompt = self.non_inc_oldprompt + u":" queue = self.process_keyevent_queue queue.append(self._process_non_incremental_search_keyevent) def non_incremental_reverse_search_history(self, e): # (M-p) - '''Search backward starting at the current line and moving up + u'''Search backward starting at the current line and moving up through the history as necessary using a non-incremental search for a string supplied by the user.''' return self._init_non_i_search(-1) def non_incremental_forward_search_history(self, e): # (M-n) - '''Search forward starting at the current line and moving down + u'''Search forward starting at the current line and moving down through the the history as necessary using a non-incremental search for a string supplied by the user.''' return self._init_non_i_search(1) @@ -159,24 +159,24 @@ class DigitArgumentMode(object): pass def _process_digit_argument_keyevent(self, keyinfo): - log("DigitArgumentMode.keyinfo %s"%keyinfo) + log(u"DigitArgumentMode.keyinfo %s"%keyinfo) keytuple = keyinfo.tuple() - log("DigitArgumentMode.keytuple %s %s"%(keyinfo, keytuple)) + log(u"DigitArgumentMode.keytuple %s %s"%(keyinfo, keytuple)) if keyinfo.keyname in ['return']: self.prompt = self._digit_argument_oldprompt self.process_keyevent_queue = self.process_keyevent_queue[:-1] return True elif keyinfo.keyname: pass - elif (keyinfo.char in "0123456789" and + elif (keyinfo.char in u"0123456789" and keyinfo.control == False and keyinfo.meta == False): - log("arg %s %s"%(self.argument, keyinfo.char)) + log(u"arg %s %s"%(self.argument, keyinfo.char)) self.argument = self.argument * 10 + int(keyinfo.char) else: self.prompt = self._digit_argument_oldprompt raise LeaveModeTryNext - self.prompt = "(arg: %s) "%self.argument + self.prompt = u"(arg: %s) "%self.argument def _init_digit_argument(self, keyinfo): """Initialize search prompt @@ -190,11 +190,11 @@ class DigitArgumentMode(object): if keyinfo.char == "-": self.argument = -1 - elif keyinfo.char in "0123456789": + elif keyinfo.char in u"0123456789": self.argument = int(keyinfo.char) - log("<%s> %s"%(self.argument, type(self.argument))) - self.prompt = "(arg: %s) "%self.argument - log("arg-init %s %s"%(self.argument, keyinfo.char)) + log(u"<%s> %s"%(self.argument, type(self.argument))) + self.prompt = u"(arg: %s) "%self.argument + log(u"arg-init %s %s"%(self.argument, keyinfo.char)) class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, @@ -208,18 +208,18 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, DigitArgumentMode.__init__(self, rlobj) self._keylog = (lambda x, y: None) self.previous_func = None - self.prompt = ">>> " + self.prompt = u">>> " self._insert_verbatim = False self.next_meta = False # True to force meta on next character self.process_keyevent_queue = [self._process_keyevent] def __repr__(self): - return "" + return u"" def add_key_logger(self, logfun): - """logfun should be function that takes disp_fun and line_"""\ - """buffer object """ + u"""logfun should be function that takes disp_fun and line_"""\ + u"""buffer object """ self._keylog = logfun def process_keyevent(self, keyinfo): @@ -234,10 +234,10 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, return False def _process_keyevent(self, keyinfo): - """return True when line is final + u"""return True when line is final """ #Process exit keys. Only exit on empty line - log("_process_keyevent <%s>"%keyinfo) + log(u"_process_keyevent <%s>"%keyinfo) def nop(e): pass @@ -254,7 +254,7 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, if keytuple in self.exit_dispatch: pars = (self.l_buffer, lineobj.EndOfLine(self.l_buffer)) - log("exit_dispatch:<%s, %s>"%pars) + log(u"exit_dispatch:<%s, %s>"%pars) if lineobj.EndOfLine(self.l_buffer) == 0: raise EOFError if keyinfo.keyname or keyinfo.control or keyinfo.meta: @@ -263,7 +263,7 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, default = self.self_insert dispatch_func = self.key_dispatch.get(keytuple, default) - log("readline from keyboard:<%s,%s>"%(keytuple, dispatch_func)) + log(u"readline from keyboard:<%s,%s>"%(keytuple, dispatch_func)) r = None if dispatch_func: @@ -276,38 +276,38 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, ######### History commands def previous_history(self, e): # (C-p) - '''Move back through the history list, fetching the previous + u'''Move back through the history list, fetching the previous command. ''' self._history.previous_history(self.l_buffer) self.l_buffer.point = lineobj.EndOfLine self.finalize() def next_history(self, e): # (C-n) - '''Move forward through the history list, fetching the next + u'''Move forward through the history list, fetching the next command. ''' self._history.next_history(self.l_buffer) self.finalize() def beginning_of_history(self, e): # (M-<) - '''Move to the first line in the history.''' + u'''Move to the first line in the history.''' self._history.beginning_of_history() self.finalize() def end_of_history(self, e): # (M->) - '''Move to the end of the input history, i.e., the line currently + u'''Move to the end of the input history, i.e., the line currently being entered.''' self._history.end_of_history(self.l_buffer) self.finalize() def reverse_search_history(self, e): # (C-r) - '''Search backward starting at the current line and moving up + u'''Search backward starting at the current line and moving up through the history as necessary. This is an incremental search.''' self._init_incremental_search(self._history.reverse_search_history, -1, e) self.finalize() def forward_search_history(self, e): # (C-s) - '''Search forward starting at the current line and moving down + u'''Search forward starting at the current line and moving down through the the history as necessary. This is an incremental search.''' self._init_incremental_search(self._history.forward_search_history, @@ -315,7 +315,7 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def history_search_forward(self, e): # () - '''Search forward through the history for the string of characters + u'''Search forward through the history for the string of characters between the start of the current line and the point. This is a non-incremental search. By default, this command is unbound.''' if (self.previous_func and @@ -330,7 +330,7 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def history_search_backward(self, e): # () - '''Search backward through the history for the string of characters + u'''Search backward through the history for the string of characters between the start of the current line and the point. This is a non-incremental search. By default, this command is unbound.''' if (self.previous_func and @@ -345,7 +345,7 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def yank_nth_arg(self, e): # (M-C-y) - '''Insert the first argument to the previous command (usually the + u'''Insert the first argument to the previous command (usually the second word on the previous line) at point. With an argument n, insert the nth word from the previous command (the words in the previous command begin with word 0). A negative argument inserts the @@ -353,33 +353,33 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def yank_last_arg(self, e): # (M-. or M-_) - '''Insert last argument to the previous command (the last word of + u'''Insert last argument to the previous command (the last word of the previous history entry). With an argument, behave exactly like yank-nth-arg. Successive calls to yank-last-arg move back through the history list, inserting the last argument of each line in turn.''' self.finalize() def forward_backward_delete_char(self, e): # () - '''Delete the character under the cursor, unless the cursor is at + u'''Delete the character under the cursor, unless the cursor is at the end of the line, in which case the character behind the cursor is deleted. By default, this is not bound to a key.''' self.finalize() def quoted_insert(self, e): # (C-q or C-v) - '''Add the next character typed to the line verbatim. This is how to + u'''Add the next character typed to the line verbatim. This is how to insert key sequences like C-q, for example.''' self._insert_verbatim = True self.finalize() def tab_insert(self, e): # (M-TAB) - '''Insert a tab character. ''' + u'''Insert a tab character. ''' cursor = min(self.l_buffer.point, len(self.l_buffer.line_buffer)) ws = ' ' * (self.tabstop - (cursor % self.tabstop)) self.insert_text(ws) self.finalize() def transpose_chars(self, e): # (C-t) - '''Drag the character before the cursor forward over the character + u'''Drag the character before the cursor forward over the character at the cursor, moving the cursor forward as well. If the insertion point is at the end of the line, then this transposes the last two characters of the line. Negative arguments have no effect.''' @@ -387,14 +387,14 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def transpose_words(self, e): # (M-t) - '''Drag the word before point past the word after point, moving + u'''Drag the word before point past the word after point, moving point past that word as well. If the insertion point is at the end of the line, this transposes the last two words on the line.''' self.l_buffer.transpose_words() self.finalize() def overwrite_mode(self, e): # () - '''Toggle overwrite mode. With an explicit positive numeric + u'''Toggle overwrite mode. With an explicit positive numeric argument, switches to overwrite mode. With an explicit non-positive numeric argument, switches to insert mode. This command affects only emacs mode; vi mode does overwrite differently. Each call to @@ -405,30 +405,30 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def kill_line(self, e): # (C-k) - '''Kill the text from point to the end of the line. ''' + u'''Kill the text from point to the end of the line. ''' self.l_buffer.kill_line() self.finalize() def backward_kill_line(self, e): # (C-x Rubout) - '''Kill backward to the beginning of the line. ''' + u'''Kill backward to the beginning of the line. ''' self.l_buffer.backward_kill_line() self.finalize() def unix_line_discard(self, e): # (C-u) - '''Kill backward from the cursor to the beginning of the current + u'''Kill backward from the cursor to the beginning of the current line. ''' # how is this different from backward_kill_line? self.l_buffer.unix_line_discard() self.finalize() def kill_whole_line(self, e): # () - '''Kill all characters on the current line, no matter where point + u'''Kill all characters on the current line, no matter where point is. By default, this is unbound.''' self.l_buffer.kill_whole_line() self.finalize() def kill_word(self, e): # (M-d) - '''Kill from point to the end of the current word, or if between + u'''Kill from point to the end of the current word, or if between words, to the end of the next word. Word boundaries are the same as forward-word.''' self.l_buffer.kill_word() @@ -437,133 +437,133 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, forward_kill_word = kill_word def backward_kill_word(self, e): # (M-DEL) - '''Kill the word behind point. Word boundaries are the same as + u'''Kill the word behind point. Word boundaries are the same as backward-word. ''' self.l_buffer.backward_kill_word() self.finalize() def unix_word_rubout(self, e): # (C-w) - '''Kill the word behind point, using white space as a word + u'''Kill the word behind point, using white space as a word boundary. The killed text is saved on the kill-ring.''' self.l_buffer.unix_word_rubout() self.finalize() def kill_region(self, e): # () - '''Kill the text in the current region. By default, this command is + u'''Kill the text in the current region. By default, this command is unbound. ''' self.finalize() def copy_region_as_kill(self, e): # () - '''Copy the text in the region to the kill buffer, so it can be + u'''Copy the text in the region to the kill buffer, so it can be yanked right away. By default, this command is unbound.''' self.finalize() def copy_backward_word(self, e): # () - '''Copy the word before point to the kill buffer. The word + u'''Copy the word before point to the kill buffer. The word boundaries are the same as backward-word. By default, this command is unbound.''' self.finalize() def copy_forward_word(self, e): # () - '''Copy the word following point to the kill buffer. The word + u'''Copy the word following point to the kill buffer. The word boundaries are the same as forward-word. By default, this command is unbound.''' self.finalize() def yank(self, e): # (C-y) - '''Yank the top of the kill ring into the buffer at point. ''' + u'''Yank the top of the kill ring into the buffer at point. ''' self.l_buffer.yank() self.finalize() def yank_pop(self, e): # (M-y) - '''Rotate the kill-ring, and yank the new top. You can only do this + u'''Rotate the kill-ring, and yank the new top. You can only do this if the prior command is yank or yank-pop.''' self.l_buffer.yank_pop() self.finalize() def delete_char_or_list(self, e): # () - '''Deletes the character under the cursor if not at the beginning or + u'''Deletes the character under the cursor if not at the beginning or end of the line (like delete-char). If at the end of the line, behaves identically to possible-completions. This command is unbound by default.''' self.finalize() def start_kbd_macro(self, e): # (C-x () - '''Begin saving the characters typed into the current keyboard + u'''Begin saving the characters typed into the current keyboard macro. ''' self.finalize() def end_kbd_macro(self, e): # (C-x )) - '''Stop saving the characters typed into the current keyboard macro + u'''Stop saving the characters typed into the current keyboard macro and save the definition.''' self.finalize() def call_last_kbd_macro(self, e): # (C-x e) - '''Re-execute the last keyboard macro defined, by making the + u'''Re-execute the last keyboard macro defined, by making the characters in the macro appear as if typed at the keyboard.''' self.finalize() def re_read_init_file(self, e): # (C-x C-r) - '''Read in the contents of the inputrc file, and incorporate any + u'''Read in the contents of the inputrc file, and incorporate any bindings or variable assignments found there.''' self.finalize() def abort(self, e): # (C-g) - '''Abort the current editing command and ring the terminals bell + u'''Abort the current editing command and ring the terminals bell (subject to the setting of bell-style).''' self._bell() self.finalize() def do_uppercase_version(self, e): # (M-a, M-b, M-x, ...) - '''If the metafied character x is lowercase, run the command that is + u'''If the metafied character x is lowercase, run the command that is bound to the corresponding uppercase character.''' self.finalize() def prefix_meta(self, e): # (ESC) - '''Metafy the next character typed. This is for keyboards without a + u'''Metafy the next character typed. This is for keyboards without a meta key. Typing ESC f is equivalent to typing M-f. ''' self.next_meta = True self.finalize() def undo(self, e): # (C-_ or C-x C-u) - '''Incremental undo, separately remembered for each line.''' + u'''Incremental undo, separately remembered for each line.''' self.l_buffer.pop_undo() self.finalize() def revert_line(self, e): # (M-r) - '''Undo all changes made to this line. This is like executing the + u'''Undo all changes made to this line. This is like executing the undo command enough times to get back to the beginning.''' self.finalize() def tilde_expand(self, e): # (M-~) - '''Perform tilde expansion on the current word.''' + u'''Perform tilde expansion on the current word.''' self.finalize() def set_mark(self, e): # (C-@) - '''Set the mark to the point. If a numeric argument is supplied, the + u'''Set the mark to the point. If a numeric argument is supplied, the mark is set to that position.''' self.l_buffer.set_mark() self.finalize() def exchange_point_and_mark(self, e): # (C-x C-x) - '''Swap the point with the mark. The current cursor position is set + u'''Swap the point with the mark. The current cursor position is set to the saved position, and the old cursor position is saved as the mark.''' self.finalize() def character_search(self, e): # (C-]) - '''A character is read and point is moved to the next occurrence of + u'''A character is read and point is moved to the next occurrence of that character. A negative count searches for previous occurrences.''' self.finalize() def character_search_backward(self, e): # (M-C-]) - '''A character is read and point is moved to the previous occurrence + u'''A character is read and point is moved to the previous occurrence of that character. A negative count searches for subsequent occurrences.''' self.finalize() def insert_comment(self, e): # (M-#) - '''Without a numeric argument, the value of the comment-begin + u'''Without a numeric argument, the value of the comment-begin variable is inserted at the beginning of the current line. If a numeric argument is supplied, this command acts as a toggle: if the characters at the beginning of the line do not match the value of @@ -573,27 +573,27 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, self.finalize() def dump_variables(self, e): # () - '''Print all of the settable variables and their values to the + u'''Print all of the settable variables and their values to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.''' self.finalize() def dump_macros(self, e): # () - '''Print all of the Readline key sequences bound to macros and the + u'''Print all of the Readline key sequences bound to macros and the strings they output. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.''' self.finalize() def digit_argument(self, e): # (M-0, M-1, ... M--) - '''Add this digit to the argument already accumulating, or start a + u'''Add this digit to the argument already accumulating, or start a new argument. M-- starts a negative argument.''' self._init_digit_argument(e) #Should not finalize def universal_argument(self, e): # () - '''This is another way to specify an argument. If this command is + u'''This is another way to specify an argument. If this command is followed by one or more digits, optionally with a leading minus sign, those digits define the argument. If the command is followed by digits, executing universal-argument again ends the numeric @@ -608,99 +608,99 @@ class EmacsMode(DigitArgumentMode, IncrementalSearchPromptMode, #Create key bindings: def init_editing_mode(self, e): # (C-e) - '''When in vi command mode, this causes a switch to emacs editing + u'''When in vi command mode, this causes a switch to emacs editing mode.''' - self._bind_exit_key('Control-d') - self._bind_exit_key('Control-z') + self._bind_exit_key(u'Control-d') + self._bind_exit_key(u'Control-z') # I often accidentally hold the shift or control while typing space - self._bind_key('space', self.self_insert) - self._bind_key('Shift-space', self.self_insert) - self._bind_key('Control-space', self.self_insert) - self._bind_key('Return', self.accept_line) - self._bind_key('Left', self.backward_char) - self._bind_key('Control-b', self.backward_char) - self._bind_key('Right', self.forward_char) - self._bind_key('Control-f', self.forward_char) - self._bind_key('Control-h', self.backward_delete_char) - self._bind_key('BackSpace', self.backward_delete_char) - self._bind_key('Control-BackSpace', self.backward_delete_word) + self._bind_key(u'space', self.self_insert) + self._bind_key(u'Shift-space', self.self_insert) + self._bind_key(u'Control-space', self.self_insert) + self._bind_key(u'Return', self.accept_line) + self._bind_key(u'Left', self.backward_char) + self._bind_key(u'Control-b', self.backward_char) + self._bind_key(u'Right', self.forward_char) + self._bind_key(u'Control-f', self.forward_char) + self._bind_key(u'Control-h', self.backward_delete_char) + self._bind_key(u'BackSpace', self.backward_delete_char) + self._bind_key(u'Control-BackSpace', self.backward_delete_word) - self._bind_key('Home', self.beginning_of_line) - self._bind_key('End', self.end_of_line) - self._bind_key('Delete', self.delete_char) - self._bind_key('Control-d', self.delete_char) - self._bind_key('Clear', self.clear_screen) - self._bind_key('Alt-f', self.forward_word) - self._bind_key('Alt-b', self.backward_word) - self._bind_key('Control-l', self.clear_screen) - self._bind_key('Control-p', self.previous_history) - self._bind_key('Up', self.history_search_backward) - self._bind_key('Control-n', self.next_history) - self._bind_key('Down', self.history_search_forward) - self._bind_key('Control-a', self.beginning_of_line) - self._bind_key('Control-e', self.end_of_line) - self._bind_key('Alt-<', self.beginning_of_history) - self._bind_key('Alt->', self.end_of_history) - self._bind_key('Control-r', self.reverse_search_history) - self._bind_key('Control-s', self.forward_search_history) - self._bind_key('Alt-p', + self._bind_key(u'Home', self.beginning_of_line) + self._bind_key(u'End', self.end_of_line) + self._bind_key(u'Delete', self.delete_char) + self._bind_key(u'Control-d', self.delete_char) + self._bind_key(u'Clear', self.clear_screen) + self._bind_key(u'Alt-f', self.forward_word) + self._bind_key(u'Alt-b', self.backward_word) + self._bind_key(u'Control-l', self.clear_screen) + self._bind_key(u'Control-p', self.previous_history) + self._bind_key(u'Up', self.history_search_backward) + self._bind_key(u'Control-n', self.next_history) + self._bind_key(u'Down', self.history_search_forward) + self._bind_key(u'Control-a', self.beginning_of_line) + self._bind_key(u'Control-e', self.end_of_line) + self._bind_key(u'Alt-<', self.beginning_of_history) + self._bind_key(u'Alt->', self.end_of_history) + self._bind_key(u'Control-r', self.reverse_search_history) + self._bind_key(u'Control-s', self.forward_search_history) + self._bind_key(u'Alt-p', self.non_incremental_reverse_search_history) - self._bind_key('Alt-n', + self._bind_key(u'Alt-n', self.non_incremental_forward_search_history) - self._bind_key('Control-z', self.undo) - self._bind_key('Control-_', self.undo) - self._bind_key('Escape', self.kill_whole_line) - self._bind_key('Meta-d', self.kill_word) - self._bind_key('Control-Delete', self.forward_delete_word) - self._bind_key('Control-w', self.unix_word_rubout) + self._bind_key(u'Control-z', self.undo) + self._bind_key(u'Control-_', self.undo) + self._bind_key(u'Escape', self.kill_whole_line) + self._bind_key(u'Meta-d', self.kill_word) + self._bind_key(u'Control-Delete', self.forward_delete_word) + self._bind_key(u'Control-w', self.unix_word_rubout) #self._bind_key('Control-Shift-v', self.quoted_insert) - self._bind_key('Control-v', self.paste) - self._bind_key('Alt-v', self.ipython_paste) - self._bind_key('Control-y', self.yank) - self._bind_key('Control-k', self.kill_line) - self._bind_key('Control-m', self.set_mark) - self._bind_key('Control-q', self.copy_region_to_clipboard) + self._bind_key(u'Control-v', self.paste) + self._bind_key(u'Alt-v', self.ipython_paste) + self._bind_key(u'Control-y', self.yank) + self._bind_key(u'Control-k', self.kill_line) + self._bind_key(u'Control-m', self.set_mark) + self._bind_key(u'Control-q', self.copy_region_to_clipboard) # self._bind_key('Control-shift-k', self.kill_whole_line) - self._bind_key('Control-Shift-v', self.paste_mulitline_code) - self._bind_key("Control-Right", self.forward_word_end) - self._bind_key("Control-Left", self.backward_word) - self._bind_key("Shift-Right", + self._bind_key(u'Control-Shift-v', self.paste_mulitline_code) + self._bind_key(u"Control-Right", self.forward_word_end) + self._bind_key(u"Control-Left", self.backward_word) + self._bind_key(u"Shift-Right", self.forward_char_extend_selection) - self._bind_key("Shift-Left", + self._bind_key(u"Shift-Left", self.backward_char_extend_selection) - self._bind_key("Shift-Control-Right", + self._bind_key(u"Shift-Control-Right", self.forward_word_end_extend_selection) - self._bind_key("Shift-Control-Left", + self._bind_key(u"Shift-Control-Left", self.backward_word_extend_selection) - self._bind_key("Shift-Home", + self._bind_key(u"Shift-Home", self.beginning_of_line_extend_selection) - self._bind_key("Shift-End", + self._bind_key(u"Shift-End", self.end_of_line_extend_selection) - self._bind_key("numpad0", self.self_insert) - self._bind_key("numpad1", self.self_insert) - self._bind_key("numpad2", self.self_insert) - self._bind_key("numpad3", self.self_insert) - self._bind_key("numpad4", self.self_insert) - self._bind_key("numpad5", self.self_insert) - self._bind_key("numpad6", self.self_insert) - self._bind_key("numpad7", self.self_insert) - self._bind_key("numpad8", self.self_insert) - self._bind_key("numpad9", self.self_insert) - self._bind_key("add", self.self_insert) - self._bind_key("subtract", self.self_insert) - self._bind_key("multiply", self.self_insert) - self._bind_key("divide", self.self_insert) - self._bind_key("vk_decimal", self.self_insert) - log("RUNNING INIT EMACS") + self._bind_key(u"numpad0", self.self_insert) + self._bind_key(u"numpad1", self.self_insert) + self._bind_key(u"numpad2", self.self_insert) + self._bind_key(u"numpad3", self.self_insert) + self._bind_key(u"numpad4", self.self_insert) + self._bind_key(u"numpad5", self.self_insert) + self._bind_key(u"numpad6", self.self_insert) + self._bind_key(u"numpad7", self.self_insert) + self._bind_key(u"numpad8", self.self_insert) + self._bind_key(u"numpad9", self.self_insert) + self._bind_key(u"add", self.self_insert) + self._bind_key(u"subtract", self.self_insert) + self._bind_key(u"multiply", self.self_insert) + self._bind_key(u"divide", self.self_insert) + self._bind_key(u"vk_decimal", self.self_insert) + log(u"RUNNING INIT EMACS") for i in range(0, 10): - self._bind_key("alt-%d"%i, self.digit_argument) - self._bind_key("alt--", self.digit_argument) + self._bind_key(u"alt-%d"%i, self.digit_argument) + self._bind_key(u"alt--", self.digit_argument) # make it case insensitive def commonprefix(m): - "Given a list of pathnames, returns the longest common leading component" + u"Given a list of pathnames, returns the longest common leading component" if not m: return '' prefix = m[0] @@ -709,6 +709,6 @@ def commonprefix(m): if prefix[:i + 1].lower() != item[:i + 1].lower(): prefix = prefix[:i] if i == 0: - return '' + return u'' break return prefix diff --git a/pyreadline/modes/notemacs.py b/pyreadline/modes/notemacs.py index e425847..0e08e2a 100644 --- a/pyreadline/modes/notemacs.py +++ b/pyreadline/modes/notemacs.py @@ -11,15 +11,15 @@ import pyreadline.logger as logger from pyreadline.logger import log import pyreadline.lineeditor.lineobj as lineobj import pyreadline.lineeditor.history as history -from . import basemode +import basemode class NotEmacsMode(basemode.BaseMode): - mode="notemacs" + mode=u"notemacs" def __init__(self,rlobj): super(NotEmacsMode,self).__init__(rlobj) def __repr__(self): - return "" + return u"" def _readline_from_keyboard(self): c=self.console @@ -37,7 +37,7 @@ class NotEmacsMode(basemode.BaseMode): raise EOFError dispatch_func = self.key_dispatch.get(event.keyinfo,self.self_insert) - log("readline from keyboard:%s"%(event.keyinfo,)) + log(u"readline from keyboard:%s"%(event.keyinfo,)) r = None if dispatch_func: r = dispatch_func(event) @@ -49,7 +49,7 @@ class NotEmacsMode(basemode.BaseMode): break def readline(self, prompt=''): - '''Try to act like GNU readline.''' + u'''Try to act like GNU readline.''' # handle startup_hook if self.first_prompt: self.first_prompt = False @@ -57,7 +57,7 @@ class NotEmacsMode(basemode.BaseMode): try: self.startup_hook() except: - print('startup hook failed') + print u'startup hook failed' traceback.print_exc() c = self.console @@ -69,64 +69,64 @@ class NotEmacsMode(basemode.BaseMode): try: self.pre_input_hook() except: - print('pre_input_hook failed') + print u'pre_input_hook failed' traceback.print_exc() self.pre_input_hook = None - log("in readline: %s"%self.paste_line_buffer) + log(u"in readline: %s"%self.paste_line_buffer) if len(self.paste_line_buffer)>0: self.l_buffer=lineobj.ReadlineTextBuffer(self.paste_line_buffer[0]) self._update_line() self.paste_line_buffer=self.paste_line_buffer[1:] - c.write('\r\n') + c.write(u'\r\n') else: self._readline_from_keyboard() - c.write('\r\n') + c.write(u'\r\n') self.add_history(self.l_buffer.copy()) - log('returning(%s)' % self.l_buffer.get_line_text()) + log(u'returning(%s)' % self.l_buffer.get_line_text()) return self.l_buffer.get_line_text() + '\n' ### Methods below here are bindable emacs functions def beginning_of_line(self, e): # (C-a) - '''Move to the start of the current line. ''' + u'''Move to the start of the current line. ''' self.l_buffer.beginning_of_line() def end_of_line(self, e): # (C-e) - '''Move to the end of the line. ''' + u'''Move to the end of the line. ''' self.l_buffer.end_of_line() def forward_char(self, e): # (C-f) - '''Move forward a character. ''' + u'''Move forward a character. ''' self.l_buffer.forward_char() def backward_char(self, e): # (C-b) - '''Move back a character. ''' + u'''Move back a character. ''' self.l_buffer.backward_char() def forward_word(self, e): # (M-f) - '''Move forward to the end of the next word. Words are composed of + u'''Move forward to the end of the next word. Words are composed of letters and digits.''' self.l_buffer.forward_word() def backward_word(self, e): # (M-b) - '''Move back to the start of the current or previous word. Words are + u'''Move back to the start of the current or previous word. Words are composed of letters and digits.''' self.l_buffer.backward_word() def clear_screen(self, e): # (C-l) - '''Clear the screen and redraw the current line, leaving the current + u'''Clear the screen and redraw the current line, leaving the current line at the top of the screen.''' self.console.page() def redraw_current_line(self, e): # () - '''Refresh the current line. By default, this is unbound.''' + u'''Refresh the current line. By default, this is unbound.''' pass def accept_line(self, e): # (Newline or Return) - '''Accept the line regardless of where the cursor is. If this line + u'''Accept the line regardless of where the cursor is. If this line is non-empty, it may be added to the history list for future recall with add_history(). If this line is a modified history line, the history line is restored to its original state.''' @@ -134,47 +134,47 @@ class NotEmacsMode(basemode.BaseMode): ######### History commands def previous_history(self, e): # (C-p) - '''Move back through the history list, fetching the previous command. ''' + u'''Move back through the history list, fetching the previous command. ''' self._history.previous_history(self.l_buffer) def next_history(self, e): # (C-n) - '''Move forward through the history list, fetching the next command. ''' + u'''Move forward through the history list, fetching the next command. ''' self._history.next_history(self.l_buffer) def beginning_of_history(self, e): # (M-<) - '''Move to the first line in the history.''' + u'''Move to the first line in the history.''' self._history.beginning_of_history() def end_of_history(self, e): # (M->) - '''Move to the end of the input history, i.e., the line currently + u'''Move to the end of the input history, i.e., the line currently being entered.''' self._history.end_of_history(self.l_buffer) def _i_search(self, searchfun, direction, init_event): c = self.console line = self.get_line_buffer() - query = '' + query = u'' hc_start = self._history.history_cursor #+ direction while 1: x, y = self.prompt_end_pos c.pos(0, y) if direction < 0: - prompt = 'reverse-i-search' + prompt = u'reverse-i-search' else: - prompt = 'forward-i-search' + prompt = u'forward-i-search' - scroll = c.write_scrolling("%s`%s': %s" % (prompt, query, line)) + scroll = c.write_scrolling(u"%s`%s': %s" % (prompt, query, line)) self._update_prompt_pos(scroll) self._clear_after() event = c.getkeypress() - if event.keysym == 'BackSpace': + if event.keysym == u'BackSpace': if len(query) > 0: query = query[:-1] self._history.history_cursor = hc_start else: self._bell() - elif event.char in string.letters + string.digits + string.punctuation + ' ': + elif event.char in string.letters + string.digits + string.punctuation + u' ': self._history.history_cursor = hc_start query += event.char elif event.keyinfo == init_event.keyinfo: @@ -182,7 +182,7 @@ class NotEmacsMode(basemode.BaseMode): line=searchfun(query) pass else: - if event.keysym != 'Return': + if event.keysym != u'Return': self._bell() break line=searchfun(query) @@ -194,14 +194,14 @@ class NotEmacsMode(basemode.BaseMode): self._history.history_cursor=len(self._history.history) def reverse_search_history(self, e): # (C-r) - '''Search backward starting at the current line and moving up + u'''Search backward starting at the current line and moving up through the history as necessary. This is an incremental search.''' # print "HEJ" # self.console.bell() self._i_search(self._history.reverse_search_history, -1, e) def forward_search_history(self, e): # (C-s) - '''Search forward starting at the current line and moving down + u'''Search forward starting at the current line and moving down through the the history as necessary. This is an incremental search.''' # print "HEJ" # self.console.bell() @@ -209,31 +209,31 @@ class NotEmacsMode(basemode.BaseMode): def non_incremental_reverse_search_history(self, e): # (M-p) - '''Search backward starting at the current line and moving up + u'''Search backward starting at the current line and moving up through the history as necessary using a non-incremental search for a string supplied by the user.''' self._history.non_incremental_reverse_search_history(self.l_buffer) def non_incremental_forward_search_history(self, e): # (M-n) - '''Search forward starting at the current line and moving down + u'''Search forward starting at the current line and moving down through the the history as necessary using a non-incremental search for a string supplied by the user.''' self._history.non_incremental_reverse_search_history(self.l_buffer) def history_search_forward(self, e): # () - '''Search forward through the history for the string of characters + u'''Search forward through the history for the string of characters between the start of the current line and the point. This is a non-incremental search. By default, this command is unbound.''' self.l_buffer=self._history.history_search_forward(self.l_buffer) def history_search_backward(self, e): # () - '''Search backward through the history for the string of characters + u'''Search backward through the history for the string of characters between the start of the current line and the point. This is a non-incremental search. By default, this command is unbound.''' self.l_buffer=self._history.history_search_backward(self.l_buffer) def yank_nth_arg(self, e): # (M-C-y) - '''Insert the first argument to the previous command (usually the + u'''Insert the first argument to the previous command (usually the second word on the previous line) at point. With an argument n, insert the nth word from the previous command (the words in the previous command begin with word 0). A negative argument inserts the @@ -241,76 +241,76 @@ class NotEmacsMode(basemode.BaseMode): pass def yank_last_arg(self, e): # (M-. or M-_) - '''Insert last argument to the previous command (the last word of + u'''Insert last argument to the previous command (the last word of the previous history entry). With an argument, behave exactly like yank-nth-arg. Successive calls to yank-last-arg move back through the history list, inserting the last argument of each line in turn.''' pass def delete_char(self, e): # (C-d) - '''Delete the character at point. If point is at the beginning of + u'''Delete the character at point. If point is at the beginning of the line, there are no characters in the line, and the last character typed was not bound to delete-char, then return EOF.''' self.l_buffer.delete_char() def backward_delete_char(self, e): # (Rubout) - '''Delete the character behind the cursor. A numeric argument means + u'''Delete the character behind the cursor. A numeric argument means to kill the characters instead of deleting them.''' self.l_buffer.backward_delete_char() def forward_backward_delete_char(self, e): # () - '''Delete the character under the cursor, unless the cursor is at + u'''Delete the character under the cursor, unless the cursor is at the end of the line, in which case the character behind the cursor is deleted. By default, this is not bound to a key.''' pass def quoted_insert(self, e): # (C-q or C-v) - '''Add the next character typed to the line verbatim. This is how to + u'''Add the next character typed to the line verbatim. This is how to insert key sequences like C-q, for example.''' e = self.console.getkeypress() self.insert_text(e.char) def tab_insert(self, e): # (M-TAB) - '''Insert a tab character. ''' + u'''Insert a tab character. ''' cursor = min(self.l_buffer.point, len(self.l_buffer.line_buffer)) ws = ' ' * (self.tabstop - (cursor % self.tabstop)) self.insert_text(ws) def self_insert(self, e): # (a, b, A, 1, !, ...) - '''Insert yourself. ''' + u'''Insert yourself. ''' if ord(e.char)!=0: #don't insert null character in buffer, can happen with dead keys. self.insert_text(e.char) def transpose_chars(self, e): # (C-t) - '''Drag the character before the cursor forward over the character + u'''Drag the character before the cursor forward over the character at the cursor, moving the cursor forward as well. If the insertion point is at the end of the line, then this transposes the last two characters of the line. Negative arguments have no effect.''' self.l_buffer.transpose_chars() def transpose_words(self, e): # (M-t) - '''Drag the word before point past the word after point, moving + u'''Drag the word before point past the word after point, moving point past that word as well. If the insertion point is at the end of the line, this transposes the last two words on the line.''' self.l_buffer.transpose_words() def upcase_word(self, e): # (M-u) - '''Uppercase the current (or following) word. With a negative + u'''Uppercase the current (or following) word. With a negative argument, uppercase the previous word, but do not move the cursor.''' self.l_buffer.upcase_word() def downcase_word(self, e): # (M-l) - '''Lowercase the current (or following) word. With a negative + u'''Lowercase the current (or following) word. With a negative argument, lowercase the previous word, but do not move the cursor.''' self.l_buffer.downcase_word() def capitalize_word(self, e): # (M-c) - '''Capitalize the current (or following) word. With a negative + u'''Capitalize the current (or following) word. With a negative argument, capitalize the previous word, but do not move the cursor.''' self.l_buffer.capitalize_word() def overwrite_mode(self, e): # () - '''Toggle overwrite mode. With an explicit positive numeric + u'''Toggle overwrite mode. With an explicit positive numeric argument, switches to overwrite mode. With an explicit non-positive numeric argument, switches to insert mode. This command affects only emacs mode; vi mode does overwrite differently. Each call to @@ -321,54 +321,54 @@ class NotEmacsMode(basemode.BaseMode): pass def kill_line(self, e): # (C-k) - '''Kill the text from point to the end of the line. ''' + u'''Kill the text from point to the end of the line. ''' self.l_buffer.kill_line() def backward_kill_line(self, e): # (C-x Rubout) - '''Kill backward to the beginning of the line. ''' + u'''Kill backward to the beginning of the line. ''' self.l_buffer.backward_kill_line() def unix_line_discard(self, e): # (C-u) - '''Kill backward from the cursor to the beginning of the current line. ''' + u'''Kill backward from the cursor to the beginning of the current line. ''' # how is this different from backward_kill_line? self.l_buffer.unix_line_discard() def kill_whole_line(self, e): # () - '''Kill all characters on the current line, no matter where point + u'''Kill all characters on the current line, no matter where point is. By default, this is unbound.''' self.l_buffer.kill_whole_line() def kill_word(self, e): # (M-d) - '''Kill from point to the end of the current word, or if between + u'''Kill from point to the end of the current word, or if between words, to the end of the next word. Word boundaries are the same as forward-word.''' self.l_buffer.kill_word() def backward_kill_word(self, e): # (M-DEL) - '''Kill the word behind point. Word boundaries are the same as + u'''Kill the word behind point. Word boundaries are the same as backward-word. ''' self.l_buffer.backward_kill_word() def unix_word_rubout(self, e): # (C-w) - '''Kill the word behind point, using white space as a word + u'''Kill the word behind point, using white space as a word boundary. The killed text is saved on the kill-ring.''' self.l_buffer.unix_word_rubout() def delete_horizontal_space(self, e): # () - '''Delete all spaces and tabs around point. By default, this is unbound. ''' + u'''Delete all spaces and tabs around point. By default, this is unbound. ''' pass def kill_region(self, e): # () - '''Kill the text in the current region. By default, this command is unbound. ''' + u'''Kill the text in the current region. By default, this command is unbound. ''' pass def copy_region_as_kill(self, e): # () - '''Copy the text in the region to the kill buffer, so it can be + u'''Copy the text in the region to the kill buffer, so it can be yanked right away. By default, this command is unbound.''' pass def copy_region_to_clipboard(self, e): # () - '''Copy the text in the region to the windows clipboard.''' + u'''Copy the text in the region to the windows clipboard.''' if self.enable_win32_clipboard: mark=min(self.l_buffer.mark,len(self.l_buffer.line_buffer)) cursor=min(self.l_buffer.point,len(self.l_buffer.line_buffer)) @@ -376,72 +376,72 @@ class NotEmacsMode(basemode.BaseMode): return begin=min(cursor,mark) end=max(cursor,mark) - toclipboard="".join(self.l_buffer.line_buffer[begin:end]) + toclipboard=u"".join(self.l_buffer.line_buffer[begin:end]) clipboard.SetClipboardText(str(toclipboard)) def copy_backward_word(self, e): # () - '''Copy the word before point to the kill buffer. The word + u'''Copy the word before point to the kill buffer. The word boundaries are the same as backward-word. By default, this command is unbound.''' pass def copy_forward_word(self, e): # () - '''Copy the word following point to the kill buffer. The word + u'''Copy the word following point to the kill buffer. The word boundaries are the same as forward-word. By default, this command is unbound.''' pass def paste(self,e): - '''Paste windows clipboard''' + u'''Paste windows clipboard''' if self.enable_win32_clipboard: txt=clipboard.get_clipboard_text_and_convert(False) self.insert_text(txt) def paste_mulitline_code(self,e): - '''Paste windows clipboard''' - reg=re.compile("\r?\n") + u'''Paste windows clipboard''' + reg=re.compile(u"\r?\n") if self.enable_win32_clipboard: txt=clipboard.get_clipboard_text_and_convert(False) t=reg.split(txt) - t=[row for row in t if row.strip()!=""] #remove empty lines - if t!=[""]: + t=[row for row in t if row.strip()!=u""] #remove empty lines + if t!=[u""]: self.insert_text(t[0]) self.add_history(self.l_buffer.copy()) self.paste_line_buffer=t[1:] - log("multi: %s"%self.paste_line_buffer) + log(u"multi: %s"%self.paste_line_buffer) return True else: return False def ipython_paste(self,e): - '''Paste windows clipboard. If enable_ipython_paste_list_of_lists is + u'''Paste windows clipboard. If enable_ipython_paste_list_of_lists is True then try to convert tabseparated data to repr of list of lists or repr of array''' if self.enable_win32_clipboard: txt=clipboard.get_clipboard_text_and_convert( self.enable_ipython_paste_list_of_lists) if self.enable_ipython_paste_for_paths: - if len(txt)<300 and ("\t" not in txt) and ("\n" not in txt): - txt=txt.replace("\\", "/").replace(" ", r"\ ") + if len(txt)<300 and (u"\t" not in txt) and (u"\n" not in txt): + txt=txt.replace(u"\\", u"/").replace(u" ", ur"\ ") self.insert_text(txt) def yank(self, e): # (C-y) - '''Yank the top of the kill ring into the buffer at point. ''' + u'''Yank the top of the kill ring into the buffer at point. ''' pass def yank_pop(self, e): # (M-y) - '''Rotate the kill-ring, and yank the new top. You can only do this + u'''Rotate the kill-ring, and yank the new top. You can only do this if the prior command is yank or yank-pop.''' pass def digit_argument(self, e): # (M-0, M-1, ... M--) - '''Add this digit to the argument already accumulating, or start a + u'''Add this digit to the argument already accumulating, or start a new argument. M-- starts a negative argument.''' pass def universal_argument(self, e): # () - '''This is another way to specify an argument. If this command is + u'''This is another way to specify an argument. If this command is followed by one or more digits, optionally with a leading minus sign, those digits define the argument. If the command is followed by digits, executing universal-argument again ends the numeric @@ -455,83 +455,83 @@ class NotEmacsMode(basemode.BaseMode): pass def delete_char_or_list(self, e): # () - '''Deletes the character under the cursor if not at the beginning or + u'''Deletes the character under the cursor if not at the beginning or end of the line (like delete-char). If at the end of the line, behaves identically to possible-completions. This command is unbound by default.''' pass def start_kbd_macro(self, e): # (C-x () - '''Begin saving the characters typed into the current keyboard macro. ''' + u'''Begin saving the characters typed into the current keyboard macro. ''' pass def end_kbd_macro(self, e): # (C-x )) - '''Stop saving the characters typed into the current keyboard macro + u'''Stop saving the characters typed into the current keyboard macro and save the definition.''' pass def call_last_kbd_macro(self, e): # (C-x e) - '''Re-execute the last keyboard macro defined, by making the + u'''Re-execute the last keyboard macro defined, by making the characters in the macro appear as if typed at the keyboard.''' pass def re_read_init_file(self, e): # (C-x C-r) - '''Read in the contents of the inputrc file, and incorporate any + u'''Read in the contents of the inputrc file, and incorporate any bindings or variable assignments found there.''' pass def abort(self, e): # (C-g) - '''Abort the current editing command and ring the terminals bell + u'''Abort the current editing command and ring the terminals bell (subject to the setting of bell-style).''' self._bell() def do_uppercase_version(self, e): # (M-a, M-b, M-x, ...) - '''If the metafied character x is lowercase, run the command that is + u'''If the metafied character x is lowercase, run the command that is bound to the corresponding uppercase character.''' pass def prefix_meta(self, e): # (ESC) - '''Metafy the next character typed. This is for keyboards without a + u'''Metafy the next character typed. This is for keyboards without a meta key. Typing ESC f is equivalent to typing M-f. ''' self.next_meta = True def undo(self, e): # (C-_ or C-x C-u) - '''Incremental undo, separately remembered for each line.''' + u'''Incremental undo, separately remembered for each line.''' self.l_buffer.pop_undo() def revert_line(self, e): # (M-r) - '''Undo all changes made to this line. This is like executing the + u'''Undo all changes made to this line. This is like executing the undo command enough times to get back to the beginning.''' pass def tilde_expand(self, e): # (M-~) - '''Perform tilde expansion on the current word.''' + u'''Perform tilde expansion on the current word.''' pass def set_mark(self, e): # (C-@) - '''Set the mark to the point. If a numeric argument is supplied, the + u'''Set the mark to the point. If a numeric argument is supplied, the mark is set to that position.''' self.l_buffer.set_mark() def exchange_point_and_mark(self, e): # (C-x C-x) - '''Swap the point with the mark. The current cursor position is set + u'''Swap the point with the mark. The current cursor position is set to the saved position, and the old cursor position is saved as the mark.''' pass def character_search(self, e): # (C-]) - '''A character is read and point is moved to the next occurrence of + u'''A character is read and point is moved to the next occurrence of that character. A negative count searches for previous occurrences.''' pass def character_search_backward(self, e): # (M-C-]) - '''A character is read and point is moved to the previous occurrence + u'''A character is read and point is moved to the previous occurrence of that character. A negative count searches for subsequent occurrences.''' pass def insert_comment(self, e): # (M-#) - '''Without a numeric argument, the value of the comment-begin + u'''Without a numeric argument, the value of the comment-begin variable is inserted at the beginning of the current line. If a numeric argument is supplied, this command acts as a toggle: if the characters at the beginning of the line do not match the value of @@ -541,21 +541,21 @@ class NotEmacsMode(basemode.BaseMode): pass def dump_functions(self, e): # () - '''Print all of the functions and their key bindings to the Readline + u'''Print all of the functions and their key bindings to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.''' pass def dump_variables(self, e): # () - '''Print all of the settable variables and their values to the + u'''Print all of the settable variables and their values to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.''' pass def dump_macros(self, e): # () - '''Print all of the Readline key sequences bound to macros and the + u'''Print all of the Readline key sequences bound to macros and the strings they output. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.''' @@ -565,38 +565,38 @@ class NotEmacsMode(basemode.BaseMode): #Create key bindings: def init_editing_mode(self, e): # (C-e) - '''When in vi command mode, this causes a switch to emacs editing + u'''When in vi command mode, this causes a switch to emacs editing mode.''' - self._bind_exit_key('Control-d') - self._bind_exit_key('Control-z') + self._bind_exit_key(u'Control-d') + self._bind_exit_key(u'Control-z') # I often accidentally hold the shift or control while typing space - self._bind_key('Shift-space', self.self_insert) - self._bind_key('Control-space', self.self_insert) - self._bind_key('Return', self.accept_line) - self._bind_key('Left', self.backward_char) - self._bind_key('Control-b', self.backward_char) - self._bind_key('Right', self.forward_char) - self._bind_key('Control-f', self.forward_char) - self._bind_key('BackSpace', self.backward_delete_char) - self._bind_key('Home', self.beginning_of_line) - self._bind_key('End', self.end_of_line) - self._bind_key('Delete', self.delete_char) - self._bind_key('Control-d', self.delete_char) - self._bind_key('Clear', self.clear_screen) + self._bind_key(u'Shift-space', self.self_insert) + self._bind_key(u'Control-space', self.self_insert) + self._bind_key(u'Return', self.accept_line) + self._bind_key(u'Left', self.backward_char) + self._bind_key(u'Control-b', self.backward_char) + self._bind_key(u'Right', self.forward_char) + self._bind_key(u'Control-f', self.forward_char) + self._bind_key(u'BackSpace', self.backward_delete_char) + self._bind_key(u'Home', self.beginning_of_line) + self._bind_key(u'End', self.end_of_line) + self._bind_key(u'Delete', self.delete_char) + self._bind_key(u'Control-d', self.delete_char) + self._bind_key(u'Clear', self.clear_screen) # make it case insensitive def commonprefix(m): - "Given a list of pathnames, returns the longest common leading component" - if not m: return '' + u"Given a list of pathnames, returns the longest common leading component" + if not m: return u'' prefix = m[0] for item in m: for i in range(len(prefix)): if prefix[:i+1].lower() != item[:i+1].lower(): prefix = prefix[:i] - if i == 0: return '' + if i == 0: return u'' break return prefix diff --git a/pyreadline/modes/vi.py b/pyreadline/modes/vi.py index bfac168..b228727 100644 --- a/pyreadline/modes/vi.py +++ b/pyreadline/modes/vi.py @@ -1,1174 +1,1174 @@ -# -*- coding: utf-8 -*- -#***************************************************************************** -# Copyright (C) 2003-2006 Gary Bishop. -# Copyright (C) 2006 Michael Graz. -# Copyright (C) 2006 Jorgen Stenarson. -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** -import os -import pyreadline.logger as logger -from pyreadline.logger import log -import pyreadline.lineeditor.lineobj as lineobj -import pyreadline.lineeditor.history as history -from . import basemode - -class ViMode(basemode.BaseMode): - mode="vi" - def __init__(self,rlobj): - super(ViMode,self).__init__(rlobj) - self.__vi_insert_mode = None - - def __repr__(self): - return "" - - def process_keyevent(self, keyinfo): - def nop(e): - pass - keytuple=keyinfo.tuple() - - #Process exit keys. Only exit on empty line - if keytuple in self.exit_dispatch: - if lineobj.EndOfLine(self.l_buffer) == 0: - raise EOFError - - dispatch_func = self.key_dispatch.get(keytuple,self.vi_key) - log("readline from keyboard:%s->%s"%(keytuple,dispatch_func)) - r = None - if dispatch_func: - r = dispatch_func(keyinfo) - self.l_buffer.push_undo() - - self.previous_func = dispatch_func - if r: - self._update_line() - return True - return False - - ### Methods below here are bindable emacs functions - - def init_editing_mode(self, e): # (M-C-j) - '''Initialize vi editingmode''' - self.show_all_if_ambiguous = 'on' - self.key_dispatch = {} - self.__vi_insert_mode = None - self._vi_command = None - self._vi_command_edit = None - self._vi_key_find_char = None - self._vi_key_find_direction = True - self._vi_yank_buffer = None - self._vi_multiplier1 = '' - self._vi_multiplier2 = '' - self._vi_undo_stack = [] - self._vi_undo_cursor = -1 - self._vi_current = None - self._vi_search_text = '' - self.vi_save_line () - self.vi_set_insert_mode (True) - # make ' ' to ~ self insert - for c in range(ord(' '), 127): - self._bind_key('%s' % chr(c), self.vi_key) - self._bind_key('BackSpace', self.vi_backspace) - self._bind_key('Escape', self.vi_escape) - self._bind_key('Return', self.vi_accept_line) - - self._bind_key('Left', self.backward_char) - self._bind_key('Right', self.forward_char) - self._bind_key('Home', self.beginning_of_line) - self._bind_key('End', self.end_of_line) - self._bind_key('Delete', self.delete_char) - - self._bind_key('Control-d', self.vi_eof) - self._bind_key('Control-z', self.vi_eof) - self._bind_key('Control-r', self.vi_redo) - self._bind_key('Up', self.vi_arrow_up) - self._bind_key('Control-p', self.vi_up) - self._bind_key('Down', self.vi_arrow_down) - self._bind_key('Control-n', self.vi_down) - self._bind_key('Tab', self.vi_complete) -# self._bind_key('Control-e', self.emacs) - - def vi_key (self, e): - if not self._vi_command: - self._vi_command = ViCommand (self) - elif self._vi_command.is_end: - if self._vi_command.is_edit: - self._vi_command_edit = self._vi_command - self._vi_command = ViCommand (self) - self._vi_command.add_char (e.char) - - def vi_error (self): - self._bell () - - def vi_get_is_insert_mode (self): - return self.__vi_insert_mode - vi_is_insert_mode = property (vi_get_is_insert_mode) - - def vi_escape (self, e): - if self.vi_is_insert_mode: - if self._vi_command: - self._vi_command.add_char (e.char) - else: - self._vi_command = ViCommand (self) - self.vi_set_insert_mode (False) - self.l_buffer.point=lineobj.PrevChar - elif self._vi_command and self._vi_command.is_replace_one: - self._vi_command.add_char (e.char) - else: - self.vi_error () - - def vi_backspace (self, e): - if self._vi_command: - self._vi_command.add_char (e.char) - else: - self._vi_do_backspace (self._vi_command) - - def _vi_do_backspace (self, vi_cmd): - if self.vi_is_insert_mode or (self._vi_command and self._vi_command.is_search): - if self.l_buffer.point > 0: - self.l_buffer.point -= 1 - if self.l_buffer.overwrite: - try: - prev = self._vi_undo_stack [self._vi_undo_cursor][1][self.l_buffer.point ] - self.l_buffer.line_buffer [self.l_buffer.point] = prev - except IndexError: - del self.l_buffer.line_buffer [self.l_buffer.point ] - else: - self.vi_save_line () - del self.l_buffer.line_buffer [self.l_buffer.point ] - - def vi_accept_line (self, e): - if self._vi_command and self._vi_command.is_search: - self._vi_command.do_search () - return False - self._vi_command = None - self.vi_set_insert_mode (True) - self._vi_undo_stack = [] - self._vi_undo_cursor = -1 - self._vi_current = None - return self.accept_line (e) - - def vi_eof (self, e): - raise EOFError - - def vi_set_insert_mode (self, value): - if self.__vi_insert_mode == value: - return - self.__vi_insert_mode = value - if value: - self.vi_save_line () - self.cursor_size=25 - else: - self.cursor_size=100 - - def vi_undo_restart (self): - tpl_undo = (self.l_buffer.point, self.l_buffer.line_buffer[:], ) - self._vi_undo_stack = [tpl_undo] - self._vi_undo_cursor = 0 - - def vi_save_line (self): - if self._vi_undo_stack and self._vi_undo_cursor >= 0: - del self._vi_undo_stack [self._vi_undo_cursor + 1 : ] - # tpl_undo = (self.l_buffer.point, self.l_buffer[:], ) - tpl_undo = (self.l_buffer.point, self.l_buffer.line_buffer[:], ) - if not self._vi_undo_stack or self._vi_undo_stack[self._vi_undo_cursor][1] != tpl_undo[1]: - self._vi_undo_stack.append (tpl_undo) - self._vi_undo_cursor += 1 - - def vi_undo_prepare (self): - if self._vi_undo_cursor == len(self._vi_undo_stack)-1: - self.vi_save_line () - - def vi_undo (self, do_pop=True): - self.vi_undo_prepare () - if not self._vi_undo_stack or self._vi_undo_cursor <= 0: - self.vi_error () - return - self._vi_undo_cursor -= 1 - self.vi_undo_assign () - - def vi_undo_all (self): - self.vi_undo_prepare () - if self._vi_undo_cursor > 0: - self._vi_undo_cursor = 0 - self.vi_undo_assign () - else: - self.vi_error () - - def vi_undo_assign (self): - tpl_undo = self._vi_undo_stack [self._vi_undo_cursor] - self.l_buffer.line_buffer = tpl_undo [1][:] - self.l_buffer.point = tpl_undo [0] - - def vi_redo (self, e): - if self._vi_undo_cursor >= len(self._vi_undo_stack)-1: - self.vi_error () - return - self._vi_undo_cursor += 1 - self.vi_undo_assign () - - def vi_search (self, rng): - for i in rng: - line_history = self._history.history [i] - pos = line_history.get_line_text().find (self._vi_search_text) - if pos >= 0: - self._history.history_cursor = i - self.l_buffer.line_buffer = list (line_history.line_buffer) - self.l_buffer.point = pos - self.vi_undo_restart () - return True - self._bell () - return False - - def vi_search_first (self): - text = ''.join (self.l_buffer.line_buffer [1:]) - if text: - self._vi_search_text = text - position = len (self._history.history) - 1 - elif self._vi_search_text: - position = self._history.history_cursor - 1 - else: - self.vi_error () - self.vi_undo () - return - if not self.vi_search (list(range(position, -1, -1))): - # Here: search text not found - self.vi_undo () - - def vi_search_again_backward (self): - self.vi_search (list(range(self._history.history_cursor-1, -1, -1))) - - def vi_search_again_forward (self): - self.vi_search (list(range(self._history.history_cursor+1, len(self._history.history)))) - - def vi_up (self, e): - if self._history.history_cursor == len(self._history.history): - self._vi_current = self.l_buffer.line_buffer [:] - # self._history.previous_history (e) - self._history.previous_history (self.l_buffer) - if self.vi_is_insert_mode: - self.end_of_line (e) - else: - self.beginning_of_line (e) - self.vi_undo_restart () - - def vi_down (self, e): - if self._history.history_cursor >= len(self._history.history): - self.vi_error () - return - if self._history.history_cursor < len(self._history.history) - 1: - # self._history.next_history (e) - self._history.next_history (self.l_buffer) - if self.vi_is_insert_mode: - self.end_of_line (e) - else: - self.beginning_of_line (e) - self.vi_undo_restart () - elif self._vi_current is not None: - self._history.history_cursor = len(self._history.history) - self.l_buffer.line_buffer = self._vi_current - self.end_of_line (e) - if not self.vi_is_insert_mode and self.l_buffer.point > 0: - self.l_buffer.point -= 1 - self._vi_current = None - else: - self.vi_error () - return - - def vi_arrow_up (self, e): - self.vi_set_insert_mode (True) - self.vi_up (e) - self.vi_save_line () - - def vi_arrow_down (self, e): - self.vi_set_insert_mode (True) - self.vi_down (e) - self.vi_save_line () - - def vi_complete (self, e): - text = self.l_buffer.get_line_text () - if text and not text.isspace (): - return self.complete (e) - else: - return self.vi_key (e) - -# vi input states -# sequence of possible states are in the order below -_VI_BEGIN = 'vi_begin' -_VI_MULTI1 = 'vi_multi1' -_VI_ACTION = 'vi_action' -_VI_MULTI2 = 'vi_multi2' -_VI_MOTION = 'vi_motion' -_VI_MOTION_ARGUMENT = 'vi_motion_argument' -_VI_REPLACE_ONE = 'vi_replace_one' -_VI_TEXT = 'vi_text' -_VI_SEARCH = 'vi_search' -_VI_END = 'vi_end' - -# vi helper class -class ViCommand: - def __init__ (self, readline): - self.readline = readline - self.lst_char = [] - self.state = _VI_BEGIN - self.action = self.movement - self.motion = None - self.motion_argument = None - self.text = None - self.pos_motion = None - self.is_edit = False - self.is_overwrite = False - self.is_error = False - self.is_star = False - self.delete_left = 0 - self.delete_right = 0 - self.readline._vi_multiplier1 = '' - self.readline._vi_multiplier2 = '' - self.set_override_multiplier (0) - self.skip_multipler = False - self.tabstop = 4 - self.dct_fcn = { - ord('$') : self.key_dollar, - ord('^') : self.key_hat, - ord(';') : self.key_semicolon, - ord(',') : self.key_comma, - ord('%') : self.key_percent, - ord('.') : self.key_dot, - ord('/') : self.key_slash, - ord('*') : self.key_star, - ord('|') : self.key_bar, - ord('~') : self.key_tilde, - 8 : self.key_backspace, - } - - def add_char (self, char): - self.lst_char.append (char) - if self.state == _VI_BEGIN and self.readline.vi_is_insert_mode: - self.readline.vi_save_line () - self.state = _VI_TEXT - if self.state == _VI_SEARCH: - if char == '\x08': # backspace - self.key_backspace (char) - else: - self.set_text (char) - return - if self.state == _VI_TEXT: - if char == '\x1b': # escape - self.escape (char) - elif char == '\x09': # tab - ts = self.tabstop - ws = ' ' * (ts - (self.readline.l_buffer.point%ts)) - self.set_text (ws) - elif char == '\x08': # backspace - self.key_backspace (char) - else: - self.set_text (char) - return - if self.state == _VI_MOTION_ARGUMENT: - self.set_motion_argument (char) - return - if self.state == _VI_REPLACE_ONE: - self.replace_one (char) - return - try: - fcn_instance = self.dct_fcn [ord(char)] - except: - fcn_instance = getattr (self, 'key_%s' % char, None) - if fcn_instance: - fcn_instance (char) - return - if char.isdigit (): - self.key_digit (char) - return - # Here: could not process key - self.error () - - def set_text (self, text): - if self.text is None: - self.text = text - else: - self.text += text - self.set_buffer (text) - - def set_buffer (self, text): - for char in text: - if not self.char_isprint (char): - continue -# self.readline.l_buffer.insert_text(char) -# continue -# #overwrite in l_buffer obj - if self.is_overwrite: - if self.readline.l_buffer.point < len (self.readline.l_buffer.line_buffer): - # self.readline.l_buffer[self.l_buffer.point]=char - self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] = char - else: - # self.readline.l_buffer.insert_text(char) - self.readline.l_buffer.line_buffer.append (char) - else: - # self.readline.l_buffer.insert_text(char) - self.readline.l_buffer.line_buffer.insert (self.readline.l_buffer.point, char) - self.readline.l_buffer.point += 1 - - def replace_one (self, char): - if char == '\x1b': # escape - self.end () - return - self.is_edit = True - self.readline.vi_save_line () - times = self.get_multiplier () - cursor = self.readline.l_buffer.point - self.readline.l_buffer.line_buffer [cursor : cursor + times] = char * times - if times > 1: - self.readline.l_buffer.point += (times - 1) - self.end () - - def char_isprint (self, char): - return ord(char) >= ord(' ') and ord(char) <= ord('~') - - def key_dollar (self, char): - self.motion = self.motion_end_in_line - self.delete_right = 1 - self.state = _VI_MOTION - self.apply () - - def key_hat (self, char): - self.motion = self.motion_beginning_of_line - self.state = _VI_MOTION - self.apply () - - def key_0 (self, char): - if self.state in [_VI_BEGIN, _VI_ACTION]: - self.key_hat (char) - else: - self.key_digit (char) - - def key_digit (self, char): - if self.state in [_VI_BEGIN, _VI_MULTI1]: - self.readline._vi_multiplier1 += char - self.readline._vi_multiplier2 = '' - self.state = _VI_MULTI1 - elif self.state in [_VI_ACTION, _VI_MULTI2]: - self.readline._vi_multiplier2 += char - self.state = _VI_MULTI2 - - def key_w (self, char): - if self.action == self.change: - self.key_e (char) - return - self.motion = self.motion_word_short - self.state = _VI_MOTION - self.apply () - - def key_W (self, char): - if self.action == self.change: - self.key_E (char) - return - self.motion = self.motion_word_long - self.state = _VI_MOTION - self.apply () - - def key_e (self, char): - self.motion = self.motion_end_short - self.state = _VI_MOTION - self.delete_right = 1 - self.apply () - - def key_E (self, char): - self.motion = self.motion_end_long - self.state = _VI_MOTION - self.delete_right = 1 - self.apply () - - def key_b (self, char): - self.motion = self.motion_back_short - self.state = _VI_MOTION - self.apply () - - def key_B (self, char): - self.motion = self.motion_back_long - self.state = _VI_MOTION - self.apply () - - def key_f (self, char): - self.readline._vi_key_find_direction = True - self.motion = self.motion_find_char_forward - self.delete_right = 1 - self.state = _VI_MOTION_ARGUMENT - - def key_F (self, char): - self.readline._vi_key_find_direction = False - self.motion = self.motion_find_char_backward - self.delete_left = 1 - self.state = _VI_MOTION_ARGUMENT - - def key_t (self, char): - self.motion = self.motion_to_char_forward - self.delete_right = 1 - self.state = _VI_MOTION_ARGUMENT - - def key_T (self, char): - self.motion = self.motion_to_char_backward - self.state = _VI_MOTION_ARGUMENT - - def key_j (self, char): - self.readline.vi_down (ViEvent (char)) - self.state = _VI_END - - def key_k (self, char): - self.readline.vi_up (ViEvent (char)) - self.state = _VI_END - - def key_semicolon (self, char): - if self.readline._vi_key_find_char is None: - self.error () - return - if self.readline._vi_key_find_direction: - self.motion = self.motion_find_char_forward - else: - self.motion = self.motion_find_char_backward - self.set_motion_argument (self.readline._vi_key_find_char) - - def key_comma (self, char): - if self.readline._vi_key_find_char is None: - self.error () - return - if self.readline._vi_key_find_direction: - self.motion = self.motion_find_char_backward - else: - self.motion = self.motion_find_char_forward - self.set_motion_argument (self.readline._vi_key_find_char) - - def key_percent (self, char): - '''find matching <([{}])>''' - self.motion = self.motion_matching - self.delete_right = 1 - self.state = _VI_MOTION - self.apply () - - def key_dot (self, char): - vi_cmd_edit = self.readline._vi_command_edit - if not vi_cmd_edit: - return - if vi_cmd_edit.is_star: - self.key_star (char) - return - if self.has_multiplier (): - count = self.get_multiplier () - else: - count = 0 - # Create the ViCommand object after getting multipler from self - # Side effect of the ViCommand creation is resetting of global multipliers - vi_cmd = ViCommand (self.readline) - if count >= 1: - vi_cmd.set_override_multiplier (count) - vi_cmd_edit.set_override_multiplier (count) - elif vi_cmd_edit.override_multiplier: - vi_cmd.set_override_multiplier (vi_cmd_edit.override_multiplier) - for char in vi_cmd_edit.lst_char: - vi_cmd.add_char (char) - if vi_cmd_edit.is_overwrite and self.readline.l_buffer.point > 0: - self.readline.l_buffer.point -= 1 - self.readline.vi_set_insert_mode (False) - self.end () - - def key_slash (self, char): - self.readline.vi_save_line () - self.readline.l_buffer.line_buffer=['/'] - self.readline.l_buffer.point= 1 - self.state = _VI_SEARCH - - def key_star (self, char): - self.is_star = True - self.is_edit = True - self.readline.vi_save_line () - completions = self.readline._get_completions() - if completions: - text = ' '.join (completions) + ' ' - self.readline.l_buffer.line_buffer [self.readline.begidx : self.readline.endidx + 1] = list (text) - prefix_len = self.readline.endidx - self.readline.begidx - self.readline.l_buffer.point += len(text) - prefix_len - self.readline.vi_set_insert_mode (True) - else: - self.error () - self.state = _VI_TEXT - - def key_bar (self, char): - self.motion = self.motion_column - self.state = _VI_MOTION - self.apply () - - def key_tilde (self, char): - self.is_edit = True - self.readline.vi_save_line () - for i in range (self.get_multiplier()): - try: - c = self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] - if c.isupper (): - self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] = c.lower() - elif c.islower (): - self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] = c.upper() - self.readline.l_buffer.point += 1 - except IndexError: - break - self.end () - - def key_h (self, char): - self.motion = self.motion_left - self.state = _VI_MOTION - self.apply () - - def key_backspace (self, char): - if self.state in [_VI_TEXT, _VI_SEARCH]: - if self.text and len(self.text): - self.text = self.text [:-1] - try: - # Remove backspaces for potential dot command - self.lst_char.pop () - self.lst_char.pop () - except IndexError: - pass - else: - self.key_h (char) - self.readline._vi_do_backspace (self) - if self.state == _VI_SEARCH and not (self.readline.l_buffer.line_buffer): - self.state = _VI_BEGIN - - def key_l (self, char): - self.motion = self.motion_right - self.state = _VI_MOTION - self.apply () - - def key_i (self, char): - self.is_edit = True - self.state = _VI_TEXT - self.readline.vi_set_insert_mode (True) - - def key_I (self, char): - self.is_edit = True - self.state = _VI_TEXT - self.readline.vi_set_insert_mode (True) - self.readline.l_buffer.point = 0 - - def key_a (self, char): - self.is_edit = True - self.state = _VI_TEXT - self.readline.vi_set_insert_mode (True) - if len (self.readline.l_buffer.line_buffer): - self.readline.l_buffer.point += 1 - - def key_A (self, char): - self.is_edit = True - self.state = _VI_TEXT - self.readline.vi_set_insert_mode (True) - self.readline.l_buffer.point = len (self.readline.l_buffer.line_buffer) - - def key_d (self, char): - self.is_edit = True - self.state = _VI_ACTION - self.action = self.delete - - def key_D (self, char): - self.is_edit = True - self.state = _VI_ACTION - self.action = self.delete_end_of_line - self.apply () - - def key_x (self, char): - self.is_edit = True - self.state = _VI_ACTION - self.action = self.delete_char - self.apply () - - def key_X (self, char): - self.is_edit = True - self.state = _VI_ACTION - self.action = self.delete_prev_char - self.apply () - - def key_s (self, char): - self.is_edit = True - i1 = self.readline.l_buffer.point - i2 = self.readline.l_buffer.point + self.get_multiplier () - self.skip_multipler = True - self.readline.vi_set_insert_mode (True) - del self.readline.l_buffer.line_buffer [i1 : i2] - self.state = _VI_TEXT - - def key_S (self, char): - self.is_edit = True - self.readline.vi_set_insert_mode (True) - self.readline.l_buffer.line_buffer = [] - self.readline.l_buffer.point = 0 - self.state = _VI_TEXT - - def key_c (self, char): - self.is_edit = True - self.state = _VI_ACTION - self.action = self.change - - def key_C (self, char): - self.is_edit = True - self.readline.vi_set_insert_mode (True) - del self.readline.l_buffer.line_buffer [self.readline.l_buffer.point : ] - self.state = _VI_TEXT - - def key_r (self, char): - self.state = _VI_REPLACE_ONE - - def key_R (self, char): - self.is_edit = True - self.is_overwrite = True - self.readline.l_buffer.overwrite=True - self.readline.vi_set_insert_mode (True) - self.state = _VI_TEXT - - def key_y (self, char): - self._state = _VI_ACTION - self.action = self.yank - - def key_Y (self, char): - self.readline._vi_yank_buffer = self.readline.l_buffer.get_line_text() - self.end () - - def key_p (self, char): - if not self.readline._vi_yank_buffer: - return - self.is_edit = True - self.readline.vi_save_line () - self.readline.l_buffer.point += 1 - self.readline.l_buffer.insert_text (self.readline._vi_yank_buffer * self.get_multiplier ()) - self.readline.l_buffer.point -= 1 - self.state = _VI_END - - def key_P (self, char): - if not self.readline._vi_yank_buffer: - return - self.is_edit = True - self.readline.vi_save_line () - self.readline.l_buffer.insert_text (self.readline._vi_yank_buffer * self.get_multiplier ()) - self.readline.l_buffer.point -= 1 - self.state = _VI_END - - def key_u (self, char): - self.readline.vi_undo () - self.state = _VI_END - - def key_U (self, char): - self.readline.vi_undo_all () - self.state = _VI_END - - def key_v (self, char): - editor = ViExternalEditor (self.readline.l_buffer.line_buffer) - self.readline.l_buffer.line_buffer = list (editor.result) - self.readline.l_buffer.point = 0 - self.is_edit = True - self.state = _VI_END - - def error (self): - self.readline._bell () - self.is_error = True - - def state_is_end (self): - return self.state == _VI_END - is_end = property (state_is_end) - - def state_is_search (self): - return self.state == _VI_SEARCH - is_search = property (state_is_search) - - def state_is_replace_one (self): - return self.state == _VI_REPLACE_ONE - is_replace_one = property (state_is_replace_one) - - def do_search (self): - self.readline.vi_search_first () - self.state = _VI_END - - def key_n (self, char): - self.readline.vi_search_again_backward () - self.state = _VI_END - - def key_N (self, char): - self.readline.vi_search_again_forward () - self.state = _VI_END - - def motion_beginning_of_line (self, line, index=0, count=1, **kw): - return 0 - - def motion_end_in_line (self, line, index=0, count=1, **kw): - return max (0, len (self.readline.l_buffer.line_buffer)-1) - - def motion_word_short (self, line, index=0, count=1, **kw): - return vi_pos_word_short (line, index, count) - - def motion_word_long (self, line, index=0, count=1, **kw): - return vi_pos_word_long (line, index, count) - - def motion_end_short (self, line, index=0, count=1, **kw): - return vi_pos_end_short (line, index, count) - - def motion_end_long (self, line, index=0, count=1, **kw): - return vi_pos_end_long (line, index, count) - - def motion_back_short (self, line, index=0, count=1, **kw): - return vi_pos_back_short (line, index, count) - - def motion_back_long (self, line, index=0, count=1, **kw): - return vi_pos_back_long (line, index, count) - - def motion_find_char_forward (self, line, index=0, count=1, char=None): - self.readline._vi_key_find_char = char - return vi_pos_find_char_forward (line, char, index, count) - - def motion_find_char_backward (self, line, index=0, count=1, char=None): - self.readline._vi_key_find_char = char - return vi_pos_find_char_backward (line, char, index, count) - - def motion_to_char_forward (self, line, index=0, count=1, char=None): - return vi_pos_to_char_forward (line, char, index, count) - - def motion_to_char_backward (self, line, index=0, count=1, char=None): - return vi_pos_to_char_backward (line, char, index, count) - - def motion_left (self, line, index=0, count=1, char=None): - return max (0, index - count) - - def motion_right (self, line, index=0, count=1, char=None): - return min (len(line), index + count) - - def motion_matching (self, line, index=0, count=1, char=None): - return vi_pos_matching (line, index) - - def motion_column (self, line, index=0, count=1, char=None): - return max (0, count-1) - - def has_multiplier (self): - return self.override_multiplier or self.readline._vi_multiplier1 or self.readline._vi_multiplier2 - - def get_multiplier (self): - if self.override_multiplier: - return int (self.override_multiplier) - if self.readline._vi_multiplier1 == '': m1 = 1 - else: m1 = int(self.readline._vi_multiplier1) - if self.readline._vi_multiplier2 == '': m2 = 1 - else: m2 = int(self.readline._vi_multiplier2) - return m1 * m2 - - def set_override_multiplier (self, count): - self.override_multiplier = count - - def apply (self): - if self.motion: - self.pos_motion = self.motion (self.readline.l_buffer.line_buffer, self.readline.l_buffer.point, - self.get_multiplier(), char=self.motion_argument) - if self.pos_motion < 0: - self.error () - return - self.action () - if self.state != _VI_TEXT: - self.end () - - def movement (self): - if self.pos_motion <= len(self.readline.l_buffer.line_buffer): - self.readline.l_buffer.point = self.pos_motion - else: - self.readline.l_buffer.point = len(self.readline.l_buffer.line_buffer) - 1 - - def yank (self): - if self.pos_motion > self.readline.l_buffer.point: - s = self.readline.l_buffer.line_buffer [self.readline.l_buffer.point : self.pos_motion + self.delete_right] - else: - index = max (0, self.pos_motion - self.delete_left) - s = self.readline.l_buffer.line_buffer [index : self.readline.l_buffer.point + self.delete_right] - self.readline._vi_yank_buffer = s - - def delete (self): - self.readline.vi_save_line () - self.yank () -# point=lineobj.Point(self.readline.l_buffer) -# pm=self.pos_motion -# del self.readline.l_buffer[point:pm] -# return - if self.pos_motion > self.readline.l_buffer.point: - del self.readline.l_buffer.line_buffer [self.readline.l_buffer.point : self.pos_motion + self.delete_right] - if self.readline.l_buffer.point > len (self.readline.l_buffer.line_buffer): - self.readline.l_buffer.point = len (self.readline.l_buffer.line_buffer) - else: - index = max (0, self.pos_motion - self.delete_left) - del self.readline.l_buffer.line_buffer [index : self.readline.l_buffer.point + self.delete_right] - self.readline.l_buffer.point = index - - def delete_end_of_line (self): - self.readline.vi_save_line () - # del self.readline.l_buffer [self.readline.l_buffer.point : ] - line_text = self.readline.l_buffer.get_line_text () - line_text = line_text [ : self.readline.l_buffer.point] - self.readline.l_buffer.set_line (line_text) - if self.readline.l_buffer.point > 0: - self.readline.l_buffer.point -= 1 - - def delete_char (self): -# point=lineobj.Point(self.readline.l_buffer) -# del self.readline.l_buffer[point:point+self.get_multiplier ()] -# return - self.pos_motion = self.readline.l_buffer.point + self.get_multiplier () - self.delete () - end = max (0, len (self.readline.l_buffer) - 1) - if self.readline.l_buffer.point > end: - self.readline.l_buffer.point = end - - def delete_prev_char (self): - self.pos_motion = self.readline.l_buffer.point - self.get_multiplier () - self.delete () - - def change (self): - self.readline.vi_set_insert_mode (True) - self.delete () - self.skip_multipler = True - self.state = _VI_TEXT - - def escape (self, char): - if self.state == _VI_TEXT: - if not self.skip_multipler: - times = self.get_multiplier () - if times > 1 and self.text: - extra = self.text * (times - 1) - self.set_buffer (extra) - self.state = _VI_END - - def set_motion_argument (self, char): - self.motion_argument = char - self.apply () - - def end (self): - self.state = _VI_END - if self.readline.l_buffer.point >= len(self.readline.l_buffer.line_buffer): - self.readline.l_buffer.point = max (0, len(self.readline.l_buffer.line_buffer) - 1) - -class ViExternalEditor: - def __init__ (self, line): - if type(line) is type([]): - line = ''.join (line) - file_tmp = self.get_tempfile () - fp_tmp = self.file_open (file_tmp, 'w') - fp_tmp.write (line) - fp_tmp.close () - self.run_editor (file_tmp) - fp_tmp = self.file_open (file_tmp, 'r') - self.result = fp_tmp.read () - fp_tmp.close () - self.file_remove (file_tmp) - - def get_tempfile (self): - import tempfile - return tempfile.mktemp (prefix='readline-', suffix='.py') - - def file_open (self, filename, mode): - return file (filename, mode) - - def file_remove (self, filename): - os.remove (filename) - - def get_editor (self): - try: - return os.environ ['EDITOR'] - except KeyError: - return 'notepad' # ouch - - def run_editor (self, filename): - cmd = '%s %s' % (self.get_editor(), filename, ) - self.run_command (cmd) - - def run_command (self, command): - os.system (command) - -class ViEvent: - def __init__ (self, char): - self.char = char - -# vi standalone functions -def vi_is_word (char): - log ('xx vi_is_word: type(%s), %s' % (type(char), char, )) - return char.isalpha() or char.isdigit() or char == '_' - -def vi_is_space (char): - return char.isspace () - -def vi_is_word_or_space (char): - return vi_is_word (char) or vi_is_space (char) - -def vi_pos_word_short (line, index=0, count=1): - try: - for i in range(count): - in_word = vi_is_word (line[index]) - if not in_word: - while not vi_is_word (line[index]): - index += 1 - else: - while vi_is_word (line[index]): - index += 1 - while vi_is_space (line[index]): - index += 1 - return index - except IndexError: - return len(line) - -def vi_pos_word_long (line, index=0, count=1): - try: - for i in range(count): - in_space = vi_is_space (line[index]) - if not in_space: - while not vi_is_space (line[index]): - index += 1 - while vi_is_space (line[index]): - index += 1 - return index - except IndexError: - return len(line) - -def vi_pos_end_short (line, index=0, count=1): - try: - for i in range(count): - index += 1 - while vi_is_space (line[index]): - index += 1 - in_word = vi_is_word (line[index]) - if not in_word: - while not vi_is_word_or_space (line[index]): - index += 1 - else: - while vi_is_word (line[index]): - index += 1 - return index - 1 - except IndexError: - return max (0, len(line)-1) - -def vi_pos_end_long (line, index=0, count=1): - try: - for i in range(count): - index += 1 - while vi_is_space (line[index]): - index += 1 - while not vi_is_space (line[index]): - index += 1 - return index - 1 - except IndexError: - return max (0, len(line)-1) - -class vi_list (list): - '''This is a list that cannot have a negative index''' - def __getitem__ (self, key): - try: - if int(key) < 0: - raise IndexError - except ValueError: - pass - return list.__getitem__ (self, key) - -def vi_pos_back_short (line, index=0, count=1): - line = vi_list (line) - try: - for i in range(count): - index -= 1 - while vi_is_space (line[index]): - index -= 1 - in_word = vi_is_word (line[index]) - if in_word: - while vi_is_word (line[index]): - index -= 1 - else: - while not vi_is_word_or_space (line[index]): - index -= 1 - return index + 1 - except IndexError: - return 0 - -def vi_pos_back_long (line, index=0, count=1): - line = vi_list (line) - try: - for i in range(count): - index -= 1 - while vi_is_space (line[index]): - index -= 1 - while not vi_is_space (line[index]): - index -= 1 - return index + 1 - except IndexError: - return 0 - -def vi_pos_find_char_forward (line, char, index=0, count=1): - try: - for i in range(count): - index += 1 - while line [index] != char: - index += 1 - return index - except IndexError: - return -1 - -def vi_pos_find_char_backward (line, char, index=0, count=1): - try: - for i in range(count): - index -= 1 - while 1: - if index < 0: - return -1 - if line[index] == char: - break - index -= 1 - return index - except IndexError: - return -1 - -def vi_pos_to_char_forward (line, char, index=0, count=1): - index = vi_pos_find_char_forward (line, char, index, count) - if index > 0: - return index - 1 - return index - -def vi_pos_to_char_backward (line, char, index=0, count=1): - index = vi_pos_find_char_backward (line, char, index, count) - if index >= 0: - return index + 1 - return index - -_vi_dct_matching = { - '<': ('>', +1), '>': ('<', -1), - '(': (')', +1), ')': ('(', -1), - '[': (']', +1), ']': ('[', -1), - '{': ('}', +1), '}': ('{', -1), -} - -def vi_pos_matching (line, index=0): - '''find matching <([{}])>''' - anchor = None - target = None - delta = 1 - count = 0 - try: - while 1: - if anchor is None: - # first find anchor - try: - target, delta = _vi_dct_matching [line [index]] - anchor = line [index] - count = 1 - except KeyError: - index += 1 - continue - else: - # Here the anchor has been found - # Need to get corresponding target - if index < 0: - return -1 - if line [index] == anchor: - count += 1 - elif line [index] == target: - count -= 1 - if count == 0: - return index - index += delta - except IndexError: - return -1 - +# -*- coding: utf-8 -*- +#***************************************************************************** +# Copyright (C) 2003-2006 Gary Bishop. +# Copyright (C) 2006 Michael Graz. +# Copyright (C) 2006 Jorgen Stenarson. +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** +import os +import pyreadline.logger as logger +from pyreadline.logger import log +import pyreadline.lineeditor.lineobj as lineobj +import pyreadline.lineeditor.history as history +import basemode + +class ViMode(basemode.BaseMode): + mode="vi" + def __init__(self,rlobj): + super(ViMode,self).__init__(rlobj) + self.__vi_insert_mode = None + + def __repr__(self): + return "" + + def process_keyevent(self, keyinfo): + def nop(e): + pass + keytuple=keyinfo.tuple() + + #Process exit keys. Only exit on empty line + if keytuple in self.exit_dispatch: + if lineobj.EndOfLine(self.l_buffer) == 0: + raise EOFError + + dispatch_func = self.key_dispatch.get(keytuple,self.vi_key) + log("readline from keyboard:%s->%s"%(keytuple,dispatch_func)) + r = None + if dispatch_func: + r = dispatch_func(keyinfo) + self.l_buffer.push_undo() + + self.previous_func = dispatch_func + if r: + self._update_line() + return True + return False + + ### Methods below here are bindable emacs functions + + def init_editing_mode(self, e): # (M-C-j) + '''Initialize vi editingmode''' + self.show_all_if_ambiguous = 'on' + self.key_dispatch = {} + self.__vi_insert_mode = None + self._vi_command = None + self._vi_command_edit = None + self._vi_key_find_char = None + self._vi_key_find_direction = True + self._vi_yank_buffer = None + self._vi_multiplier1 = '' + self._vi_multiplier2 = '' + self._vi_undo_stack = [] + self._vi_undo_cursor = -1 + self._vi_current = None + self._vi_search_text = '' + self.vi_save_line () + self.vi_set_insert_mode (True) + # make ' ' to ~ self insert + for c in range(ord(' '), 127): + self._bind_key('%s' % chr(c), self.vi_key) + self._bind_key('BackSpace', self.vi_backspace) + self._bind_key('Escape', self.vi_escape) + self._bind_key('Return', self.vi_accept_line) + + self._bind_key('Left', self.backward_char) + self._bind_key('Right', self.forward_char) + self._bind_key('Home', self.beginning_of_line) + self._bind_key('End', self.end_of_line) + self._bind_key('Delete', self.delete_char) + + self._bind_key('Control-d', self.vi_eof) + self._bind_key('Control-z', self.vi_eof) + self._bind_key('Control-r', self.vi_redo) + self._bind_key('Up', self.vi_arrow_up) + self._bind_key('Control-p', self.vi_up) + self._bind_key('Down', self.vi_arrow_down) + self._bind_key('Control-n', self.vi_down) + self._bind_key('Tab', self.vi_complete) +# self._bind_key('Control-e', self.emacs) + + def vi_key (self, e): + if not self._vi_command: + self._vi_command = ViCommand (self) + elif self._vi_command.is_end: + if self._vi_command.is_edit: + self._vi_command_edit = self._vi_command + self._vi_command = ViCommand (self) + self._vi_command.add_char (e.char) + + def vi_error (self): + self._bell () + + def vi_get_is_insert_mode (self): + return self.__vi_insert_mode + vi_is_insert_mode = property (vi_get_is_insert_mode) + + def vi_escape (self, e): + if self.vi_is_insert_mode: + if self._vi_command: + self._vi_command.add_char (e.char) + else: + self._vi_command = ViCommand (self) + self.vi_set_insert_mode (False) + self.l_buffer.point=lineobj.PrevChar + elif self._vi_command and self._vi_command.is_replace_one: + self._vi_command.add_char (e.char) + else: + self.vi_error () + + def vi_backspace (self, e): + if self._vi_command: + self._vi_command.add_char (e.char) + else: + self._vi_do_backspace (self._vi_command) + + def _vi_do_backspace (self, vi_cmd): + if self.vi_is_insert_mode or (self._vi_command and self._vi_command.is_search): + if self.l_buffer.point > 0: + self.l_buffer.point -= 1 + if self.l_buffer.overwrite: + try: + prev = self._vi_undo_stack [self._vi_undo_cursor][1][self.l_buffer.point ] + self.l_buffer.line_buffer [self.l_buffer.point] = prev + except IndexError: + del self.l_buffer.line_buffer [self.l_buffer.point ] + else: + self.vi_save_line () + del self.l_buffer.line_buffer [self.l_buffer.point ] + + def vi_accept_line (self, e): + if self._vi_command and self._vi_command.is_search: + self._vi_command.do_search () + return False + self._vi_command = None + self.vi_set_insert_mode (True) + self._vi_undo_stack = [] + self._vi_undo_cursor = -1 + self._vi_current = None + return self.accept_line (e) + + def vi_eof (self, e): + raise EOFError + + def vi_set_insert_mode (self, value): + if self.__vi_insert_mode == value: + return + self.__vi_insert_mode = value + if value: + self.vi_save_line () + self.cursor_size=25 + else: + self.cursor_size=100 + + def vi_undo_restart (self): + tpl_undo = (self.l_buffer.point, self.l_buffer.line_buffer[:], ) + self._vi_undo_stack = [tpl_undo] + self._vi_undo_cursor = 0 + + def vi_save_line (self): + if self._vi_undo_stack and self._vi_undo_cursor >= 0: + del self._vi_undo_stack [self._vi_undo_cursor + 1 : ] + # tpl_undo = (self.l_buffer.point, self.l_buffer[:], ) + tpl_undo = (self.l_buffer.point, self.l_buffer.line_buffer[:], ) + if not self._vi_undo_stack or self._vi_undo_stack[self._vi_undo_cursor][1] != tpl_undo[1]: + self._vi_undo_stack.append (tpl_undo) + self._vi_undo_cursor += 1 + + def vi_undo_prepare (self): + if self._vi_undo_cursor == len(self._vi_undo_stack)-1: + self.vi_save_line () + + def vi_undo (self, do_pop=True): + self.vi_undo_prepare () + if not self._vi_undo_stack or self._vi_undo_cursor <= 0: + self.vi_error () + return + self._vi_undo_cursor -= 1 + self.vi_undo_assign () + + def vi_undo_all (self): + self.vi_undo_prepare () + if self._vi_undo_cursor > 0: + self._vi_undo_cursor = 0 + self.vi_undo_assign () + else: + self.vi_error () + + def vi_undo_assign (self): + tpl_undo = self._vi_undo_stack [self._vi_undo_cursor] + self.l_buffer.line_buffer = tpl_undo [1][:] + self.l_buffer.point = tpl_undo [0] + + def vi_redo (self, e): + if self._vi_undo_cursor >= len(self._vi_undo_stack)-1: + self.vi_error () + return + self._vi_undo_cursor += 1 + self.vi_undo_assign () + + def vi_search (self, rng): + for i in rng: + line_history = self._history.history [i] + pos = line_history.get_line_text().find (self._vi_search_text) + if pos >= 0: + self._history.history_cursor = i + self.l_buffer.line_buffer = list (line_history.line_buffer) + self.l_buffer.point = pos + self.vi_undo_restart () + return True + self._bell () + return False + + def vi_search_first (self): + text = ''.join (self.l_buffer.line_buffer [1:]) + if text: + self._vi_search_text = text + position = len (self._history.history) - 1 + elif self._vi_search_text: + position = self._history.history_cursor - 1 + else: + self.vi_error () + self.vi_undo () + return + if not self.vi_search (range (position, -1, -1)): + # Here: search text not found + self.vi_undo () + + def vi_search_again_backward (self): + self.vi_search (range (self._history.history_cursor-1, -1, -1)) + + def vi_search_again_forward (self): + self.vi_search (range (self._history.history_cursor+1, len(self._history.history))) + + def vi_up (self, e): + if self._history.history_cursor == len(self._history.history): + self._vi_current = self.l_buffer.line_buffer [:] + # self._history.previous_history (e) + self._history.previous_history (self.l_buffer) + if self.vi_is_insert_mode: + self.end_of_line (e) + else: + self.beginning_of_line (e) + self.vi_undo_restart () + + def vi_down (self, e): + if self._history.history_cursor >= len(self._history.history): + self.vi_error () + return + if self._history.history_cursor < len(self._history.history) - 1: + # self._history.next_history (e) + self._history.next_history (self.l_buffer) + if self.vi_is_insert_mode: + self.end_of_line (e) + else: + self.beginning_of_line (e) + self.vi_undo_restart () + elif self._vi_current is not None: + self._history.history_cursor = len(self._history.history) + self.l_buffer.line_buffer = self._vi_current + self.end_of_line (e) + if not self.vi_is_insert_mode and self.l_buffer.point > 0: + self.l_buffer.point -= 1 + self._vi_current = None + else: + self.vi_error () + return + + def vi_arrow_up (self, e): + self.vi_set_insert_mode (True) + self.vi_up (e) + self.vi_save_line () + + def vi_arrow_down (self, e): + self.vi_set_insert_mode (True) + self.vi_down (e) + self.vi_save_line () + + def vi_complete (self, e): + text = self.l_buffer.get_line_text () + if text and not text.isspace (): + return self.complete (e) + else: + return self.vi_key (e) + +# vi input states +# sequence of possible states are in the order below +_VI_BEGIN = 'vi_begin' +_VI_MULTI1 = 'vi_multi1' +_VI_ACTION = 'vi_action' +_VI_MULTI2 = 'vi_multi2' +_VI_MOTION = 'vi_motion' +_VI_MOTION_ARGUMENT = 'vi_motion_argument' +_VI_REPLACE_ONE = 'vi_replace_one' +_VI_TEXT = 'vi_text' +_VI_SEARCH = 'vi_search' +_VI_END = 'vi_end' + +# vi helper class +class ViCommand: + def __init__ (self, readline): + self.readline = readline + self.lst_char = [] + self.state = _VI_BEGIN + self.action = self.movement + self.motion = None + self.motion_argument = None + self.text = None + self.pos_motion = None + self.is_edit = False + self.is_overwrite = False + self.is_error = False + self.is_star = False + self.delete_left = 0 + self.delete_right = 0 + self.readline._vi_multiplier1 = '' + self.readline._vi_multiplier2 = '' + self.set_override_multiplier (0) + self.skip_multipler = False + self.tabstop = 4 + self.dct_fcn = { + ord('$') : self.key_dollar, + ord('^') : self.key_hat, + ord(';') : self.key_semicolon, + ord(',') : self.key_comma, + ord('%') : self.key_percent, + ord('.') : self.key_dot, + ord('/') : self.key_slash, + ord('*') : self.key_star, + ord('|') : self.key_bar, + ord('~') : self.key_tilde, + 8 : self.key_backspace, + } + + def add_char (self, char): + self.lst_char.append (char) + if self.state == _VI_BEGIN and self.readline.vi_is_insert_mode: + self.readline.vi_save_line () + self.state = _VI_TEXT + if self.state == _VI_SEARCH: + if char == '\x08': # backspace + self.key_backspace (char) + else: + self.set_text (char) + return + if self.state == _VI_TEXT: + if char == '\x1b': # escape + self.escape (char) + elif char == '\x09': # tab + ts = self.tabstop + ws = ' ' * (ts - (self.readline.l_buffer.point%ts)) + self.set_text (ws) + elif char == '\x08': # backspace + self.key_backspace (char) + else: + self.set_text (char) + return + if self.state == _VI_MOTION_ARGUMENT: + self.set_motion_argument (char) + return + if self.state == _VI_REPLACE_ONE: + self.replace_one (char) + return + try: + fcn_instance = self.dct_fcn [ord(char)] + except: + fcn_instance = getattr (self, 'key_%s' % char, None) + if fcn_instance: + fcn_instance (char) + return + if char.isdigit (): + self.key_digit (char) + return + # Here: could not process key + self.error () + + def set_text (self, text): + if self.text is None: + self.text = text + else: + self.text += text + self.set_buffer (text) + + def set_buffer (self, text): + for char in text: + if not self.char_isprint (char): + continue +# self.readline.l_buffer.insert_text(char) +# continue +# #overwrite in l_buffer obj + if self.is_overwrite: + if self.readline.l_buffer.point < len (self.readline.l_buffer.line_buffer): + # self.readline.l_buffer[self.l_buffer.point]=char + self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] = char + else: + # self.readline.l_buffer.insert_text(char) + self.readline.l_buffer.line_buffer.append (char) + else: + # self.readline.l_buffer.insert_text(char) + self.readline.l_buffer.line_buffer.insert (self.readline.l_buffer.point, char) + self.readline.l_buffer.point += 1 + + def replace_one (self, char): + if char == '\x1b': # escape + self.end () + return + self.is_edit = True + self.readline.vi_save_line () + times = self.get_multiplier () + cursor = self.readline.l_buffer.point + self.readline.l_buffer.line_buffer [cursor : cursor + times] = char * times + if times > 1: + self.readline.l_buffer.point += (times - 1) + self.end () + + def char_isprint (self, char): + return ord(char) >= ord(' ') and ord(char) <= ord('~') + + def key_dollar (self, char): + self.motion = self.motion_end_in_line + self.delete_right = 1 + self.state = _VI_MOTION + self.apply () + + def key_hat (self, char): + self.motion = self.motion_beginning_of_line + self.state = _VI_MOTION + self.apply () + + def key_0 (self, char): + if self.state in [_VI_BEGIN, _VI_ACTION]: + self.key_hat (char) + else: + self.key_digit (char) + + def key_digit (self, char): + if self.state in [_VI_BEGIN, _VI_MULTI1]: + self.readline._vi_multiplier1 += char + self.readline._vi_multiplier2 = '' + self.state = _VI_MULTI1 + elif self.state in [_VI_ACTION, _VI_MULTI2]: + self.readline._vi_multiplier2 += char + self.state = _VI_MULTI2 + + def key_w (self, char): + if self.action == self.change: + self.key_e (char) + return + self.motion = self.motion_word_short + self.state = _VI_MOTION + self.apply () + + def key_W (self, char): + if self.action == self.change: + self.key_E (char) + return + self.motion = self.motion_word_long + self.state = _VI_MOTION + self.apply () + + def key_e (self, char): + self.motion = self.motion_end_short + self.state = _VI_MOTION + self.delete_right = 1 + self.apply () + + def key_E (self, char): + self.motion = self.motion_end_long + self.state = _VI_MOTION + self.delete_right = 1 + self.apply () + + def key_b (self, char): + self.motion = self.motion_back_short + self.state = _VI_MOTION + self.apply () + + def key_B (self, char): + self.motion = self.motion_back_long + self.state = _VI_MOTION + self.apply () + + def key_f (self, char): + self.readline._vi_key_find_direction = True + self.motion = self.motion_find_char_forward + self.delete_right = 1 + self.state = _VI_MOTION_ARGUMENT + + def key_F (self, char): + self.readline._vi_key_find_direction = False + self.motion = self.motion_find_char_backward + self.delete_left = 1 + self.state = _VI_MOTION_ARGUMENT + + def key_t (self, char): + self.motion = self.motion_to_char_forward + self.delete_right = 1 + self.state = _VI_MOTION_ARGUMENT + + def key_T (self, char): + self.motion = self.motion_to_char_backward + self.state = _VI_MOTION_ARGUMENT + + def key_j (self, char): + self.readline.vi_down (ViEvent (char)) + self.state = _VI_END + + def key_k (self, char): + self.readline.vi_up (ViEvent (char)) + self.state = _VI_END + + def key_semicolon (self, char): + if self.readline._vi_key_find_char is None: + self.error () + return + if self.readline._vi_key_find_direction: + self.motion = self.motion_find_char_forward + else: + self.motion = self.motion_find_char_backward + self.set_motion_argument (self.readline._vi_key_find_char) + + def key_comma (self, char): + if self.readline._vi_key_find_char is None: + self.error () + return + if self.readline._vi_key_find_direction: + self.motion = self.motion_find_char_backward + else: + self.motion = self.motion_find_char_forward + self.set_motion_argument (self.readline._vi_key_find_char) + + def key_percent (self, char): + '''find matching <([{}])>''' + self.motion = self.motion_matching + self.delete_right = 1 + self.state = _VI_MOTION + self.apply () + + def key_dot (self, char): + vi_cmd_edit = self.readline._vi_command_edit + if not vi_cmd_edit: + return + if vi_cmd_edit.is_star: + self.key_star (char) + return + if self.has_multiplier (): + count = self.get_multiplier () + else: + count = 0 + # Create the ViCommand object after getting multipler from self + # Side effect of the ViCommand creation is resetting of global multipliers + vi_cmd = ViCommand (self.readline) + if count >= 1: + vi_cmd.set_override_multiplier (count) + vi_cmd_edit.set_override_multiplier (count) + elif vi_cmd_edit.override_multiplier: + vi_cmd.set_override_multiplier (vi_cmd_edit.override_multiplier) + for char in vi_cmd_edit.lst_char: + vi_cmd.add_char (char) + if vi_cmd_edit.is_overwrite and self.readline.l_buffer.point > 0: + self.readline.l_buffer.point -= 1 + self.readline.vi_set_insert_mode (False) + self.end () + + def key_slash (self, char): + self.readline.vi_save_line () + self.readline.l_buffer.line_buffer=['/'] + self.readline.l_buffer.point= 1 + self.state = _VI_SEARCH + + def key_star (self, char): + self.is_star = True + self.is_edit = True + self.readline.vi_save_line () + completions = self.readline._get_completions() + if completions: + text = ' '.join (completions) + ' ' + self.readline.l_buffer.line_buffer [self.readline.begidx : self.readline.endidx + 1] = list (text) + prefix_len = self.readline.endidx - self.readline.begidx + self.readline.l_buffer.point += len(text) - prefix_len + self.readline.vi_set_insert_mode (True) + else: + self.error () + self.state = _VI_TEXT + + def key_bar (self, char): + self.motion = self.motion_column + self.state = _VI_MOTION + self.apply () + + def key_tilde (self, char): + self.is_edit = True + self.readline.vi_save_line () + for i in range (self.get_multiplier()): + try: + c = self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] + if c.isupper (): + self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] = c.lower() + elif c.islower (): + self.readline.l_buffer.line_buffer [self.readline.l_buffer.point] = c.upper() + self.readline.l_buffer.point += 1 + except IndexError: + break + self.end () + + def key_h (self, char): + self.motion = self.motion_left + self.state = _VI_MOTION + self.apply () + + def key_backspace (self, char): + if self.state in [_VI_TEXT, _VI_SEARCH]: + if self.text and len(self.text): + self.text = self.text [:-1] + try: + # Remove backspaces for potential dot command + self.lst_char.pop () + self.lst_char.pop () + except IndexError: + pass + else: + self.key_h (char) + self.readline._vi_do_backspace (self) + if self.state == _VI_SEARCH and not (self.readline.l_buffer.line_buffer): + self.state = _VI_BEGIN + + def key_l (self, char): + self.motion = self.motion_right + self.state = _VI_MOTION + self.apply () + + def key_i (self, char): + self.is_edit = True + self.state = _VI_TEXT + self.readline.vi_set_insert_mode (True) + + def key_I (self, char): + self.is_edit = True + self.state = _VI_TEXT + self.readline.vi_set_insert_mode (True) + self.readline.l_buffer.point = 0 + + def key_a (self, char): + self.is_edit = True + self.state = _VI_TEXT + self.readline.vi_set_insert_mode (True) + if len (self.readline.l_buffer.line_buffer): + self.readline.l_buffer.point += 1 + + def key_A (self, char): + self.is_edit = True + self.state = _VI_TEXT + self.readline.vi_set_insert_mode (True) + self.readline.l_buffer.point = len (self.readline.l_buffer.line_buffer) + + def key_d (self, char): + self.is_edit = True + self.state = _VI_ACTION + self.action = self.delete + + def key_D (self, char): + self.is_edit = True + self.state = _VI_ACTION + self.action = self.delete_end_of_line + self.apply () + + def key_x (self, char): + self.is_edit = True + self.state = _VI_ACTION + self.action = self.delete_char + self.apply () + + def key_X (self, char): + self.is_edit = True + self.state = _VI_ACTION + self.action = self.delete_prev_char + self.apply () + + def key_s (self, char): + self.is_edit = True + i1 = self.readline.l_buffer.point + i2 = self.readline.l_buffer.point + self.get_multiplier () + self.skip_multipler = True + self.readline.vi_set_insert_mode (True) + del self.readline.l_buffer.line_buffer [i1 : i2] + self.state = _VI_TEXT + + def key_S (self, char): + self.is_edit = True + self.readline.vi_set_insert_mode (True) + self.readline.l_buffer.line_buffer = [] + self.readline.l_buffer.point = 0 + self.state = _VI_TEXT + + def key_c (self, char): + self.is_edit = True + self.state = _VI_ACTION + self.action = self.change + + def key_C (self, char): + self.is_edit = True + self.readline.vi_set_insert_mode (True) + del self.readline.l_buffer.line_buffer [self.readline.l_buffer.point : ] + self.state = _VI_TEXT + + def key_r (self, char): + self.state = _VI_REPLACE_ONE + + def key_R (self, char): + self.is_edit = True + self.is_overwrite = True + self.readline.l_buffer.overwrite=True + self.readline.vi_set_insert_mode (True) + self.state = _VI_TEXT + + def key_y (self, char): + self._state = _VI_ACTION + self.action = self.yank + + def key_Y (self, char): + self.readline._vi_yank_buffer = self.readline.l_buffer.get_line_text() + self.end () + + def key_p (self, char): + if not self.readline._vi_yank_buffer: + return + self.is_edit = True + self.readline.vi_save_line () + self.readline.l_buffer.point += 1 + self.readline.l_buffer.insert_text (self.readline._vi_yank_buffer * self.get_multiplier ()) + self.readline.l_buffer.point -= 1 + self.state = _VI_END + + def key_P (self, char): + if not self.readline._vi_yank_buffer: + return + self.is_edit = True + self.readline.vi_save_line () + self.readline.l_buffer.insert_text (self.readline._vi_yank_buffer * self.get_multiplier ()) + self.readline.l_buffer.point -= 1 + self.state = _VI_END + + def key_u (self, char): + self.readline.vi_undo () + self.state = _VI_END + + def key_U (self, char): + self.readline.vi_undo_all () + self.state = _VI_END + + def key_v (self, char): + editor = ViExternalEditor (self.readline.l_buffer.line_buffer) + self.readline.l_buffer.line_buffer = list (editor.result) + self.readline.l_buffer.point = 0 + self.is_edit = True + self.state = _VI_END + + def error (self): + self.readline._bell () + self.is_error = True + + def state_is_end (self): + return self.state == _VI_END + is_end = property (state_is_end) + + def state_is_search (self): + return self.state == _VI_SEARCH + is_search = property (state_is_search) + + def state_is_replace_one (self): + return self.state == _VI_REPLACE_ONE + is_replace_one = property (state_is_replace_one) + + def do_search (self): + self.readline.vi_search_first () + self.state = _VI_END + + def key_n (self, char): + self.readline.vi_search_again_backward () + self.state = _VI_END + + def key_N (self, char): + self.readline.vi_search_again_forward () + self.state = _VI_END + + def motion_beginning_of_line (self, line, index=0, count=1, **kw): + return 0 + + def motion_end_in_line (self, line, index=0, count=1, **kw): + return max (0, len (self.readline.l_buffer.line_buffer)-1) + + def motion_word_short (self, line, index=0, count=1, **kw): + return vi_pos_word_short (line, index, count) + + def motion_word_long (self, line, index=0, count=1, **kw): + return vi_pos_word_long (line, index, count) + + def motion_end_short (self, line, index=0, count=1, **kw): + return vi_pos_end_short (line, index, count) + + def motion_end_long (self, line, index=0, count=1, **kw): + return vi_pos_end_long (line, index, count) + + def motion_back_short (self, line, index=0, count=1, **kw): + return vi_pos_back_short (line, index, count) + + def motion_back_long (self, line, index=0, count=1, **kw): + return vi_pos_back_long (line, index, count) + + def motion_find_char_forward (self, line, index=0, count=1, char=None): + self.readline._vi_key_find_char = char + return vi_pos_find_char_forward (line, char, index, count) + + def motion_find_char_backward (self, line, index=0, count=1, char=None): + self.readline._vi_key_find_char = char + return vi_pos_find_char_backward (line, char, index, count) + + def motion_to_char_forward (self, line, index=0, count=1, char=None): + return vi_pos_to_char_forward (line, char, index, count) + + def motion_to_char_backward (self, line, index=0, count=1, char=None): + return vi_pos_to_char_backward (line, char, index, count) + + def motion_left (self, line, index=0, count=1, char=None): + return max (0, index - count) + + def motion_right (self, line, index=0, count=1, char=None): + return min (len(line), index + count) + + def motion_matching (self, line, index=0, count=1, char=None): + return vi_pos_matching (line, index) + + def motion_column (self, line, index=0, count=1, char=None): + return max (0, count-1) + + def has_multiplier (self): + return self.override_multiplier or self.readline._vi_multiplier1 or self.readline._vi_multiplier2 + + def get_multiplier (self): + if self.override_multiplier: + return int (self.override_multiplier) + if self.readline._vi_multiplier1 == '': m1 = 1 + else: m1 = int(self.readline._vi_multiplier1) + if self.readline._vi_multiplier2 == '': m2 = 1 + else: m2 = int(self.readline._vi_multiplier2) + return m1 * m2 + + def set_override_multiplier (self, count): + self.override_multiplier = count + + def apply (self): + if self.motion: + self.pos_motion = self.motion (self.readline.l_buffer.line_buffer, self.readline.l_buffer.point, + self.get_multiplier(), char=self.motion_argument) + if self.pos_motion < 0: + self.error () + return + self.action () + if self.state != _VI_TEXT: + self.end () + + def movement (self): + if self.pos_motion <= len(self.readline.l_buffer.line_buffer): + self.readline.l_buffer.point = self.pos_motion + else: + self.readline.l_buffer.point = len(self.readline.l_buffer.line_buffer) - 1 + + def yank (self): + if self.pos_motion > self.readline.l_buffer.point: + s = self.readline.l_buffer.line_buffer [self.readline.l_buffer.point : self.pos_motion + self.delete_right] + else: + index = max (0, self.pos_motion - self.delete_left) + s = self.readline.l_buffer.line_buffer [index : self.readline.l_buffer.point + self.delete_right] + self.readline._vi_yank_buffer = s + + def delete (self): + self.readline.vi_save_line () + self.yank () +# point=lineobj.Point(self.readline.l_buffer) +# pm=self.pos_motion +# del self.readline.l_buffer[point:pm] +# return + if self.pos_motion > self.readline.l_buffer.point: + del self.readline.l_buffer.line_buffer [self.readline.l_buffer.point : self.pos_motion + self.delete_right] + if self.readline.l_buffer.point > len (self.readline.l_buffer.line_buffer): + self.readline.l_buffer.point = len (self.readline.l_buffer.line_buffer) + else: + index = max (0, self.pos_motion - self.delete_left) + del self.readline.l_buffer.line_buffer [index : self.readline.l_buffer.point + self.delete_right] + self.readline.l_buffer.point = index + + def delete_end_of_line (self): + self.readline.vi_save_line () + # del self.readline.l_buffer [self.readline.l_buffer.point : ] + line_text = self.readline.l_buffer.get_line_text () + line_text = line_text [ : self.readline.l_buffer.point] + self.readline.l_buffer.set_line (line_text) + if self.readline.l_buffer.point > 0: + self.readline.l_buffer.point -= 1 + + def delete_char (self): +# point=lineobj.Point(self.readline.l_buffer) +# del self.readline.l_buffer[point:point+self.get_multiplier ()] +# return + self.pos_motion = self.readline.l_buffer.point + self.get_multiplier () + self.delete () + end = max (0, len (self.readline.l_buffer) - 1) + if self.readline.l_buffer.point > end: + self.readline.l_buffer.point = end + + def delete_prev_char (self): + self.pos_motion = self.readline.l_buffer.point - self.get_multiplier () + self.delete () + + def change (self): + self.readline.vi_set_insert_mode (True) + self.delete () + self.skip_multipler = True + self.state = _VI_TEXT + + def escape (self, char): + if self.state == _VI_TEXT: + if not self.skip_multipler: + times = self.get_multiplier () + if times > 1 and self.text: + extra = self.text * (times - 1) + self.set_buffer (extra) + self.state = _VI_END + + def set_motion_argument (self, char): + self.motion_argument = char + self.apply () + + def end (self): + self.state = _VI_END + if self.readline.l_buffer.point >= len(self.readline.l_buffer.line_buffer): + self.readline.l_buffer.point = max (0, len(self.readline.l_buffer.line_buffer) - 1) + +class ViExternalEditor: + def __init__ (self, line): + if type(line) is type([]): + line = ''.join (line) + file_tmp = self.get_tempfile () + fp_tmp = self.file_open (file_tmp, 'w') + fp_tmp.write (line) + fp_tmp.close () + self.run_editor (file_tmp) + fp_tmp = self.file_open (file_tmp, 'r') + self.result = fp_tmp.read () + fp_tmp.close () + self.file_remove (file_tmp) + + def get_tempfile (self): + import tempfile + return tempfile.mktemp (prefix='readline-', suffix='.py') + + def file_open (self, filename, mode): + return file (filename, mode) + + def file_remove (self, filename): + os.remove (filename) + + def get_editor (self): + try: + return os.environ ['EDITOR'] + except KeyError: + return 'notepad' # ouch + + def run_editor (self, filename): + cmd = '%s %s' % (self.get_editor(), filename, ) + self.run_command (cmd) + + def run_command (self, command): + os.system (command) + +class ViEvent: + def __init__ (self, char): + self.char = char + +# vi standalone functions +def vi_is_word (char): + log ('xx vi_is_word: type(%s), %s' % (type(char), char, )) + return char.isalpha() or char.isdigit() or char == '_' + +def vi_is_space (char): + return char.isspace () + +def vi_is_word_or_space (char): + return vi_is_word (char) or vi_is_space (char) + +def vi_pos_word_short (line, index=0, count=1): + try: + for i in range(count): + in_word = vi_is_word (line[index]) + if not in_word: + while not vi_is_word (line[index]): + index += 1 + else: + while vi_is_word (line[index]): + index += 1 + while vi_is_space (line[index]): + index += 1 + return index + except IndexError: + return len(line) + +def vi_pos_word_long (line, index=0, count=1): + try: + for i in range(count): + in_space = vi_is_space (line[index]) + if not in_space: + while not vi_is_space (line[index]): + index += 1 + while vi_is_space (line[index]): + index += 1 + return index + except IndexError: + return len(line) + +def vi_pos_end_short (line, index=0, count=1): + try: + for i in range(count): + index += 1 + while vi_is_space (line[index]): + index += 1 + in_word = vi_is_word (line[index]) + if not in_word: + while not vi_is_word_or_space (line[index]): + index += 1 + else: + while vi_is_word (line[index]): + index += 1 + return index - 1 + except IndexError: + return max (0, len(line)-1) + +def vi_pos_end_long (line, index=0, count=1): + try: + for i in range(count): + index += 1 + while vi_is_space (line[index]): + index += 1 + while not vi_is_space (line[index]): + index += 1 + return index - 1 + except IndexError: + return max (0, len(line)-1) + +class vi_list (list): + '''This is a list that cannot have a negative index''' + def __getitem__ (self, key): + try: + if int(key) < 0: + raise IndexError + except ValueError: + pass + return list.__getitem__ (self, key) + +def vi_pos_back_short (line, index=0, count=1): + line = vi_list (line) + try: + for i in range(count): + index -= 1 + while vi_is_space (line[index]): + index -= 1 + in_word = vi_is_word (line[index]) + if in_word: + while vi_is_word (line[index]): + index -= 1 + else: + while not vi_is_word_or_space (line[index]): + index -= 1 + return index + 1 + except IndexError: + return 0 + +def vi_pos_back_long (line, index=0, count=1): + line = vi_list (line) + try: + for i in range(count): + index -= 1 + while vi_is_space (line[index]): + index -= 1 + while not vi_is_space (line[index]): + index -= 1 + return index + 1 + except IndexError: + return 0 + +def vi_pos_find_char_forward (line, char, index=0, count=1): + try: + for i in range(count): + index += 1 + while line [index] != char: + index += 1 + return index + except IndexError: + return -1 + +def vi_pos_find_char_backward (line, char, index=0, count=1): + try: + for i in range(count): + index -= 1 + while 1: + if index < 0: + return -1 + if line[index] == char: + break + index -= 1 + return index + except IndexError: + return -1 + +def vi_pos_to_char_forward (line, char, index=0, count=1): + index = vi_pos_find_char_forward (line, char, index, count) + if index > 0: + return index - 1 + return index + +def vi_pos_to_char_backward (line, char, index=0, count=1): + index = vi_pos_find_char_backward (line, char, index, count) + if index >= 0: + return index + 1 + return index + +_vi_dct_matching = { + '<': ('>', +1), '>': ('<', -1), + '(': (')', +1), ')': ('(', -1), + '[': (']', +1), ']': ('[', -1), + '{': ('}', +1), '}': ('{', -1), +} + +def vi_pos_matching (line, index=0): + '''find matching <([{}])>''' + anchor = None + target = None + delta = 1 + count = 0 + try: + while 1: + if anchor is None: + # first find anchor + try: + target, delta = _vi_dct_matching [line [index]] + anchor = line [index] + count = 1 + except KeyError: + index += 1 + continue + else: + # Here the anchor has been found + # Need to get corresponding target + if index < 0: + return -1 + if line [index] == anchor: + count += 1 + elif line [index] == target: + count -= 1 + if count == 0: + return index + index += delta + except IndexError: + return -1 + diff --git a/pyreadline/release.py b/pyreadline/release.py index dd5a3a5..43859f6 100644 --- a/pyreadline/release.py +++ b/pyreadline/release.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -"""Release data for the pyreadline project. +u"""Release data for the pyreadline project. $Id$""" @@ -13,23 +13,23 @@ $Id$""" # Name of the package for release purposes. This is the name which labels # the tarballs and RPMs made by distutils, so it's best to lowercase it. -name = 'pyreadline' +name = u'pyreadline' # For versions with substrings (like 0.6.16.svn), use an extra . to separate # the new substring. We have to avoid using either dashes or underscores, # because bdist_rpm does not accept dashes (an RPM) convention, and # bdist_deb does not accept underscores (a Debian convention). -branch = '' +branch = u'' -version = '1.7' +version = u'1.7' -revision = '$Revision$' +revision = u'$Revision$' -description = "A python implmementation of GNU readline." +description = u"A python implmementation of GNU readline." long_description = \ -""" +u""" The pyreadline package is a python implementation of GNU readline functionality it is based on the ctypes based UNC readline package by Gary Bishop. It is not complete. It has been tested for use with windows 2000 and windows xp. @@ -51,31 +51,31 @@ Features: .. _repository: """ -license = 'BSD' +license = u'BSD' -authors = {'Jorgen' : ('Jorgen Stenarson','jorgen.stenarson@bostream.nu'), - 'Gary': ('Gary Bishop', ''), - 'Jack': ('Jack Trainor', ''), +authors = {u'Jorgen' : (u'Jorgen Stenarson',u'jorgen.stenarson@bostream.nu'), + u'Gary': (u'Gary Bishop', ''), + u'Jack': (u'Jack Trainor', ''), } -url = 'http://ipython.scipy.org/moin/PyReadline/Intro' +url = u'http://ipython.scipy.org/moin/PyReadline/Intro' -download_url = 'https://launchpad.net/pyreadline/+download' +download_url = u'https://launchpad.net/pyreadline/+download' -platforms = ['Windows XP/2000/NT', - 'Windows 95/98/ME'] +platforms = [u'Windows XP/2000/NT', + u'Windows 95/98/ME'] -keywords = ['readline', - 'pyreadline'] +keywords = [u'readline', + u'pyreadline'] -classifiers = ['Development Status :: 5 - Production/Stable', - 'Environment :: Console', - 'Operating System :: Microsoft :: Windows', - 'License :: OSI Approved :: BSD License', - 'Programming Language :: Python :: 2.4', - 'Programming Language :: Python :: 2.5', - 'Programming Language :: Python :: 2.6', - 'Programming Language :: Python :: 2.7', +classifiers = [u'Development Status :: 5 - Production/Stable', + u'Environment :: Console', + u'Operating System :: Microsoft :: Windows', + u'License :: OSI Approved :: BSD License', + u'Programming Language :: Python :: 2.4', + u'Programming Language :: Python :: 2.5', + u'Programming Language :: Python :: 2.6', + u'Programming Language :: Python :: 2.7', ] diff --git a/pyreadline/rlmain.py b/pyreadline/rlmain.py index f43a946..66e469a 100644 --- a/pyreadline/rlmain.py +++ b/pyreadline/rlmain.py @@ -1,591 +1,590 @@ -# -*- coding: utf-8 -*- -#***************************************************************************** -# Copyright (C) 2003-2006 Gary Bishop. -# Copyright (C) 2006 Jorgen Stenarson. -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** -''' an attempt to implement readline for Python in Python using ctypes''' -import sys,os,re,time -from glob import glob - -from . import release - -import pyreadline.lineeditor.lineobj as lineobj -import pyreadline.lineeditor.history as history -import pyreadline.clipboard as clipboard -import pyreadline.console as console -import pyreadline.logger as logger - -from pyreadline.keysyms.common import make_KeyPress_from_keydescr -from pyreadline.unicode_helper import ensure_str -from .logger import log -from .modes import editingmodes -from .error import ReadlineError, GetSetError -import collections - -in_ironpython = "IronPython" in sys.version -if in_ironpython:#ironpython does not provide a prompt string to readline - import System - default_prompt = ">>> " -else: - default_prompt = "" - import pdb - - -class MockConsoleError(Exception): - pass - -class MockConsole(object): - """object used during refactoring. Should raise errors when someone tries to use it. - """ - def __setattr__(self, x): - raise MockConsoleError("Should not try to get attributes from MockConsole") - - def cursor(self, size=50): - pass - -class BaseReadline(object): - def __init__(self): - self.allow_ctrl_c = False - self.ctrl_c_tap_time_interval = 0.3 - - self.debug = False - self.bell_style = 'none' - self.mark = -1 - self.console=MockConsole() - self.disable_readline = False - # this code needs to follow l_buffer and history creation - self.editingmodes = [mode(self) for mode in editingmodes] - for mode in self.editingmodes: - mode.init_editing_mode(None) - self.mode = self.editingmodes[0] - - self.read_inputrc() - log("\n".join(self.mode.rl_settings_to_string())) - - self.callback = None - - def parse_and_bind(self, string): - '''Parse and execute single line of a readline init file.''' - try: - log('parse_and_bind("%s")' % string) - if string.startswith('#'): - return - if string.startswith('set'): - m = re.compile(r'set\s+([-a-zA-Z0-9]+)\s+(.+)\s*$').match(string) - if m: - var_name = m.group(1) - val = m.group(2) - try: - setattr(self.mode, var_name.replace('-','_'), val) - except AttributeError: - log('unknown var="%s" val="%s"' % (var_name, val)) - else: - log('bad set "%s"' % string) - return - m = re.compile(r'\s*(.+)\s*:\s*([-a-zA-Z]+)\s*$').match(string) - if m: - key = m.group(1) - func_name = m.group(2) - py_name = func_name.replace('-', '_') - try: - func = getattr(self.mode, py_name) - except AttributeError: - log('unknown func key="%s" func="%s"' % (key, func_name)) - if self.debug: - print('pyreadline parse_and_bind error, unknown function to bind: "%s"' % func_name) - return - self.mode._bind_key(key, func) - except: - log('error') - raise - - def _set_prompt(self, prompt): - self.mode.prompt = prompt - - def _get_prompt(self): - return self.mode.prompt - - prompt = property(_get_prompt, _set_prompt) - - - def get_line_buffer(self): - '''Return the current contents of the line buffer.''' - return self.mode.l_buffer.get_line_text() - - def insert_text(self, string): - '''Insert text into the command line.''' - self.mode.insert_text(string) - - def read_init_file(self, filename=None): - '''Parse a readline initialization file. The default filename is the last filename used.''' - log('read_init_file("%s")' % filename) - - #History file book keeping methods (non-bindable) - - def add_history(self, line): - '''Append a line to the history buffer, as if it was the last line typed.''' - self.mode._history.add_history(line) - - def get_current_history_length(self ): - '''Return the number of lines currently in the history. - (This is different from get_history_length(), which returns - the maximum number of lines that will be written to a history file.)''' - return self.mode._history.get_current_history_length() - - def get_history_length(self ): - '''Return the desired length of the history file. - - Negative values imply unlimited history file size.''' - return self.mode._history.get_history_length() - - def set_history_length(self, length): - '''Set the number of lines to save in the history file. - - write_history_file() uses this value to truncate the history file - when saving. Negative values imply unlimited history file size. - ''' - self.mode._history.set_history_length(length) - - def get_history_item(self, index): - '''Return the current contents of history item at index.''' - return self.mode._history.get_history_item(index) - - def clear_history(self): - '''Clear readline history''' - self.mode._history.clear_history() - - def read_history_file(self, filename=None): - '''Load a readline history file. The default filename is ~/.history.''' - if filename is None: - filename = self.mode._history.history_filename - log("read_history_file from %s"%ensure_str(filename)) - self.mode._history.read_history_file(filename) - - def write_history_file(self, filename=None): - '''Save a readline history file. The default filename is ~/.history.''' - self.mode._history.write_history_file(filename) - - #Completer functions - - def set_completer(self, function=None): - '''Set or remove the completer function. - - If function is specified, it will be used as the new completer - function; if omitted or None, any completer function already - installed is removed. The completer function is called as - function(text, state), for state in 0, 1, 2, ..., until it returns a - non-string value. It should return the next possible completion - starting with text. - ''' - log('set_completer') - self.mode.completer = function - - def get_completer(self): - '''Get the completer function. - ''' - log('get_completer') - return self.mode.completer - - def get_begidx(self): - '''Get the beginning index of the readline tab-completion scope.''' - return self.mode.begidx - - def get_endidx(self): - '''Get the ending index of the readline tab-completion scope.''' - return self.mode.endidx - - def set_completer_delims(self, string): - '''Set the readline word delimiters for tab-completion.''' - self.mode.completer_delims = string - - def get_completer_delims(self): - '''Get the readline word delimiters for tab-completion.''' - return self.mode.completer_delims.encode("ascii") - - def set_startup_hook(self, function=None): - '''Set or remove the startup_hook function. - - If function is specified, it will be used as the new startup_hook - function; if omitted or None, any hook function already installed is - removed. The startup_hook function is called with no arguments just - before readline prints the first prompt. - - ''' - self.mode.startup_hook = function - - def set_pre_input_hook(self, function=None): - '''Set or remove the pre_input_hook function. - - If function is specified, it will be used as the new pre_input_hook - function; if omitted or None, any hook function already installed is - removed. The pre_input_hook function is called with no arguments - after the first prompt has been printed and just before readline - starts reading input characters. - - ''' - self.mode.pre_input_hook = function - -#Functions that are not relevant for all Readlines but should at least have a NOP - - def _bell(self): - pass - -# -# Standard call, not available for all implementations -# - - def readline(self, prompt=''): - raise NotImplementedError - -# -# Callback interface -# - def process_keyevent(self, keyinfo): - return self.mode.process_keyevent(keyinfo) - - def readline_setup(self, prompt=""): - return self.mode.readline_setup(prompt) - - def keyboard_poll(self): - return self.mode._readline_from_keyboard_poll() - - def callback_handler_install(self, prompt, callback): - '''bool readline_callback_handler_install ( string prompt, callback callback) - Initializes the readline callback interface and terminal, prints the prompt and returns immediately - ''' - self.callback = callback - self.readline_setup(prompt) - - def callback_handler_remove(self): - '''Removes a previously installed callback handler and restores terminal settings''' - self.callback = None - - def callback_read_char(self): - '''Reads a character and informs the readline callback interface when a line is received''' - if self.keyboard_poll(): - line = self.get_line_buffer() + '\n' - # however there is another newline added by - # self.mode.readline_setup(prompt) which is called by callback_handler_install - # this differs from GNU readline - self.add_history(self.mode.l_buffer) - # TADA: - self.callback(line) - - def read_inputrc(self, #in 2.4 we cannot call expanduser with unicode string - inputrcpath=os.path.expanduser("~/pyreadlineconfig.ini")): - modes = dict([(x.mode,x) for x in self.editingmodes]) - mode = self.editingmodes[0].mode - - def setmode(name): - self.mode = modes[name] - - def bind_key(key, name): - import types - if isinstance(name, collections.Callable): - modes[mode]._bind_key(key, types.MethodType(name, modes[mode])) - elif hasattr(modes[mode], name): - modes[mode]._bind_key(key, getattr(modes[mode], name)) - else: - print("Trying to bind unknown command '%s' to key '%s'"%(name, key)) - - def un_bind_key(key): - keyinfo = make_KeyPress_from_keydescr(key).tuple() - if keyinfo in modes[mode].key_dispatch: - del modes[mode].key_dispatch[keyinfo] - - def bind_exit_key(key): - modes[mode]._bind_exit_key(key) - - def un_bind_exit_key(key): - keyinfo = make_KeyPress_from_keydescr(key).tuple() - if keyinfo in modes[mode].exit_dispatch: - del modes[mode].exit_dispatch[keyinfo] - - def setkill_ring_to_clipboard(killring): - import pyreadline.lineeditor.lineobj - pyreadline.lineeditor.lineobj.kill_ring_to_clipboard = killring - - def sethistoryfilename(filename): - self.mode._history.history_filename=os.path.expanduser(filename) - - def setbellstyle(mode): - self.bell_style = mode - - def disable_readline(mode): - self.disable_readline = mode - - def sethistorylength(length): - self.mode._history.history_length = int(length) - - def allow_ctrl_c(mode): - log("allow_ctrl_c:%s:%s"%(self.allow_ctrl_c, mode)) - self.allow_ctrl_c = mode - - def setbellstyle(mode): - self.bell_style = mode - - def show_all_if_ambiguous(mode): - self.mode.show_all_if_ambiguous = mode - - def ctrl_c_tap_time_interval(mode): - self.ctrl_c_tap_time_interval = mode - - def mark_directories(mode): - self.mode.mark_directories = mode - - def completer_delims(delims): - self.mode.completer_delims = delims - - def complete_filesystem(delims): - self.mode.complete_filesystem = delims.lower() - - def enable_ipython_paste_for_paths(boolean): - self.mode.enable_ipython_paste_for_paths = boolean - - def debug_output(on, filename="pyreadline_debug_log.txt"): #Not implemented yet - if on in ["on", "on_nologfile"]: - self.debug=True - - if on == "on": - logger.start_file_log(filename) - logger.start_socket_log() - logger.log("STARTING LOG") - elif on == "on_nologfile": - logger.start_socket_log() - logger.log("STARTING LOG") - else: - logger.log("STOPING LOG") - logger.stop_file_log() - logger.stop_socket_log() - - _color_trtable={"black":0, "darkred":4, "darkgreen":2, - "darkyellow":6, "darkblue":1, "darkmagenta":5, - "darkcyan":3, "gray":7, "red":4+8, - "green":2+8, "yellow":6+8, "blue":1+8, - "magenta":5+8, "cyan":3+8, "white":7+8} - - def set_prompt_color(color): - self.prompt_color = self._color_trtable.get(color.lower(),7) - - def set_input_color(color): - self.command_color=self._color_trtable.get(color.lower(),7) - - loc = {"branch":release.branch, - "version":release.version, - "mode":mode, - "modes":modes, - "set_mode":setmode, - "bind_key":bind_key, - "disable_readline":disable_readline, - "bind_exit_key":bind_exit_key, - "un_bind_key":un_bind_key, - "un_bind_exit_key":un_bind_exit_key, - "bell_style":setbellstyle, - "mark_directories":mark_directories, - "show_all_if_ambiguous":show_all_if_ambiguous, - "completer_delims":completer_delims, - "complete_filesystem":complete_filesystem, - "debug_output":debug_output, - "history_filename":sethistoryfilename, - "history_length":sethistorylength, - "set_prompt_color":set_prompt_color, - "set_input_color":set_input_color, - "allow_ctrl_c":allow_ctrl_c, - "ctrl_c_tap_time_interval":ctrl_c_tap_time_interval, - "kill_ring_to_clipboard":setkill_ring_to_clipboard, - "enable_ipython_paste_for_paths":enable_ipython_paste_for_paths, - } - if os.path.isfile(inputrcpath): - try: - exec(compile(open(inputrcpath).read(), inputrcpath, 'exec'), loc, loc) - except Exception as x: - raise - import traceback - print("Error reading .pyinputrc", file=sys.stderr) - filepath,lineno=traceback.extract_tb(sys.exc_info()[2])[1][:2] - print("Line: %s in file %s"%(lineno, filepath), file=sys.stderr) - print(x, file=sys.stderr) - raise ReadlineError("Error reading .pyinputrc") - - - -class Readline(BaseReadline): - """Baseclass for readline based on a console - """ - def __init__(self): - BaseReadline.__init__(self) - self.console = console.Console() - self.selection_color = self.console.saveattr<<4 - self.command_color = None - self.prompt_color = None - self.size = self.console.size() - - # variables you can control with parse_and_bind - -# To export as readline interface - - -## Internal functions - - def _bell(self): - '''ring the bell if requested.''' - if self.bell_style == 'none': - pass - elif self.bell_style == 'visible': - raise NotImplementedError("Bellstyle visible is not implemented yet.") - elif self.bell_style == 'audible': - self.console.bell() - else: - raise ReadlineError("Bellstyle %s unknown."%self.bell_style) - - def _clear_after(self): - c = self.console - x, y = c.pos() - w, h = c.size() - c.rectangle((x, y, w+1, y+1)) - c.rectangle((0, y+1, w, min(y+3,h))) - - def _set_cursor(self): - c = self.console - xc, yc = self.prompt_end_pos - w, h = c.size() - xc += self.mode.l_buffer.visible_line_width() - while(xc >= w): - xc -= w - yc += 1 - c.pos(xc, yc) - - def _print_prompt(self): - c = self.console - x, y = c.pos() - - n = c.write_scrolling(self.prompt, self.prompt_color) - self.prompt_begin_pos = (x, y - n) - self.prompt_end_pos = c.pos() - self.size = c.size() - - def _update_prompt_pos(self, n): - if n != 0: - bx, by = self.prompt_begin_pos - ex, ey = self.prompt_end_pos - self.prompt_begin_pos = (bx, by - n) - self.prompt_end_pos = (ex, ey - n) - - def _update_line(self): - c = self.console - l_buffer = self.mode.l_buffer - c.cursor(0) #Hide cursor avoiding flicking - c.pos(*self.prompt_begin_pos) - self._print_prompt() - ltext = l_buffer.quoted_text() - if l_buffer.enable_selection and (l_buffer.selection_mark >= 0): - start = len(l_buffer[:l_buffer.selection_mark].quoted_text()) - stop = len(l_buffer[:l_buffer.point].quoted_text()) - if start > stop: - stop,start = start,stop - n = c.write_scrolling(ltext[:start], self.command_color) - n = c.write_scrolling(ltext[start:stop], self.selection_color) - n = c.write_scrolling(ltext[stop:], self.command_color) - else: - n = c.write_scrolling(ltext, self.command_color) - - x, y = c.pos() #Preserve one line for Asian IME(Input Method Editor) statusbar - w, h = c.size() - if (y >= h - 1) or (n > 0): - c.scroll_window(-1) - c.scroll((0, 0, w, h), 0, -1) - n += 1 - - self._update_prompt_pos(n) - if hasattr(c, "clear_to_end_of_window"): #Work around function for ironpython due - c.clear_to_end_of_window() #to System.Console's lack of FillFunction - else: - self._clear_after() - - #Show cursor, set size vi mode changes size in insert/overwrite mode - c.cursor(1, size=self.mode.cursor_size) - self._set_cursor() - - - def callback_read_char(self): - #Override base to get automatic newline - '''Reads a character and informs the readline callback interface when a line is received''' - if self.keyboard_poll(): - line = self.get_line_buffer() + '\n' - self.console.write("\r\n") - # however there is another newline added by - # self.mode.readline_setup(prompt) which is called by callback_handler_install - # this differs from GNU readline - self.add_history(self.mode.l_buffer) - # TADA: - self.callback(line) - - - def event_available(self): - return self.console.peek() or (len(self.paste_line_buffer) > 0) - - - def _readline_from_keyboard(self): - while 1: - if self._readline_from_keyboard_poll(): - break - - def _readline_from_keyboard_poll(self): - pastebuffer = self.mode.paste_line_buffer - if len(pastebuffer) > 0: - #paste first line in multiline paste buffer - self.l_buffer = lineobj.ReadLineTextBuffer(pastebuffer[0]) - self._update_line() - self.mode.paste_line_buffer = pastebuffer[1:] - return True - - c = self.console - def nop(e): - pass - try: - event = c.getkeypress() - except KeyboardInterrupt: - event = self.handle_ctrl_c() - try: - result = self.mode.process_keyevent(event.keyinfo) - except EOFError: - logger.stop_logging() - raise - self._update_line() - return result - - def readline_setup(self, prompt=''): - BaseReadline.readline_setup(self, prompt) - self._print_prompt() - self._update_line() - - def readline(self, prompt=''): - self.readline_setup(prompt) - self.ctrl_c_timeout = time.time() - self._readline_from_keyboard() - self.console.write('\r\n') - log('returning(%s)' % self.get_line_buffer()) - return self.get_line_buffer() + '\n' - - def handle_ctrl_c(self): - from pyreadline.keysyms.common import KeyPress - from pyreadline.console.event import Event - log("KBDIRQ") - event = Event(0,0) - event.char = "c" - event.keyinfo = KeyPress("c", shift=False, control=True, - meta=False, keyname=None) - if self.allow_ctrl_c: - now = time.time() - if (now - self.ctrl_c_timeout) < self.ctrl_c_tap_time_interval: - log("Raise KeyboardInterrupt") - raise KeyboardInterrupt - else: - self.ctrl_c_timeout = now - else: - raise KeyboardInterrupt - return event - +# -*- coding: utf-8 -*- +#***************************************************************************** +# Copyright (C) 2003-2006 Gary Bishop. +# Copyright (C) 2006 Jorgen Stenarson. +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** +u''' an attempt to implement readline for Python in Python using ctypes''' +import sys,os,re,time +from glob import glob + +import release + +import pyreadline.lineeditor.lineobj as lineobj +import pyreadline.lineeditor.history as history +import pyreadline.clipboard as clipboard +import pyreadline.console as console +import pyreadline.logger as logger + +from pyreadline.keysyms.common import make_KeyPress_from_keydescr +from pyreadline.unicode_helper import ensure_unicode +from logger import log +from modes import editingmodes +from error import ReadlineError, GetSetError + +in_ironpython = u"IronPython" in sys.version +if in_ironpython:#ironpython does not provide a prompt string to readline + import System + default_prompt = u">>> " +else: + default_prompt = u"" + import pdb + + +class MockConsoleError(Exception): + pass + +class MockConsole(object): + u"""object used during refactoring. Should raise errors when someone tries to use it. + """ + def __setattr__(self, x): + raise MockConsoleError(u"Should not try to get attributes from MockConsole") + + def cursor(self, size=50): + pass + +class BaseReadline(object): + def __init__(self): + self.allow_ctrl_c = False + self.ctrl_c_tap_time_interval = 0.3 + + self.debug = False + self.bell_style = u'none' + self.mark = -1 + self.console=MockConsole() + self.disable_readline = False + # this code needs to follow l_buffer and history creation + self.editingmodes = [mode(self) for mode in editingmodes] + for mode in self.editingmodes: + mode.init_editing_mode(None) + self.mode = self.editingmodes[0] + + self.read_inputrc() + log(u"\n".join(self.mode.rl_settings_to_string())) + + self.callback = None + + def parse_and_bind(self, string): + u'''Parse and execute single line of a readline init file.''' + try: + log(u'parse_and_bind("%s")' % string) + if string.startswith(u'#'): + return + if string.startswith(u'set'): + m = re.compile(ur'set\s+([-a-zA-Z0-9]+)\s+(.+)\s*$').match(string) + if m: + var_name = m.group(1) + val = m.group(2) + try: + setattr(self.mode, var_name.replace(u'-',u'_'), val) + except AttributeError: + log(u'unknown var="%s" val="%s"' % (var_name, val)) + else: + log(u'bad set "%s"' % string) + return + m = re.compile(ur'\s*(.+)\s*:\s*([-a-zA-Z]+)\s*$').match(string) + if m: + key = m.group(1) + func_name = m.group(2) + py_name = func_name.replace(u'-', u'_') + try: + func = getattr(self.mode, py_name) + except AttributeError: + log(u'unknown func key="%s" func="%s"' % (key, func_name)) + if self.debug: + print u'pyreadline parse_and_bind error, unknown function to bind: "%s"' % func_name + return + self.mode._bind_key(key, func) + except: + log(u'error') + raise + + def _set_prompt(self, prompt): + self.mode.prompt = prompt + + def _get_prompt(self): + return self.mode.prompt + + prompt = property(_get_prompt, _set_prompt) + + + def get_line_buffer(self): + u'''Return the current contents of the line buffer.''' + return self.mode.l_buffer.get_line_text() + + def insert_text(self, string): + u'''Insert text into the command line.''' + self.mode.insert_text(string) + + def read_init_file(self, filename=None): + u'''Parse a readline initialization file. The default filename is the last filename used.''' + log(u'read_init_file("%s")' % filename) + + #History file book keeping methods (non-bindable) + + def add_history(self, line): + u'''Append a line to the history buffer, as if it was the last line typed.''' + self.mode._history.add_history(line) + + def get_current_history_length(self ): + u'''Return the number of lines currently in the history. + (This is different from get_history_length(), which returns + the maximum number of lines that will be written to a history file.)''' + return self.mode._history.get_current_history_length() + + def get_history_length(self ): + u'''Return the desired length of the history file. + + Negative values imply unlimited history file size.''' + return self.mode._history.get_history_length() + + def set_history_length(self, length): + u'''Set the number of lines to save in the history file. + + write_history_file() uses this value to truncate the history file + when saving. Negative values imply unlimited history file size. + ''' + self.mode._history.set_history_length(length) + + def get_history_item(self, index): + u'''Return the current contents of history item at index.''' + return self.mode._history.get_history_item(index) + + def clear_history(self): + u'''Clear readline history''' + self.mode._history.clear_history() + + def read_history_file(self, filename=None): + u'''Load a readline history file. The default filename is ~/.history.''' + if filename is None: + filename = self.mode._history.history_filename + log(u"read_history_file from %s"%ensure_unicode(filename)) + self.mode._history.read_history_file(filename) + + def write_history_file(self, filename=None): + u'''Save a readline history file. The default filename is ~/.history.''' + self.mode._history.write_history_file(filename) + + #Completer functions + + def set_completer(self, function=None): + u'''Set or remove the completer function. + + If function is specified, it will be used as the new completer + function; if omitted or None, any completer function already + installed is removed. The completer function is called as + function(text, state), for state in 0, 1, 2, ..., until it returns a + non-string value. It should return the next possible completion + starting with text. + ''' + log(u'set_completer') + self.mode.completer = function + + def get_completer(self): + u'''Get the completer function. + ''' + log(u'get_completer') + return self.mode.completer + + def get_begidx(self): + u'''Get the beginning index of the readline tab-completion scope.''' + return self.mode.begidx + + def get_endidx(self): + u'''Get the ending index of the readline tab-completion scope.''' + return self.mode.endidx + + def set_completer_delims(self, string): + u'''Set the readline word delimiters for tab-completion.''' + self.mode.completer_delims = string + + def get_completer_delims(self): + u'''Get the readline word delimiters for tab-completion.''' + return self.mode.completer_delims.encode("ascii") + + def set_startup_hook(self, function=None): + u'''Set or remove the startup_hook function. + + If function is specified, it will be used as the new startup_hook + function; if omitted or None, any hook function already installed is + removed. The startup_hook function is called with no arguments just + before readline prints the first prompt. + + ''' + self.mode.startup_hook = function + + def set_pre_input_hook(self, function=None): + u'''Set or remove the pre_input_hook function. + + If function is specified, it will be used as the new pre_input_hook + function; if omitted or None, any hook function already installed is + removed. The pre_input_hook function is called with no arguments + after the first prompt has been printed and just before readline + starts reading input characters. + + ''' + self.mode.pre_input_hook = function + +#Functions that are not relevant for all Readlines but should at least have a NOP + + def _bell(self): + pass + +# +# Standard call, not available for all implementations +# + + def readline(self, prompt=u''): + raise NotImplementedError + +# +# Callback interface +# + def process_keyevent(self, keyinfo): + return self.mode.process_keyevent(keyinfo) + + def readline_setup(self, prompt=u""): + return self.mode.readline_setup(prompt) + + def keyboard_poll(self): + return self.mode._readline_from_keyboard_poll() + + def callback_handler_install(self, prompt, callback): + u'''bool readline_callback_handler_install ( string prompt, callback callback) + Initializes the readline callback interface and terminal, prints the prompt and returns immediately + ''' + self.callback = callback + self.readline_setup(prompt) + + def callback_handler_remove(self): + u'''Removes a previously installed callback handler and restores terminal settings''' + self.callback = None + + def callback_read_char(self): + u'''Reads a character and informs the readline callback interface when a line is received''' + if self.keyboard_poll(): + line = self.get_line_buffer() + u'\n' + # however there is another newline added by + # self.mode.readline_setup(prompt) which is called by callback_handler_install + # this differs from GNU readline + self.add_history(self.mode.l_buffer) + # TADA: + self.callback(line) + + def read_inputrc(self, #in 2.4 we cannot call expanduser with unicode string + inputrcpath=os.path.expanduser("~/pyreadlineconfig.ini")): + modes = dict([(x.mode,x) for x in self.editingmodes]) + mode = self.editingmodes[0].mode + + def setmode(name): + self.mode = modes[name] + + def bind_key(key, name): + import new + if callable(name): + modes[mode]._bind_key(key, new.instancemethod(name, modes[mode], modes[mode].__class__)) + elif hasattr(modes[mode], name): + modes[mode]._bind_key(key, getattr(modes[mode], name)) + else: + print u"Trying to bind unknown command '%s' to key '%s'"%(name, key) + + def un_bind_key(key): + keyinfo = make_KeyPress_from_keydescr(key).tuple() + if keyinfo in modes[mode].key_dispatch: + del modes[mode].key_dispatch[keyinfo] + + def bind_exit_key(key): + modes[mode]._bind_exit_key(key) + + def un_bind_exit_key(key): + keyinfo = make_KeyPress_from_keydescr(key).tuple() + if keyinfo in modes[mode].exit_dispatch: + del modes[mode].exit_dispatch[keyinfo] + + def setkill_ring_to_clipboard(killring): + import pyreadline.lineeditor.lineobj + pyreadline.lineeditor.lineobj.kill_ring_to_clipboard = killring + + def sethistoryfilename(filename): + self.mode._history.history_filename=os.path.expanduser(filename) + + def setbellstyle(mode): + self.bell_style = mode + + def disable_readline(mode): + self.disable_readline = mode + + def sethistorylength(length): + self.mode._history.history_length = int(length) + + def allow_ctrl_c(mode): + log(u"allow_ctrl_c:%s:%s"%(self.allow_ctrl_c, mode)) + self.allow_ctrl_c = mode + + def setbellstyle(mode): + self.bell_style = mode + + def show_all_if_ambiguous(mode): + self.mode.show_all_if_ambiguous = mode + + def ctrl_c_tap_time_interval(mode): + self.ctrl_c_tap_time_interval = mode + + def mark_directories(mode): + self.mode.mark_directories = mode + + def completer_delims(delims): + self.mode.completer_delims = delims + + def complete_filesystem(delims): + self.mode.complete_filesystem = delims.lower() + + def enable_ipython_paste_for_paths(boolean): + self.mode.enable_ipython_paste_for_paths = boolean + + def debug_output(on, filename=u"pyreadline_debug_log.txt"): #Not implemented yet + if on in [u"on", u"on_nologfile"]: + self.debug=True + + if on == "on": + logger.start_file_log(filename) + logger.start_socket_log() + logger.log(u"STARTING LOG") + elif on == u"on_nologfile": + logger.start_socket_log() + logger.log(u"STARTING LOG") + else: + logger.log(u"STOPING LOG") + logger.stop_file_log() + logger.stop_socket_log() + + _color_trtable={u"black":0, u"darkred":4, u"darkgreen":2, + u"darkyellow":6, u"darkblue":1, u"darkmagenta":5, + u"darkcyan":3, u"gray":7, u"red":4+8, + u"green":2+8, u"yellow":6+8, u"blue":1+8, + u"magenta":5+8, u"cyan":3+8, u"white":7+8} + + def set_prompt_color(color): + self.prompt_color = self._color_trtable.get(color.lower(),7) + + def set_input_color(color): + self.command_color=self._color_trtable.get(color.lower(),7) + + loc = {u"branch":release.branch, + u"version":release.version, + u"mode":mode, + u"modes":modes, + u"set_mode":setmode, + u"bind_key":bind_key, + u"disable_readline":disable_readline, + u"bind_exit_key":bind_exit_key, + u"un_bind_key":un_bind_key, + u"un_bind_exit_key":un_bind_exit_key, + u"bell_style":setbellstyle, + u"mark_directories":mark_directories, + u"show_all_if_ambiguous":show_all_if_ambiguous, + u"completer_delims":completer_delims, + u"complete_filesystem":complete_filesystem, + u"debug_output":debug_output, + u"history_filename":sethistoryfilename, + u"history_length":sethistorylength, + u"set_prompt_color":set_prompt_color, + u"set_input_color":set_input_color, + u"allow_ctrl_c":allow_ctrl_c, + u"ctrl_c_tap_time_interval":ctrl_c_tap_time_interval, + u"kill_ring_to_clipboard":setkill_ring_to_clipboard, + u"enable_ipython_paste_for_paths":enable_ipython_paste_for_paths, + } + if os.path.isfile(inputrcpath): + try: + execfile(inputrcpath, loc, loc) + except Exception,x: + raise + import traceback + print >>sys.stderr, u"Error reading .pyinputrc" + filepath,lineno=traceback.extract_tb(sys.exc_traceback)[1][:2] + print >>sys.stderr, u"Line: %s in file %s"%(lineno, filepath) + print >>sys.stderr, x + raise ReadlineError(u"Error reading .pyinputrc") + + + +class Readline(BaseReadline): + """Baseclass for readline based on a console + """ + def __init__(self): + BaseReadline.__init__(self) + self.console = console.Console() + self.selection_color = self.console.saveattr<<4 + self.command_color = None + self.prompt_color = None + self.size = self.console.size() + + # variables you can control with parse_and_bind + +# To export as readline interface + + +## Internal functions + + def _bell(self): + u'''ring the bell if requested.''' + if self.bell_style == u'none': + pass + elif self.bell_style == u'visible': + raise NotImplementedError(u"Bellstyle visible is not implemented yet.") + elif self.bell_style == u'audible': + self.console.bell() + else: + raise ReadlineError(u"Bellstyle %s unknown."%self.bell_style) + + def _clear_after(self): + c = self.console + x, y = c.pos() + w, h = c.size() + c.rectangle((x, y, w+1, y+1)) + c.rectangle((0, y+1, w, min(y+3,h))) + + def _set_cursor(self): + c = self.console + xc, yc = self.prompt_end_pos + w, h = c.size() + xc += self.mode.l_buffer.visible_line_width() + while(xc >= w): + xc -= w + yc += 1 + c.pos(xc, yc) + + def _print_prompt(self): + c = self.console + x, y = c.pos() + + n = c.write_scrolling(self.prompt, self.prompt_color) + self.prompt_begin_pos = (x, y - n) + self.prompt_end_pos = c.pos() + self.size = c.size() + + def _update_prompt_pos(self, n): + if n != 0: + bx, by = self.prompt_begin_pos + ex, ey = self.prompt_end_pos + self.prompt_begin_pos = (bx, by - n) + self.prompt_end_pos = (ex, ey - n) + + def _update_line(self): + c = self.console + l_buffer = self.mode.l_buffer + c.cursor(0) #Hide cursor avoiding flicking + c.pos(*self.prompt_begin_pos) + self._print_prompt() + ltext = l_buffer.quoted_text() + if l_buffer.enable_selection and (l_buffer.selection_mark >= 0): + start = len(l_buffer[:l_buffer.selection_mark].quoted_text()) + stop = len(l_buffer[:l_buffer.point].quoted_text()) + if start > stop: + stop,start = start,stop + n = c.write_scrolling(ltext[:start], self.command_color) + n = c.write_scrolling(ltext[start:stop], self.selection_color) + n = c.write_scrolling(ltext[stop:], self.command_color) + else: + n = c.write_scrolling(ltext, self.command_color) + + x, y = c.pos() #Preserve one line for Asian IME(Input Method Editor) statusbar + w, h = c.size() + if (y >= h - 1) or (n > 0): + c.scroll_window(-1) + c.scroll((0, 0, w, h), 0, -1) + n += 1 + + self._update_prompt_pos(n) + if hasattr(c, u"clear_to_end_of_window"): #Work around function for ironpython due + c.clear_to_end_of_window() #to System.Console's lack of FillFunction + else: + self._clear_after() + + #Show cursor, set size vi mode changes size in insert/overwrite mode + c.cursor(1, size=self.mode.cursor_size) + self._set_cursor() + + + def callback_read_char(self): + #Override base to get automatic newline + u'''Reads a character and informs the readline callback interface when a line is received''' + if self.keyboard_poll(): + line = self.get_line_buffer() + u'\n' + self.console.write(u"\r\n") + # however there is another newline added by + # self.mode.readline_setup(prompt) which is called by callback_handler_install + # this differs from GNU readline + self.add_history(self.mode.l_buffer) + # TADA: + self.callback(line) + + + def event_available(self): + return self.console.peek() or (len(self.paste_line_buffer) > 0) + + + def _readline_from_keyboard(self): + while 1: + if self._readline_from_keyboard_poll(): + break + + def _readline_from_keyboard_poll(self): + pastebuffer = self.mode.paste_line_buffer + if len(pastebuffer) > 0: + #paste first line in multiline paste buffer + self.l_buffer = lineobj.ReadLineTextBuffer(pastebuffer[0]) + self._update_line() + self.mode.paste_line_buffer = pastebuffer[1:] + return True + + c = self.console + def nop(e): + pass + try: + event = c.getkeypress() + except KeyboardInterrupt: + event = self.handle_ctrl_c() + try: + result = self.mode.process_keyevent(event.keyinfo) + except EOFError: + logger.stop_logging() + raise + self._update_line() + return result + + def readline_setup(self, prompt=u''): + BaseReadline.readline_setup(self, prompt) + self._print_prompt() + self._update_line() + + def readline(self, prompt=u''): + self.readline_setup(prompt) + self.ctrl_c_timeout = time.time() + self._readline_from_keyboard() + self.console.write(u'\r\n') + log(u'returning(%s)' % self.get_line_buffer()) + return self.get_line_buffer() + u'\n' + + def handle_ctrl_c(self): + from pyreadline.keysyms.common import KeyPress + from pyreadline.console.event import Event + log(u"KBDIRQ") + event = Event(0,0) + event.char = u"c" + event.keyinfo = KeyPress(u"c", shift=False, control=True, + meta=False, keyname=None) + if self.allow_ctrl_c: + now = time.time() + if (now - self.ctrl_c_timeout) < self.ctrl_c_tap_time_interval: + log(u"Raise KeyboardInterrupt") + raise KeyboardInterrupt + else: + self.ctrl_c_timeout = now + else: + raise KeyboardInterrupt + return event + diff --git a/pyreadline/test/common.py b/pyreadline/test/common.py index 071c6ac..cc24dd4 100644 --- a/pyreadline/test/common.py +++ b/pyreadline/test/common.py @@ -13,7 +13,7 @@ from pyreadline.keysyms.common import make_KeyPress_from_keydescr import unittest class MockReadline: def __init__ (self): - self.l_buffer=lineobj.ReadLineTextBuffer("") + self.l_buffer=lineobj.ReadLineTextBuffer(u"") self._history=history.LineHistory() def add_history (self, line): @@ -26,7 +26,7 @@ class MockReadline: pass def insert_text(self, string): - '''Insert text into the command line.''' + u'''Insert text into the command line.''' self.l_buffer.insert_text(string) @@ -52,20 +52,20 @@ class MockConsole: class Event: def __init__ (self, char): - if char=="escape": - self.char='\x1b' - elif char=="backspace": - self.char='\x08' - elif char=="tab": - self.char='\t' - elif char=="space": - self.char=' ' + if char==u"escape": + self.char=u'\x1b' + elif char==u"backspace": + self.char=u'\x08' + elif char==u"tab": + self.char=u'\t' + elif char==u"space": + self.char=u' ' else: self.char = char def keytext_to_keyinfo_and_event (keytext): keyinfo = keysyms.common.make_KeyPress_from_keydescr (keytext) - if len(keytext) == 3 and keytext[0] == '"' and keytext[2] == '"': + if len(keytext) == 3 and keytext[0] == u'"' and keytext[2] == u'"': event = Event (keytext[1]) else: event = Event (keyinfo.tuple() [3]) diff --git a/pyreadline/test/test_emacs.py b/pyreadline/test/test_emacs.py index 765691f..8554f18 100644 --- a/pyreadline/test/test_emacs.py +++ b/pyreadline/test/test_emacs.py @@ -9,7 +9,7 @@ import sys, unittest import pdb -sys.path.append ('../..') +sys.path.append (u'../..') from pyreadline.modes.emacs import * from pyreadline import keysyms from pyreadline.lineeditor import lineobj @@ -18,7 +18,7 @@ from common import * from pyreadline.logger import log import pyreadline.logger as logger logger.sock_silent=True -logger.show_event=["debug"] +logger.show_event=[u"debug"] #---------------------------------------------------------------------- @@ -31,7 +31,7 @@ class EmacsModeTest (EmacsMode): self.init_editing_mode (None) self.lst_completions = [] self.completer = self.mock_completer - self.completer_delims = ' u' + self.completer_delims = u' u' self.tabstop = 4 self.mark_directories=False self.show_all_if_ambiguous=False @@ -52,15 +52,15 @@ class EmacsModeTest (EmacsMode): line_cursor = property (get_line_cursor) def input (self, keytext): - if keytext[0:1] == '"' and keytext[-1:] == '"': - lst_key = ['"%s"' % c for c in keytext[1:-1]] + if keytext[0:1] == u'"' and keytext[-1:] == u'"': + lst_key = [u'"%s"' % c for c in keytext[1:-1]] else: lst_key = [keytext] for key in lst_key: keyinfo, event = keytext_to_keyinfo_and_event (key) dispatch_func = self.key_dispatch.get(keyinfo.tuple(),self.self_insert) self.tested_commands[dispatch_func.__name__]=dispatch_func - log("keydisp: %s %s"%( key,dispatch_func.__name__)) + log(u"keydisp: %s %s"%( key,dispatch_func.__name__)) dispatch_func (event) self.previous_func=dispatch_func @@ -78,141 +78,141 @@ class EmacsModeTest (EmacsMode): class TestsKeyinfo (unittest.TestCase): def test_keyinfo (self): - keyinfo, event = keytext_to_keyinfo_and_event ('"d"') - self.assertEqual ('d', event.char) - keyinfo, event = keytext_to_keyinfo_and_event ('"D"') - self.assertEqual ('D', event.char) - keyinfo, event = keytext_to_keyinfo_and_event ('"$"') - self.assertEqual ('$', event.char) - keyinfo, event = keytext_to_keyinfo_and_event ('Escape') - self.assertEqual ('\x1b', event.char) + keyinfo, event = keytext_to_keyinfo_and_event (u'"d"') + self.assertEqual (u'd', event.char) + keyinfo, event = keytext_to_keyinfo_and_event (u'"D"') + self.assertEqual (u'D', event.char) + keyinfo, event = keytext_to_keyinfo_and_event (u'"$"') + self.assertEqual (u'$', event.char) + keyinfo, event = keytext_to_keyinfo_and_event (u'Escape') + self.assertEqual (u'\x1b', event.char) class TestsMovement (unittest.TestCase): def test_cursor (self): r = EmacsModeTest () - self.assertEqual (r.line, '') - r.input('"First Second Third"') - self.assertEqual (r.line, 'First Second Third') + self.assertEqual (r.line, u'') + r.input(u'"First Second Third"') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input('Control-a') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Control-a') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 0) - r.input('Control-e') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Control-e') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input('Home') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Home') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 0) - r.input('Right') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Right') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 1) - r.input('Ctrl-f') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Ctrl-f') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 2) - r.input('Ctrl-Right') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Ctrl-Right') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 5) - r.input('Ctrl-Right') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Ctrl-Right') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 12) - r.input('Ctrl-Right') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Ctrl-Right') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input('Ctrl-Right') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Ctrl-Right') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input('Ctrl-Left') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Ctrl-Left') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 13) - r.input('Ctrl-Left') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Ctrl-Left') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 6) - r.input('Ctrl-Left') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Ctrl-Left') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 0) - r.input('Ctrl-Left') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Ctrl-Left') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 0) class TestsDelete (unittest.TestCase): def test_delete (self): r = EmacsModeTest () - self.assertEqual (r.line, '') - r.input('"First Second Third"') - self.assertEqual (r.line, 'First Second Third') + self.assertEqual (r.line, u'') + r.input(u'"First Second Third"') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input('Delete') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Delete') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input('Left') - r.input('Left') - r.input('Delete') - self.assertEqual (r.line, 'First Second Thid') + r.input(u'Left') + r.input(u'Left') + r.input(u'Delete') + self.assertEqual (r.line, u'First Second Thid') self.assertEqual (r.line_cursor, 16) - r.input('Delete') - self.assertEqual (r.line, 'First Second Thi') + r.input(u'Delete') + self.assertEqual (r.line, u'First Second Thi') self.assertEqual (r.line_cursor, 16) - r.input('Backspace') - self.assertEqual (r.line, 'First Second Th') + r.input(u'Backspace') + self.assertEqual (r.line, u'First Second Th') self.assertEqual (r.line_cursor, 15) - r.input('Home') - r.input('Right') - r.input('Right') - self.assertEqual (r.line, 'First Second Th') + r.input(u'Home') + r.input(u'Right') + r.input(u'Right') + self.assertEqual (r.line, u'First Second Th') self.assertEqual (r.line_cursor, 2) - r.input('Backspace') - self.assertEqual (r.line, 'Frst Second Th') + r.input(u'Backspace') + self.assertEqual (r.line, u'Frst Second Th') self.assertEqual (r.line_cursor, 1) - r.input('Backspace') - self.assertEqual (r.line, 'rst Second Th') + r.input(u'Backspace') + self.assertEqual (r.line, u'rst Second Th') self.assertEqual (r.line_cursor, 0) - r.input('Backspace') - self.assertEqual (r.line, 'rst Second Th') + r.input(u'Backspace') + self.assertEqual (r.line, u'rst Second Th') self.assertEqual (r.line_cursor, 0) - r.input('Escape') - self.assertEqual (r.line, '') + r.input(u'Escape') + self.assertEqual (r.line, u'') self.assertEqual (r.line_cursor, 0) def test_delete_word (self): r = EmacsModeTest () - self.assertEqual (r.line, '') - r.input('"First Second Third"') - self.assertEqual (r.line, 'First Second Third') + self.assertEqual (r.line, u'') + r.input(u'"First Second Third"') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 18) - r.input('Control-Backspace') - self.assertEqual (r.line, 'First Second ') + r.input(u'Control-Backspace') + self.assertEqual (r.line, u'First Second ') self.assertEqual (r.line_cursor, 13) - r.input('Backspace') - r.input('Left') - r.input('Left') - self.assertEqual (r.line, 'First Second') + r.input(u'Backspace') + r.input(u'Left') + r.input(u'Left') + self.assertEqual (r.line, u'First Second') self.assertEqual (r.line_cursor, 10) - r.input('Control-Backspace') - self.assertEqual (r.line, 'First nd') + r.input(u'Control-Backspace') + self.assertEqual (r.line, u'First nd') self.assertEqual (r.line_cursor, 6) - r.input('Escape') - self.assertEqual (r.line, '') + r.input(u'Escape') + self.assertEqual (r.line, u'') self.assertEqual (r.line_cursor, 0) - r.input('"First Second Third"') - r.input('Home') - r.input('Right') - r.input('Right') - r.input('Control-Delete') - self.assertEqual (r.line, 'FiSecond Third') + r.input(u'"First Second Third"') + r.input(u'Home') + r.input(u'Right') + r.input(u'Right') + r.input(u'Control-Delete') + self.assertEqual (r.line, u'FiSecond Third') self.assertEqual (r.line_cursor, 2) - r.input('Control-Delete') - self.assertEqual (r.line, 'FiThird') + r.input(u'Control-Delete') + self.assertEqual (r.line, u'FiThird') self.assertEqual (r.line_cursor, 2) - r.input('Control-Delete') - self.assertEqual (r.line, 'Fi') + r.input(u'Control-Delete') + self.assertEqual (r.line, u'Fi') self.assertEqual (r.line_cursor, 2) - r.input('Control-Delete') - self.assertEqual (r.line, 'Fi') + r.input(u'Control-Delete') + self.assertEqual (r.line, u'Fi') self.assertEqual (r.line_cursor, 2) - r.input('Escape') - self.assertEqual (r.line, '') + r.input(u'Escape') + self.assertEqual (r.line, u'') self.assertEqual (r.line_cursor, 0) @@ -220,30 +220,30 @@ class TestsDelete (unittest.TestCase): class TestsSelectionMovement (unittest.TestCase): def test_cursor (self): r = EmacsModeTest () - self.assertEqual (r.line, '') - r.input('"First Second Third"') - self.assertEqual (r.line, 'First Second Third') + self.assertEqual (r.line, u'') + r.input(u'"First Second Third"') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 18) self.assertEqual (r.l_buffer.selection_mark, -1) - r.input('Home') - r.input('Shift-Right') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Home') + r.input(u'Shift-Right') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 1) self.assertEqual (r.l_buffer.selection_mark, 0) - r.input('Shift-Control-Right') - self.assertEqual (r.line, 'First Second Third') + r.input(u'Shift-Control-Right') + self.assertEqual (r.line, u'First Second Third') self.assertEqual (r.line_cursor, 5) self.assertEqual (r.l_buffer.selection_mark, 0) - r.input('"a"') - self.assertEqual (r.line, 'a Second Third') + r.input(u'"a"') + self.assertEqual (r.line, u'a Second Third') self.assertEqual (r.line_cursor, 1) self.assertEqual (r.l_buffer.selection_mark, -1) - r.input('Shift-End') - self.assertEqual (r.line, 'a Second Third') + r.input(u'Shift-End') + self.assertEqual (r.line, u'a Second Third') self.assertEqual (r.line_cursor, 14) self.assertEqual (r.l_buffer.selection_mark, 1) - r.input('Delete') - self.assertEqual (r.line, 'a') + r.input(u'Delete') + self.assertEqual (r.line, u'a') self.assertEqual (r.line_cursor, 1) self.assertEqual (r.l_buffer.selection_mark, -1) @@ -252,94 +252,94 @@ class TestsSelectionMovement (unittest.TestCase): class TestsHistory (unittest.TestCase): def test_history_1 (self): r = EmacsModeTest () - r.add_history ('aa') - r.add_history ('bbb') - self.assertEqual (r.line, '') - r.input ('Up') - self.assertEqual (r.line, 'bbb') + r.add_history (u'aa') + r.add_history (u'bbb') + self.assertEqual (r.line, u'') + r.input (u'Up') + self.assertEqual (r.line, u'bbb') self.assertEqual (r.line_cursor, 3) - r.input ('Up') - self.assertEqual (r.line, 'aa') + r.input (u'Up') + self.assertEqual (r.line, u'aa') self.assertEqual (r.line_cursor, 2) - r.input ('Up') - self.assertEqual (r.line, 'aa') + r.input (u'Up') + self.assertEqual (r.line, u'aa') self.assertEqual (r.line_cursor, 2) - r.input ('Down') - self.assertEqual (r.line, 'bbb') + r.input (u'Down') + self.assertEqual (r.line, u'bbb') self.assertEqual (r.line_cursor, 3) - r.input ('Down') - self.assertEqual (r.line, '') + r.input (u'Down') + self.assertEqual (r.line, u'') self.assertEqual (r.line_cursor, 0) def test_history_2 (self): r = EmacsModeTest () - r.add_history ('aaaa') - r.add_history ('aaba') - r.add_history ('aaca') - r.add_history ('akca') - r.add_history ('bbb') - r.add_history ('ako') + r.add_history (u'aaaa') + r.add_history (u'aaba') + r.add_history (u'aaca') + r.add_history (u'akca') + r.add_history (u'bbb') + r.add_history (u'ako') self.assert_line(r,'',0) - r.input ('"a"') - r.input ('Up') + r.input (u'"a"') + r.input (u'Up') self.assert_line(r,'ako',1) - r.input ('Up') + r.input (u'Up') self.assert_line(r,'akca',1) - r.input ('Up') + r.input (u'Up') self.assert_line(r,'aaca',1) - r.input ('Up') + r.input (u'Up') self.assert_line(r,'aaba',1) - r.input ('Up') + r.input (u'Up') self.assert_line(r,'aaaa',1) - r.input ('Right') + r.input (u'Right') self.assert_line(r,'aaaa',2) - r.input ('Down') + r.input (u'Down') self.assert_line(r,'aaba',2) - r.input ('Down') + r.input (u'Down') self.assert_line(r,'aaca',2) - r.input ('Down') + r.input (u'Down') self.assert_line(r,'aaca',2) - r.input ('Left') - r.input ('Left') - r.input ('Down') - r.input ('Down') + r.input (u'Left') + r.input (u'Left') + r.input (u'Down') + r.input (u'Down') self.assert_line(r,'bbb',3) - r.input ('Left') + r.input (u'Left') self.assert_line(r,'bbb',2) - r.input ('Down') + r.input (u'Down') self.assert_line(r,'bbb',2) - r.input ('Up') + r.input (u'Up') self.assert_line(r,'bbb',2) def test_history_3 (self): r = EmacsModeTest () - r.add_history ('aaaa') - r.add_history ('aaba') - r.add_history ('aaca') - r.add_history ('akca') - r.add_history ('bbb') - r.add_history ('ako') + r.add_history (u'aaaa') + r.add_history (u'aaba') + r.add_history (u'aaca') + r.add_history (u'akca') + r.add_history (u'bbb') + r.add_history (u'ako') self.assert_line(r,'',0) - r.input ('') - r.input ('Up') + r.input (u'') + r.input (u'Up') self.assert_line(r,'ako',3) - r.input ('Down') + r.input (u'Down') self.assert_line(r,'',0) - r.input ('Up') + r.input (u'Up') self.assert_line(r,'ako',3) def test_history_3 (self): r = EmacsModeTest () - r.add_history ('aaaa') - r.add_history ('aaba') - r.add_history ('aaca') - r.add_history ('akca') - r.add_history ('bbb') - r.add_history ('ako') + r.add_history (u'aaaa') + r.add_history (u'aaba') + r.add_history (u'aaca') + r.add_history (u'akca') + r.add_history (u'bbb') + r.add_history (u'ako') self.assert_line(r,'',0) - r.input ('k') - r.input ('Up') + r.input (u'k') + r.input (u'Up') self.assert_line(r,'k',1) def test_complete (self): @@ -354,22 +354,22 @@ class TestsHistory (unittest.TestCase): completerobj._callable_postfix = _nop r.completer = completerobj.complete r._bind_key("tab", r.complete) - r.input('"exi(ksdjksjd)"') - r.input('Control-a') - r.input('Right') - r.input('Right') - r.input('Right') - r.input('Tab') - self.assert_line(r, "exit(ksdjksjd)", 4) + r.input(u'"exi(ksdjksjd)"') + r.input(u'Control-a') + r.input(u'Right') + r.input(u'Right') + r.input(u'Right') + r.input(u'Tab') + self.assert_line(r, u"exit(ksdjksjd)", 4) - r.input('Escape') - r.input('"exi"') - r.input('Control-a') - r.input('Right') - r.input('Right') - r.input('Right') - r.input('Tab') - self.assert_line(r, "exit", 4) + r.input(u'Escape') + r.input(u'"exi"') + r.input(u'Control-a') + r.input(u'Right') + r.input(u'Right') + r.input(u'Right') + r.input(u'Tab') + self.assert_line(r, u"exit", 4) @@ -382,19 +382,19 @@ class TestsHistory (unittest.TestCase): #---------------------------------------------------------------------- -if __name__ == '__main__': +if __name__ == u'__main__': Tester() - tested=list(EmacsModeTest.tested_commands.keys()) + tested=EmacsModeTest.tested_commands.keys() tested.sort() # print " Tested functions ".center(60,"-") # print "\n".join(tested) # print - all_funcs=dict([(x.__name__,x) for x in list(EmacsModeTest().key_dispatch.values())]) - all_funcs=list(all_funcs.keys()) + all_funcs=dict([(x.__name__,x) for x in EmacsModeTest().key_dispatch.values()]) + all_funcs=all_funcs.keys() not_tested=[x for x in all_funcs if x not in tested] not_tested.sort() - print(" Not tested functions ".center(60,"-")) - print("\n".join(not_tested)) + print " Not tested functions ".center(60,"-") + print "\n".join(not_tested) diff --git a/pyreadline/test/test_history.py b/pyreadline/test/test_history.py index 14bde84..d2c97f0 100644 --- a/pyreadline/test/test_history.py +++ b/pyreadline/test/test_history.py @@ -2,7 +2,7 @@ # Copyright (C) 2007 Jörgen Stenarson. <> import sys, unittest -sys.path.append ('../..') +sys.path.append (u'../..') #from pyreadline.modes.vi import * #from pyreadline import keysyms from pyreadline.lineeditor import lineobj @@ -19,76 +19,76 @@ from pyreadline.logger import log RL=lineobj.ReadLineTextBuffer class Test_linepos (unittest.TestCase): - t="test text" + t=u"test text" def init_test(self): history._ignore_leading_spaces=False self.q=q=LineHistory() - for x in ["aaaa","aaba","aaca","akca","bbb","ako"]: + for x in [u"aaaa",u"aaba",u"aaca",u"akca",u"bbb",u"ako"]: q.add_history(RL(x)) def test_previous_history (self): self.init_test() hist=self.q assert hist.history_cursor==6 - l=RL("") + l=RL(u"") hist.previous_history(l) - assert l.get_line_text()=="ako" + assert l.get_line_text()==u"ako" hist.previous_history(l) - assert l.get_line_text()=="bbb" + assert l.get_line_text()==u"bbb" hist.previous_history(l) - assert l.get_line_text()=="akca" + assert l.get_line_text()==u"akca" hist.previous_history(l) - assert l.get_line_text()=="aaca" + assert l.get_line_text()==u"aaca" hist.previous_history(l) - assert l.get_line_text()=="aaba" + assert l.get_line_text()==u"aaba" hist.previous_history(l) - assert l.get_line_text()=="aaaa" + assert l.get_line_text()==u"aaaa" hist.previous_history(l) - assert l.get_line_text()=="aaaa" + assert l.get_line_text()==u"aaaa" def test_next_history (self): self.init_test() hist=self.q hist.beginning_of_history() assert hist.history_cursor==0 - l=RL("") + l=RL(u"") hist.next_history(l) - assert l.get_line_text()=="aaba" + assert l.get_line_text()==u"aaba" hist.next_history(l) - assert l.get_line_text()=="aaca" + assert l.get_line_text()==u"aaca" hist.next_history(l) - assert l.get_line_text()=="akca" + assert l.get_line_text()==u"akca" hist.next_history(l) - assert l.get_line_text()=="bbb" + assert l.get_line_text()==u"bbb" hist.next_history(l) - assert l.get_line_text()=="ako" + assert l.get_line_text()==u"ako" hist.next_history(l) - assert l.get_line_text()=="ako" + assert l.get_line_text()==u"ako" def init_test2(self): self.q=q=LineHistory() - for x in ["aaaa","aaba","aaca","akca","bbb","ako"]: + for x in [u"aaaa",u"aaba",u"aaca",u"akca",u"bbb",u"ako"]: q.add_history(RL(x)) def test_history_search_backward (self): history._ignore_leading_spaces=False q=LineHistory() - for x in ["aaaa","aaba","aaca"," aacax","akca","bbb","ako"]: + for x in [u"aaaa",u"aaba",u"aaca",u" aacax",u"akca",u"bbb",u"ako"]: q.add_history(RL(x)) - a=RL("aa",point=2) - for x in ["aaca","aaba","aaaa","aaaa"]: + a=RL(u"aa",point=2) + for x in [u"aaca",u"aaba",u"aaaa",u"aaaa"]: res=q.history_search_backward(a) assert res.get_line_text()==x def test_history_search_forward (self): history._ignore_leading_spaces=False q=LineHistory() - for x in ["aaaa","aaba","aaca"," aacax","akca","bbb","ako"]: + for x in [u"aaaa",u"aaba",u"aaca",u" aacax",u"akca",u"bbb",u"ako"]: q.add_history(RL(x)) q.beginning_of_history() - a=RL("aa",point=2) - for x in ["aaba","aaca","aaca"]: + a=RL(u"aa",point=2) + for x in [u"aaba",u"aaca",u"aaca"]: res=q.history_search_forward(a) assert res.get_line_text()==x @@ -98,7 +98,7 @@ class Test_linepos (unittest.TestCase): #---------------------------------------------------------------------- -if __name__ == '__main__': +if __name__ == u'__main__': unittest.main() - l=lineobj.ReadLineTextBuffer("First Second Third") \ No newline at end of file + l=lineobj.ReadLineTextBuffer(u"First Second Third") \ No newline at end of file diff --git a/pyreadline/test/test_lineeditor.py b/pyreadline/test/test_lineeditor.py index 25c9f82..3b1c9a5 100644 --- a/pyreadline/test/test_lineeditor.py +++ b/pyreadline/test/test_lineeditor.py @@ -1,7 +1,7 @@ # Copyright (C) 2006 Michael Graz. import sys, unittest -sys.path.append ('../..') +sys.path.append (u'../..') #from pyreadline.modes.vi import * #from pyreadline import keysyms from pyreadline.lineeditor import lineobj @@ -13,14 +13,14 @@ from pyreadline.lineeditor import lineobj class Test_copy (unittest.TestCase): def test_copy1 (self): - l=lineobj.ReadLineTextBuffer("first second") + l=lineobj.ReadLineTextBuffer(u"first second") q=l.copy() self.assertEqual(q.get_line_text(),l.get_line_text()) self.assertEqual(q.point,l.point) self.assertEqual(q.mark,l.mark) def test_copy2 (self): - l=lineobj.ReadLineTextBuffer("first second",point=5) + l=lineobj.ReadLineTextBuffer(u"first second",point=5) q=l.copy() self.assertEqual(q.get_line_text(),l.get_line_text()) self.assertEqual(q.point,l.point) @@ -79,17 +79,17 @@ class Test_movement (unittest.TestCase): tests=[ # u"First" (cmd, - "First", - "# u", - " # u"), + u"First", + u"# u", + u" # u"), (cmd, - "First", - " # u", - " #"), + u"First", + u" # u", + u" #"), (cmd, - "First", - " #", - " #"), + u"First", + u" #", + u" #"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -101,17 +101,17 @@ class Test_movement (unittest.TestCase): tests=[ # u"First" (cmd, - "First", - " #", - " # u"), + u"First", + u" #", + u" # u"), (cmd, - "First", - " # u", - "# u"), + u"First", + u" # u", + u"# u"), (cmd, - "First", - "# u", - "# u"), + u"First", + u"# u", + u"# u"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -125,21 +125,21 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - "First Second Third", - " #", - " # u"), + u"First Second Third", + u" #", + u" # u"), (cmd, - "First Second Third", - " # u", - " # u"), + u"First Second Third", + u" # u", + u" # u"), (cmd, - "First Second Third", - " # u", - "# u"), + u"First Second Third", + u" # u", + u"# u"), (cmd, - "First Second Third", - "# u", - "# u"), + u"First Second Third", + u"# u", + u"# u"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -151,21 +151,21 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - "First Second Third", - "# u", - " # u"), + u"First Second Third", + u"# u", + u" # u"), (cmd, - "First Second Third", - " # u", - " # u"), + u"First Second Third", + u" # u", + u" # u"), (cmd, - "First Second Third", - " # u", - " # u"), + u"First Second Third", + u" # u", + u" # u"), (cmd, - "First Second Third", - " # u", - " #"), + u"First Second Third", + u" # u", + u" #"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -177,21 +177,21 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - "First Second Third", - "# u", - " # u"), + u"First Second Third", + u"# u", + u" # u"), (cmd, - "First Second Third", - " # u", - " # u"), + u"First Second Third", + u" # u", + u" # u"), (cmd, - "First Second Third", - " # u", - " # u"), + u"First Second Third", + u" # u", + u" # u"), (cmd, - "First Second Third", - " # u", - " #"), + u"First Second Third", + u" # u", + u" #"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -203,21 +203,21 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - "First Second Third", - " #", - " # u"), + u"First Second Third", + u" #", + u" # u"), (cmd, - "First Second Third", - " # u", - " # u"), + u"First Second Third", + u" # u", + u" # u"), (cmd, - "First Second Third", - " # u", - "# u"), + u"First Second Third", + u" # u", + u"# u"), (cmd, - "First Second Third", - "# u", - "# u"), + u"First Second Third", + u"# u", + u"# u"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -229,17 +229,17 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - "First Second Third", - "# u", - " # u"), + u"First Second Third", + u"# u", + u" # u"), (cmd, - "First Second Third", - " # u", - " # u"), + u"First Second Third", + u" # u", + u" # u"), (cmd, - "First Second Third", - " # u", - " #"), + u"First Second Third", + u" # u", + u" #"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -251,14 +251,14 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - "First Second Third", - " # u"), + u"First Second Third", + u" # u"), (cmd, - "First Second Third", - " # u"), + u"First Second Third", + u" # u"), (cmd, - "First Second Third", - " #"), + u"First Second Third", + u" #"), ] for cmd,text,init_point in tests: @@ -271,17 +271,17 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - "First Second Third", - "# u", - "# u"), + u"First Second Third", + u"# u", + u"# u"), (cmd, - "First Second Third", - " # u", - "# u"), + u"First Second Third", + u" # u", + u"# u"), (cmd, - "First Second Third", - " # u", - " # u"), + u"First Second Third", + u" # u", + u" # u"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -293,14 +293,14 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - "First Second Third", - " # u"), + u"First Second Third", + u" # u"), (cmd, - "First Second Third", - " # u"), + u"First Second Third", + u" # u"), (cmd, - "First Second Third", - " #"), + u"First Second Third", + u" #"), ] for cmd,text,init_point in tests: @@ -313,17 +313,17 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - "First Second Third", - "# u", - "# u"), + u"First Second Third", + u"# u", + u"# u"), (cmd, - "First Second Third", - " # u", - "# u"), + u"First Second Third", + u" # u", + u"# u"), (cmd, - "First Second Third", - " #", - "# u"), + u"First Second Third", + u" #", + u"# u"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -335,17 +335,17 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - "First Second Third", - "# u", - " #"), + u"First Second Third", + u"# u", + u" #"), (cmd, - "First Second Third", - " # u", - " #"), + u"First Second Third", + u" # u", + u" #"), (cmd, - "First Second Third", - " #", - " #"), + u"First Second Third", + u" #", + u" #"), ] for cmd,text,init_point,expected_point in tests: l=lineobj.ReadLineTextBuffer(text,get_point_pos(init_point)) @@ -357,13 +357,13 @@ class Test_movement (unittest.TestCase): tests=[ # u"First Second Third" (cmd, - "First Second Third", + u"First Second Third", 0), (cmd, - "First Second Third", + u"First Second Third", 12), (cmd, - "First Second Third", + u"First Second Third", 18), ] for cmd,text,p in tests: @@ -375,16 +375,16 @@ class Test_movement (unittest.TestCase): # utility functions def get_point_pos(pstr): - return pstr.index("#") + return pstr.index(u"#") def get_mark_pos(mstr): try: - return mstr.index("#") + return mstr.index(u"#") except ValueError: return -1 #---------------------------------------------------------------------- -if __name__ == '__main__': +if __name__ == u'__main__': unittest.main() - l=lineobj.ReadLineTextBuffer("First Second Third") + l=lineobj.ReadLineTextBuffer(u"First Second Third") diff --git a/pyreadline/test/test_vi.py b/pyreadline/test/test_vi.py index 32d14e6..8b5c904 100644 --- a/pyreadline/test/test_vi.py +++ b/pyreadline/test/test_vi.py @@ -7,7 +7,7 @@ #***************************************************************************** import sys, unittest,pdb -sys.path.append ('../..') +sys.path.append (u'../..') from pyreadline.modes.vi import * from pyreadline import keysyms from pyreadline.lineeditor import lineobj @@ -27,7 +27,7 @@ class ViModeTest (ViMode): self.vi_set_insert_mode (True) self.lst_completions = [] self.completer = self.mock_completer - self.completer_delims = ' ' + self.completer_delims = u' ' self.tabstop = 4 def get_mock_console (self): @@ -46,8 +46,8 @@ class ViModeTest (ViMode): line_cursor = property (get_line_cursor) def input (self, keytext): - if keytext[0] == '"' and keytext[-1] == '"': - lst_key = ['"%s"' % c for c in keytext[1:-1]] + if keytext[0] == u'"' and keytext[-1] == u'"': + lst_key = [u'"%s"' % c for c in keytext[1:-1]] else: lst_key = [keytext] for key in lst_key: @@ -67,19 +67,19 @@ class ViModeTest (ViMode): class ViExternalEditorTest (ViExternalEditor): def __init__ (self, line): - import io - self.sio_write = io.StringIO () - self.sio_read = io.StringIO ('qwerty after') + import StringIO + self.sio_write = StringIO.StringIO () + self.sio_read = StringIO.StringIO (u'qwerty after') ViExternalEditor.__init__ (self, line) def get_tempfile (self): - return 'temp.py' + return u'temp.py' def get_editor (self): - return 'vim.exe' + return u'vim.exe' def file_open (self, filename, mode): - if mode == 'w': + if mode == u'w': return self.sio_write else: return self.sio_read @@ -95,1622 +95,1622 @@ class ViExternalEditorTest (ViExternalEditor): class Tests (unittest.TestCase): def test_keyinfo (self): - keyinfo, event = keytext_to_keyinfo_and_event ('"d"') - self.assertEqual ('d', event.char) - keyinfo, event = keytext_to_keyinfo_and_event ('"D"') - self.assertEqual ('D', event.char) - keyinfo, event = keytext_to_keyinfo_and_event ('"$"') - self.assertEqual ('$', event.char) - keyinfo, event = keytext_to_keyinfo_and_event ('Escape') - self.assertEqual ('\x1b', event.char) + keyinfo, event = keytext_to_keyinfo_and_event (u'"d"') + self.assertEqual (u'd', event.char) + keyinfo, event = keytext_to_keyinfo_and_event (u'"D"') + self.assertEqual (u'D', event.char) + keyinfo, event = keytext_to_keyinfo_and_event (u'"$"') + self.assertEqual (u'$', event.char) + keyinfo, event = keytext_to_keyinfo_and_event (u'Escape') + self.assertEqual (u'\x1b', event.char) def test_simple (self): r = ViModeTest () - r._set_line ('abc') + r._set_line (u'abc') self.assert_ (r.vi_is_insert_mode) - r.input ('"d"') + r.input (u'"d"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual ('abcd', r.line) - r.input ('Escape') + self.assertEqual (u'abcd', r.line) + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) - self.assertEqual ('abcd', r.line) - r.input ('"i"') + self.assertEqual (u'abcd', r.line) + r.input (u'"i"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual ('abcd', r.line) - r.input ('"x"') - self.assertEqual ('abcxd', r.line) - r.input ('"y"') - self.assertEqual ('abcxyd', r.line) + self.assertEqual (u'abcd', r.line) + r.input (u'"x"') + self.assertEqual (u'abcxd', r.line) + r.input (u'"y"') + self.assertEqual (u'abcxyd', r.line) def test_begin_and_end (self): r = ViModeTest () - r._set_line ('abc') + r._set_line (u'abc') self.assertEqual (3, r.line_cursor) - r.input ('Escape') + r.input (u'Escape') self.assertEqual (2, r.line_cursor) - r.input ('"0"') + r.input (u'"0"') self.assertEqual (0, r.line_cursor) - r.input ('"$"') + r.input (u'"$"') self.assertEqual (2, r.line_cursor) - r.input ('"^"') + r.input (u'"^"') self.assertEqual (0, r.line_cursor) def test_history_alpha (self): r = ViModeTest () - r.add_history ('abc') - r.add_history ('def') - r._set_line ('ghi') - r.input ('Escape') - r.input ('"k"') + r.add_history (u'abc') + r.add_history (u'def') + r._set_line (u'ghi') + r.input (u'Escape') + r.input (u'"k"') self.assertEqual (0, r.line_cursor) - self.assertEqual ('def', r.line) - r.input ('"k"') - self.assertEqual ('abc', r.line) + self.assertEqual (u'def', r.line) + r.input (u'"k"') + self.assertEqual (u'abc', r.line) self.assertEqual (0, r.console.bell_count) - r.input ('"k"') - self.assertEqual ('abc', r.line) + r.input (u'"k"') + self.assertEqual (u'abc', r.line) # TODO up history with no more -> error ? # self.assertEqual (1, r.console.bell_count) - r.input ('"j"') - self.assertEqual ('def', r.line) + r.input (u'"j"') + self.assertEqual (u'def', r.line) self.assertEqual (0, r.line_cursor) - r.input ('"j"') - self.assertEqual ('ghi', r.line) + r.input (u'"j"') + self.assertEqual (u'ghi', r.line) # TODO returning to original line loses cursor pos? # self.assertEqual (2, r.line_cursor) - r.input ('"j"') - self.assertEqual ('ghi', r.line) + r.input (u'"j"') + self.assertEqual (u'ghi', r.line) self.assertEqual (2, r.line_cursor) def test_history_arrow (self): r = ViModeTest () - r.add_history ('abc') - r.add_history ('def') - r.input ('"ghi"') + r.add_history (u'abc') + r.add_history (u'def') + r.input (u'"ghi"') self.assertEqual (3, r.line_cursor) - r.input ('Up') + r.input (u'Up') self.assertEqual (3, r.line_cursor) - self.assertEqual ('def', r.line) - r.input ('Up') + self.assertEqual (u'def', r.line) + r.input (u'Up') self.assertEqual (3, r.line_cursor) - self.assertEqual ('abc', r.line) + self.assertEqual (u'abc', r.line) self.assertEqual (0, r.console.bell_count) - r.input ('Up') - self.assertEqual ('abc', r.line) + r.input (u'Up') + self.assertEqual (u'abc', r.line) # TODO up history with no more -> error ? # self.assertEqual (1, r.console.bell_count) - r.input ('Down') - self.assertEqual ('def', r.line) + r.input (u'Down') + self.assertEqual (u'def', r.line) self.assertEqual (3, r.line_cursor) - r.input ('Down') - self.assertEqual ('ghi', r.line) + r.input (u'Down') + self.assertEqual (u'ghi', r.line) self.assertEqual (3, r.line_cursor) - r.input ('Down') - self.assertEqual ('ghi', r.line) + r.input (u'Down') + self.assertEqual (u'ghi', r.line) self.assertEqual (3, r.line_cursor) def test_history_arrow_after_undo (self): r = ViModeTest () - r.input ('"aaa"') - r.input ('Return') - r.input ('"bbb ccc"') - r.input ('Escape') - r.input ('"F D"') - self.assertEqual (r.line, 'bbb') - r.input ('"u"') - self.assertEqual (r.line, 'bbb ccc') - r.input ('Return') + r.input (u'"aaa"') + r.input (u'Return') + r.input (u'"bbb ccc"') + r.input (u'Escape') + r.input (u'"F D"') + self.assertEqual (r.line, u'bbb') + r.input (u'"u"') + self.assertEqual (r.line, u'bbb ccc') + r.input (u'Return') self.assertEqual (r.console.bell_count, 0) - r.input ('"ddd"') - r.input ('Down') - self.assertEqual (r.line, 'ddd') + r.input (u'"ddd"') + r.input (u'Down') + self.assertEqual (r.line, u'ddd') # TODO down history with no more -> error ? # self.assertEqual (r.console.bell_count, 1) def test_vi_is_word (self): - self.assert_ (vi_is_word ('a')) - self.assert_ (not vi_is_word (' u')) + self.assert_ (vi_is_word (u'a')) + self.assert_ (not vi_is_word (u' u')) def test_pos_word_short (self): - self.assertEqual (0, vi_pos_word_short ('')) - self.assertEqual (4, vi_pos_word_short ('abc def u')) - self.assertEqual (4, vi_pos_word_short ('abc def u', 2)) - self.assertEqual (4, vi_pos_word_short ('abc def u', 3)) - self.assertEqual (8, vi_pos_word_short ('abc def u', 4)) - self.assertEqual (3, vi_pos_word_short ('abc.def u')) - self.assertEqual (5, vi_pos_word_short ('abc..def u', 3)) - self.assertEqual (8, vi_pos_word_short ('ab cd ef gh', count=2)) - self.assertEqual (8, vi_pos_word_short ('ab cd ef gh', 1, 2)) - self.assertEqual (8, vi_pos_word_short ('ab cd ef gh', 3, 2)) - self.assertEqual (14, vi_pos_word_short ('ab cd ef gh', count=10)) + self.assertEqual (0, vi_pos_word_short (u'')) + self.assertEqual (4, vi_pos_word_short (u'abc def u')) + self.assertEqual (4, vi_pos_word_short (u'abc def u', 2)) + self.assertEqual (4, vi_pos_word_short (u'abc def u', 3)) + self.assertEqual (8, vi_pos_word_short (u'abc def u', 4)) + self.assertEqual (3, vi_pos_word_short (u'abc.def u')) + self.assertEqual (5, vi_pos_word_short (u'abc..def u', 3)) + self.assertEqual (8, vi_pos_word_short (u'ab cd ef gh', count=2)) + self.assertEqual (8, vi_pos_word_short (u'ab cd ef gh', 1, 2)) + self.assertEqual (8, vi_pos_word_short (u'ab cd ef gh', 3, 2)) + self.assertEqual (14, vi_pos_word_short (u'ab cd ef gh', count=10)) def test_pos_word_long (self): - self.assertEqual (0, vi_pos_word_long ('')) - self.assertEqual (4, vi_pos_word_long ('abc def u')) - self.assertEqual (4, vi_pos_word_long ('abc def u', 2)) - self.assertEqual (4, vi_pos_word_long ('abc def u', 3)) - self.assertEqual (8, vi_pos_word_long ('abc def u', 4)) - self.assertEqual (8, vi_pos_word_long ('abc.def u')) - self.assertEqual (9, vi_pos_word_long ('abc..def u', 3)) - self.assertEqual (10, vi_pos_word_long ('a.b c.d e.f g.h', count=2)) - self.assertEqual (10, vi_pos_word_long ('a.b c.d e.f g.h', 2, 2)) - self.assertEqual (10, vi_pos_word_long ('a.b c.d e.f g.h', 4, 2)) + self.assertEqual (0, vi_pos_word_long (u'')) + self.assertEqual (4, vi_pos_word_long (u'abc def u')) + self.assertEqual (4, vi_pos_word_long (u'abc def u', 2)) + self.assertEqual (4, vi_pos_word_long (u'abc def u', 3)) + self.assertEqual (8, vi_pos_word_long (u'abc def u', 4)) + self.assertEqual (8, vi_pos_word_long (u'abc.def u')) + self.assertEqual (9, vi_pos_word_long (u'abc..def u', 3)) + self.assertEqual (10, vi_pos_word_long (u'a.b c.d e.f g.h', count=2)) + self.assertEqual (10, vi_pos_word_long (u'a.b c.d e.f g.h', 2, 2)) + self.assertEqual (10, vi_pos_word_long (u'a.b c.d e.f g.h', 4, 2)) def test_pos_end_short (self): - self.assertEqual (0, vi_pos_end_short ('')) - self.assertEqual (2, vi_pos_end_short ('abc def u')) - self.assertEqual (6, vi_pos_end_short ('abc def u', 2)) - self.assertEqual (6, vi_pos_end_short ('abc def u', 3)) - self.assertEqual (6, vi_pos_end_short ('abc def u', 4)) - self.assertEqual (2, vi_pos_end_short ('abc.def u')) - self.assertEqual (7, vi_pos_end_short ('abc ... def u', 3)) - self.assertEqual (7, vi_pos_end_short ('abc ... def u', 5)) - self.assertEqual (12, vi_pos_end_short ('abc ... def u', 8)) - self.assertEqual (5, vi_pos_end_short ('ab cd ef gh', count=2)) - self.assertEqual (9, vi_pos_end_short ('ab cd ef gh', 1, 2)) - self.assertEqual (9, vi_pos_end_short ('ab cd ef gh', 3, 2)) + self.assertEqual (0, vi_pos_end_short (u'')) + self.assertEqual (2, vi_pos_end_short (u'abc def u')) + self.assertEqual (6, vi_pos_end_short (u'abc def u', 2)) + self.assertEqual (6, vi_pos_end_short (u'abc def u', 3)) + self.assertEqual (6, vi_pos_end_short (u'abc def u', 4)) + self.assertEqual (2, vi_pos_end_short (u'abc.def u')) + self.assertEqual (7, vi_pos_end_short (u'abc ... def u', 3)) + self.assertEqual (7, vi_pos_end_short (u'abc ... def u', 5)) + self.assertEqual (12, vi_pos_end_short (u'abc ... def u', 8)) + self.assertEqual (5, vi_pos_end_short (u'ab cd ef gh', count=2)) + self.assertEqual (9, vi_pos_end_short (u'ab cd ef gh', 1, 2)) + self.assertEqual (9, vi_pos_end_short (u'ab cd ef gh', 3, 2)) def test_pos_end_long (self): - self.assertEqual (0, vi_pos_end_long ('')) - self.assertEqual (2, vi_pos_end_long ('abc def u')) - self.assertEqual (6, vi_pos_end_long ('abc def u', 2)) - self.assertEqual (6, vi_pos_end_long ('abc def u', 3)) - self.assertEqual (6, vi_pos_end_long ('abc def u', 4)) - self.assertEqual (6, vi_pos_end_long ('abc.def u')) - self.assertEqual (10, vi_pos_end_long (' abc...def u')) - self.assertEqual (10, vi_pos_end_long ('abc ...def u', 5)) - self.assertEqual (7, vi_pos_end_long ('a.b c.d e.f g.h', count=2)) - self.assertEqual (12, vi_pos_end_long ('a.b c.d e.f g.h', 2, 2)) - self.assertEqual (12, vi_pos_end_long ('a.b c.d e.f g.h', 4, 2)) + self.assertEqual (0, vi_pos_end_long (u'')) + self.assertEqual (2, vi_pos_end_long (u'abc def u')) + self.assertEqual (6, vi_pos_end_long (u'abc def u', 2)) + self.assertEqual (6, vi_pos_end_long (u'abc def u', 3)) + self.assertEqual (6, vi_pos_end_long (u'abc def u', 4)) + self.assertEqual (6, vi_pos_end_long (u'abc.def u')) + self.assertEqual (10, vi_pos_end_long (u' abc...def u')) + self.assertEqual (10, vi_pos_end_long (u'abc ...def u', 5)) + self.assertEqual (7, vi_pos_end_long (u'a.b c.d e.f g.h', count=2)) + self.assertEqual (12, vi_pos_end_long (u'a.b c.d e.f g.h', 2, 2)) + self.assertEqual (12, vi_pos_end_long (u'a.b c.d e.f g.h', 4, 2)) def test_pos_back_short (self): - self.assertEqual (0, vi_pos_back_short ('')) - self.assertEqual (4, vi_pos_back_short ('abc def', 6)) - self.assertEqual (4, vi_pos_back_short ('abc def', 5)) - self.assertEqual (0, vi_pos_back_short ('abc def', 4)) - self.assertEqual (0, vi_pos_back_short ('abc def', 3)) - self.assertEqual (8, vi_pos_back_short ('abc ...def u', 11)) - self.assertEqual (5, vi_pos_back_short ('abc ...def u', 8)) - self.assertEqual (0, vi_pos_back_short ('abc ...def u', 5)) - self.assertEqual (0, vi_pos_back_short ('abc ...def u')) - self.assertEqual (8, vi_pos_back_short ('abc def... u', 11)) - self.assertEqual (5, vi_pos_back_short ('abc def... u', 8)) - self.assertEqual (0, vi_pos_back_short ('abc def... u', 5)) - self.assertEqual (11, vi_pos_back_short ('abc def... ghi...', 16, count=2)) - self.assertEqual (0, vi_pos_back_short ('abc def... ghi...', 11, count=3)) + self.assertEqual (0, vi_pos_back_short (u'')) + self.assertEqual (4, vi_pos_back_short (u'abc def', 6)) + self.assertEqual (4, vi_pos_back_short (u'abc def', 5)) + self.assertEqual (0, vi_pos_back_short (u'abc def', 4)) + self.assertEqual (0, vi_pos_back_short (u'abc def', 3)) + self.assertEqual (8, vi_pos_back_short (u'abc ...def u', 11)) + self.assertEqual (5, vi_pos_back_short (u'abc ...def u', 8)) + self.assertEqual (0, vi_pos_back_short (u'abc ...def u', 5)) + self.assertEqual (0, vi_pos_back_short (u'abc ...def u')) + self.assertEqual (8, vi_pos_back_short (u'abc def... u', 11)) + self.assertEqual (5, vi_pos_back_short (u'abc def... u', 8)) + self.assertEqual (0, vi_pos_back_short (u'abc def... u', 5)) + self.assertEqual (11, vi_pos_back_short (u'abc def... ghi...', 16, count=2)) + self.assertEqual (0, vi_pos_back_short (u'abc def... ghi...', 11, count=3)) def test_pos_back_long (self): - self.assertEqual (0, vi_pos_back_long ('')) - self.assertEqual (4, vi_pos_back_long ('abc def', 6)) - self.assertEqual (4, vi_pos_back_long ('abc def', 5)) - self.assertEqual (0, vi_pos_back_long ('abc def', 4)) - self.assertEqual (0, vi_pos_back_long ('abc def', 3)) - self.assertEqual (5, vi_pos_back_long ('abc ...def u', 11)) - self.assertEqual (0, vi_pos_back_long ('abc ...def u', 5)) - self.assertEqual (0, vi_pos_back_long ('abc ...def u')) - self.assertEqual (5, vi_pos_back_long ('abc def... u', 11)) - self.assertEqual (0, vi_pos_back_long ('abc def... u', 5)) - self.assertEqual (4, vi_pos_back_long ('abc def... ghi...', 16, count=2)) + self.assertEqual (0, vi_pos_back_long (u'')) + self.assertEqual (4, vi_pos_back_long (u'abc def', 6)) + self.assertEqual (4, vi_pos_back_long (u'abc def', 5)) + self.assertEqual (0, vi_pos_back_long (u'abc def', 4)) + self.assertEqual (0, vi_pos_back_long (u'abc def', 3)) + self.assertEqual (5, vi_pos_back_long (u'abc ...def u', 11)) + self.assertEqual (0, vi_pos_back_long (u'abc ...def u', 5)) + self.assertEqual (0, vi_pos_back_long (u'abc ...def u')) + self.assertEqual (5, vi_pos_back_long (u'abc def... u', 11)) + self.assertEqual (0, vi_pos_back_long (u'abc def... u', 5)) + self.assertEqual (4, vi_pos_back_long (u'abc def... ghi...', 16, count=2)) def test_pos_find_char_forward (self): - self.assertEqual (-1, vi_pos_find_char_forward ('', 'x')) - self.assertEqual (-1, vi_pos_find_char_forward ('abc def', 'x')) - self.assertEqual (4, vi_pos_find_char_forward ('abc def', 'd')) - self.assertEqual (4, vi_pos_find_char_forward ('abc def', 'd', 3)) - self.assertEqual (-1, vi_pos_find_char_forward ('abc def', 'd', 4)) - self.assertEqual (-1, vi_pos_find_char_forward ('abc def', 'd', count=2)) - self.assertEqual (12, vi_pos_find_char_forward ('abc def abc def', 'd', count=2)) + self.assertEqual (-1, vi_pos_find_char_forward (u'', u'x')) + self.assertEqual (-1, vi_pos_find_char_forward (u'abc def', u'x')) + self.assertEqual (4, vi_pos_find_char_forward (u'abc def', u'd')) + self.assertEqual (4, vi_pos_find_char_forward (u'abc def', u'd', 3)) + self.assertEqual (-1, vi_pos_find_char_forward (u'abc def', u'd', 4)) + self.assertEqual (-1, vi_pos_find_char_forward (u'abc def', u'd', count=2)) + self.assertEqual (12, vi_pos_find_char_forward (u'abc def abc def', u'd', count=2)) def test_pos_find_char_backward (self): - self.assertEqual (-1, vi_pos_find_char_backward ('', 'x')) - self.assertEqual (-1, vi_pos_find_char_backward ('abc def', 'x', 6)) - self.assertEqual (4, vi_pos_find_char_backward ('abc def', 'd', 6)) - self.assertEqual (4, vi_pos_find_char_backward ('abc def', 'd', 5)) - self.assertEqual (-1, vi_pos_find_char_backward ('abc def', 'd', 4)) - self.assertEqual (-1, vi_pos_find_char_backward ('abc def', 'd', 6, count=2)) - self.assertEqual (4, vi_pos_find_char_backward ('abc def abc def', 'd', 14, count=2)) + self.assertEqual (-1, vi_pos_find_char_backward (u'', u'x')) + self.assertEqual (-1, vi_pos_find_char_backward (u'abc def', u'x', 6)) + self.assertEqual (4, vi_pos_find_char_backward (u'abc def', u'd', 6)) + self.assertEqual (4, vi_pos_find_char_backward (u'abc def', u'd', 5)) + self.assertEqual (-1, vi_pos_find_char_backward (u'abc def', u'd', 4)) + self.assertEqual (-1, vi_pos_find_char_backward (u'abc def', u'd', 6, count=2)) + self.assertEqual (4, vi_pos_find_char_backward (u'abc def abc def', u'd', 14, count=2)) def test_pos_to_char_forward (self): - self.assertEqual (-1, vi_pos_to_char_forward ('', 'x')) - self.assertEqual (-1, vi_pos_to_char_forward ('abc def', 'x')) - self.assertEqual (3, vi_pos_to_char_forward ('abc def', 'd')) - self.assertEqual (3, vi_pos_to_char_forward ('abc def', 'd', 2)) - self.assertEqual (-1, vi_pos_to_char_forward ('abc def', 'd', 4)) - self.assertEqual (-1, vi_pos_to_char_forward ('abc def', 'd', count=2)) - self.assertEqual (11, vi_pos_to_char_forward ('abc def abc def', 'd', count=2)) + self.assertEqual (-1, vi_pos_to_char_forward (u'', u'x')) + self.assertEqual (-1, vi_pos_to_char_forward (u'abc def', u'x')) + self.assertEqual (3, vi_pos_to_char_forward (u'abc def', u'd')) + self.assertEqual (3, vi_pos_to_char_forward (u'abc def', u'd', 2)) + self.assertEqual (-1, vi_pos_to_char_forward (u'abc def', u'd', 4)) + self.assertEqual (-1, vi_pos_to_char_forward (u'abc def', u'd', count=2)) + self.assertEqual (11, vi_pos_to_char_forward (u'abc def abc def', u'd', count=2)) def test_pos_to_char_backward (self): - self.assertEqual (-1, vi_pos_to_char_backward ('', 'x')) - self.assertEqual (-1, vi_pos_to_char_backward ('abc def', 'x', 6)) - self.assertEqual (5, vi_pos_to_char_backward ('abc def', 'd', 6)) - self.assertEqual (5, vi_pos_to_char_backward ('abc def', 'd', 5)) - self.assertEqual (-1, vi_pos_to_char_backward ('abc def', 'd', 4)) - self.assertEqual (-1, vi_pos_to_char_backward ('abc def', 'd', 6, count=2)) - self.assertEqual (5, vi_pos_to_char_backward ('abc def abc def', 'd', 14, count=2)) + self.assertEqual (-1, vi_pos_to_char_backward (u'', u'x')) + self.assertEqual (-1, vi_pos_to_char_backward (u'abc def', u'x', 6)) + self.assertEqual (5, vi_pos_to_char_backward (u'abc def', u'd', 6)) + self.assertEqual (5, vi_pos_to_char_backward (u'abc def', u'd', 5)) + self.assertEqual (-1, vi_pos_to_char_backward (u'abc def', u'd', 4)) + self.assertEqual (-1, vi_pos_to_char_backward (u'abc def', u'd', 6, count=2)) + self.assertEqual (5, vi_pos_to_char_backward (u'abc def abc def', u'd', 14, count=2)) def test_motion_word (self): - '''motions: lowercase mode is alpha, digit and _, uppercase is delim by spaces + u'''motions: lowercase mode is alpha, digit and _, uppercase is delim by spaces w/W: forward short/long word''' r = ViModeTest () - r._set_line ('abc_123 def--456.789 x') - r.input ('Escape') - r.input ('"0"') - r.input ('"w"') + r._set_line (u'abc_123 def--456.789 x') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"w"') self.assertEqual (9, r.line_cursor) - r.input ('"w"') + r.input (u'"w"') self.assertEqual (12, r.line_cursor) - r.input ('"w"') + r.input (u'"w"') self.assertEqual (14, r.line_cursor) - r.input ('"W"') + r.input (u'"W"') self.assertEqual (23, r.line_cursor) def test_motion_word_multiplier (self): r = ViModeTest () - r._set_line ('a b c d e f g h i j k l m n o p q r s t u v w x y z') - r.input ('Escape') - r.input ('"0"') - r.input ('"2"') + r._set_line (u'a b c d e f g h i j k l m n o p q r s t u v w x y z') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"2"') self.assertEqual (0, r.line_cursor) - r.input ('"w"') + r.input (u'"w"') self.assertEqual (4, r.line_cursor) - r.input ('"2"') - r.input ('"0"') - r.input ('"w"') + r.input (u'"2"') + r.input (u'"0"') + r.input (u'"w"') self.assertEqual (44, r.line_cursor) - r.input ('"2"') - r.input ('"W"') + r.input (u'"2"') + r.input (u'"W"') self.assertEqual (48, r.line_cursor) def test_motion_end (self): - '''motions: lowercase mode is alpha, digit and _, uppercase is delim by spaces + u'''motions: lowercase mode is alpha, digit and _, uppercase is delim by spaces e/E: to end of short/long word''' r = ViModeTest () - r._set_line (' abc_123 --def--456.789 x') - r.input ('Escape') - r.input ('"0"') - r.input ('"e"') + r._set_line (u' abc_123 --def--456.789 x') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"e"') self.assertEqual (8, r.line_cursor) - r.input ('"e"') + r.input (u'"e"') self.assertEqual (12, r.line_cursor) - r.input ('"e"') + r.input (u'"e"') self.assertEqual (15, r.line_cursor) - r.input ('"E"') + r.input (u'"E"') self.assertEqual (24, r.line_cursor) def test_motion_end_multiplier (self): r = ViModeTest () - r._set_line ('ab cd ef gh ij kl mn op qr st uv wx yz') - r.input ('Escape') - r.input ('"0"') - r.input ('"3"') - r.input ('"e"') + r._set_line (u'ab cd ef gh ij kl mn op qr st uv wx yz') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"3"') + r.input (u'"e"') self.assertEqual (7, r.line_cursor) - r.input ('"4"') - r.input ('"E"') + r.input (u'"4"') + r.input (u'"E"') self.assertEqual (19, r.line_cursor) def test_motion_backward (self): - '''motions: lowercase mode is alpha, digit and _, uppercase is delim by spaces + u'''motions: lowercase mode is alpha, digit and _, uppercase is delim by spaces b/B: backward short/long word''' r = ViModeTest () - r._set_line ('abc_123 def--456.789 x') - r.input ('Escape') - r.input ('"$"') + r._set_line (u'abc_123 def--456.789 x') + r.input (u'Escape') + r.input (u'"$"') self.assertEqual (23, r.line_cursor) - r.input ('"b"') + r.input (u'"b"') self.assertEqual (18, r.line_cursor) - r.input ('"b"') + r.input (u'"b"') self.assertEqual (17, r.line_cursor) - r.input ('"B"') + r.input (u'"B"') self.assertEqual (9, r.line_cursor) - r.input ('"B"') + r.input (u'"B"') self.assertEqual (0, r.line_cursor) def test_motion_backward_multiplier (self): r = ViModeTest () - r._set_line ('ab cd ef gh ij kl mn op qr st uv wx yz') - r.input ('Escape') - r.input ('"$"') + r._set_line (u'ab cd ef gh ij kl mn op qr st uv wx yz') + r.input (u'Escape') + r.input (u'"$"') self.assertEqual (37, r.line_cursor) - r.input ('"3"') - r.input ('"b"') + r.input (u'"3"') + r.input (u'"b"') self.assertEqual (30, r.line_cursor) - r.input ('"5"') - r.input ('"b"') + r.input (u'"5"') + r.input (u'"b"') self.assertEqual (15, r.line_cursor) def test_motion_find_char_forward (self): r = ViModeTest () - r._set_line ('abc_123 def--456.789 x') - r.input ('Escape') - r.input ('"0"') - r.input ('"f"') + r._set_line (u'abc_123 def--456.789 x') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"f"') self.assertEqual (0, r.line_cursor) - r.input ('"c"') + r.input (u'"c"') self.assertEqual (2, r.line_cursor) def test_motion_find_char_backward (self): r = ViModeTest () - r._set_line ('abc_123 def--456.789 x') - r.input ('Escape') - r.input ('"$"') + r._set_line (u'abc_123 def--456.789 x') + r.input (u'Escape') + r.input (u'"$"') self.assertEqual (23, r.line_cursor) - r.input ('"F"') + r.input (u'"F"') self.assertEqual (23, r.line_cursor) - r.input ('"c"') + r.input (u'"c"') self.assertEqual (2, r.line_cursor) def test_motion_find_char_forward_multiplier (self): r = ViModeTest () - r._set_line ('ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') - r.input ('Escape') - r.input ('"0"') - r.input ('"2"') - r.input ('"f"') - r.input ('"0"') + r._set_line (u'ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"2"') + r.input (u'"f"') + r.input (u'"0"') self.assertEqual (27, r.line_cursor) def test_motion_find_char_backward_multiplier (self): r = ViModeTest () - r._set_line ('ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') - r.input ('Escape') - r.input ('"$"') + r._set_line (u'ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') + r.input (u'Escape') + r.input (u'"$"') self.assertEqual (52, r.line_cursor) - r.input ('"2"') - r.input ('"F"') - r.input ('"0"') + r.input (u'"2"') + r.input (u'"F"') + r.input (u'"0"') self.assertEqual (27, r.line_cursor) def test_motion_find_char_again (self): r = ViModeTest () - r._set_line ('1234512345123451234512345') - r.input ('Escape') - r.input ('"0"') - r.input ('"2"') - r.input ('"f"') - r.input ('"3"') + r._set_line (u'1234512345123451234512345') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"2"') + r.input (u'"f"') + r.input (u'"3"') self.assertEqual (7, r.line_cursor) - r.input ('";"') + r.input (u'";"') self.assertEqual (12, r.line_cursor) - r.input ('"2"') - r.input ('";"') + r.input (u'"2"') + r.input (u'";"') self.assertEqual (22, r.line_cursor) - r.input ('","') + r.input (u'","') self.assertEqual (17, r.line_cursor) - r.input ('"2"') - r.input ('","') + r.input (u'"2"') + r.input (u'","') self.assertEqual (7, r.line_cursor) def test_motion_find_char_opposite (self): r = ViModeTest () - r._set_line ('1234512345123451234512345') - r.input ('Escape') - r.input ('"$"') - r.input ('"2"') - r.input ('"F"') - r.input ('"3"') + r._set_line (u'1234512345123451234512345') + r.input (u'Escape') + r.input (u'"$"') + r.input (u'"2"') + r.input (u'"F"') + r.input (u'"3"') self.assertEqual (17, r.line_cursor) - r.input ('";"') + r.input (u'";"') self.assertEqual (12, r.line_cursor) - r.input ('"2"') - r.input ('";"') + r.input (u'"2"') + r.input (u'";"') self.assertEqual (2, r.line_cursor) - r.input ('","') + r.input (u'","') self.assertEqual (7, r.line_cursor) - r.input ('"2"') - r.input ('","') + r.input (u'"2"') + r.input (u'","') self.assertEqual (17, r.line_cursor) - r.input ('"2"') - r.input ('","') + r.input (u'"2"') + r.input (u'","') self.assertEqual (17, r.line_cursor) def test_motion_to_char_forward (self): r = ViModeTest () - r._set_line ('abc_123 def--456.789 x') - r.input ('Escape') - r.input ('"0"') - r.input ('"t"') + r._set_line (u'abc_123 def--456.789 x') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"t"') self.assertEqual (0, r.line_cursor) - r.input ('"c"') + r.input (u'"c"') self.assertEqual (1, r.line_cursor) def test_motion_to_char_backward (self): r = ViModeTest () - r._set_line ('abc_123 def--456.789 x') - r.input ('Escape') - r.input ('"$"') + r._set_line (u'abc_123 def--456.789 x') + r.input (u'Escape') + r.input (u'"$"') self.assertEqual (23, r.line_cursor) - r.input ('"T"') + r.input (u'"T"') self.assertEqual (23, r.line_cursor) - r.input ('"c"') + r.input (u'"c"') self.assertEqual (3, r.line_cursor) def test_motion_to_char_forward_multiplier (self): r = ViModeTest () - r._set_line ('ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') - r.input ('Escape') - r.input ('"0"') - r.input ('"2"') - r.input ('"t"') - r.input ('"0"') + r._set_line (u'ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"2"') + r.input (u'"t"') + r.input (u'"0"') self.assertEqual (26, r.line_cursor) def test_motion_to_char_backward_multiplier (self): r = ViModeTest () - r._set_line ('ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') - r.input ('Escape') - r.input ('"$"') + r._set_line (u'ab cd ef 01 23 45 ab cd ef 01 23 45 ab cd ef 01 23 45') + r.input (u'Escape') + r.input (u'"$"') self.assertEqual (52, r.line_cursor) - r.input ('"2"') - r.input ('"T"') - r.input ('"0"') + r.input (u'"2"') + r.input (u'"T"') + r.input (u'"0"') self.assertEqual (28, r.line_cursor) def test_delete_word (self): r = ViModeTest () - r._set_line ('abc de fghi jkl mnopq rst') - r.input ('Escape') - r.input ('"0"') - r.input ('"d"') - r.input ('"w"') + r._set_line (u'abc de fghi jkl mnopq rst') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"d"') + r.input (u'"w"') self.assertEqual (0, r.line_cursor) - self.assertEqual (r.line, 'de fghi jkl mnopq rst') - r.input ('"d"') - r.input ('"2"') - r.input ('"w"') + self.assertEqual (r.line, u'de fghi jkl mnopq rst') + r.input (u'"d"') + r.input (u'"2"') + r.input (u'"w"') self.assertEqual (0, r.line_cursor) - self.assertEqual (r.line, 'jkl mnopq rst') - r.input ('"2"') - r.input ('"d"') - r.input ('"w"') + self.assertEqual (r.line, u'jkl mnopq rst') + r.input (u'"2"') + r.input (u'"d"') + r.input (u'"w"') self.assertEqual (0, r.line_cursor) - self.assertEqual (r.line, 'rst') + self.assertEqual (r.line, u'rst') def test_delete_word_two_multipliers (self): r = ViModeTest () - r._set_line ('abc de fghi jkl mnopq rst uv wx yz') - r.input ('Escape') - r.input ('"0w"') - r.input ('"2d3w"') + r._set_line (u'abc de fghi jkl mnopq rst uv wx yz') + r.input (u'Escape') + r.input (u'"0w"') + r.input (u'"2d3w"') self.assertEqual (4, r.line_cursor) - self.assertEqual (r.line, 'abc wx yz') + self.assertEqual (r.line, u'abc wx yz') def test_delete_find_char_forward_two_multipliers (self): r = ViModeTest () - r._set_line ('0123456789012345678901234567890123456789012345678901234567890123456789') - r.input ('Escape') - r.input ('"0"') - r.input ('"2d3f4"') - self.assertEqual (r.line, '567890123456789') + r._set_line (u'0123456789012345678901234567890123456789012345678901234567890123456789') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"2d3f4"') + self.assertEqual (r.line, u'567890123456789') def test_delete_end_of_line (self): r = ViModeTest () - r._set_line ('abc de fghi jkl mnopq rst uv wx yz') - r.input ('Escape') - r.input ('"0w"') - r.input ('"D"') - self.assertEqual (r.line, 'abc ') + r._set_line (u'abc de fghi jkl mnopq rst uv wx yz') + r.input (u'Escape') + r.input (u'"0w"') + r.input (u'"D"') + self.assertEqual (r.line, u'abc ') def test_two_lines (self): r = ViModeTest () - r.input ('"abcdef"') - self.assertEqual (r.line, 'abcdef') - r.input ('Escape') - r.input ('"0iqq"') - self.assertEqual (r.line, 'qqabcdef') - r.input ('Return') - self.assertEqual (r.line, '') - r.input ('"xyz"') - self.assertEqual (r.line, 'xyz') + r.input (u'"abcdef"') + self.assertEqual (r.line, u'abcdef') + r.input (u'Escape') + r.input (u'"0iqq"') + self.assertEqual (r.line, u'qqabcdef') + r.input (u'Return') + self.assertEqual (r.line, u'') + r.input (u'"xyz"') + self.assertEqual (r.line, u'xyz') def test_delete_word_short_to_end_of_line (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"03dw"') - self.assertEqual ('', r.line) - r._set_line ('abc def ghi ') - r.input ('Escape') - r.input ('"03dw"') - self.assertEqual ('', r.line) + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"03dw"') + self.assertEqual (u'', r.line) + r._set_line (u'abc def ghi ') + r.input (u'Escape') + r.input (u'"03dw"') + self.assertEqual (u'', r.line) def test_delete_word_long_to_end_of_line (self): r = ViModeTest () - r._set_line ('a.c d.f g.i') - r.input ('Escape') - r.input ('"03dW"') - self.assertEqual ('', r.line) - r._set_line ('a.c d.f g.i ') - r.input ('Escape') - r.input ('"03dW"') - self.assertEqual ('', r.line) + r._set_line (u'a.c d.f g.i') + r.input (u'Escape') + r.input (u'"03dW"') + self.assertEqual (u'', r.line) + r._set_line (u'a.c d.f g.i ') + r.input (u'Escape') + r.input (u'"03dW"') + self.assertEqual (u'', r.line) def test_delete_end_short_to_end_of_line (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"03de"') - self.assertEqual ('', r.line) - r._set_line ('abc def ghi ') - r.input ('Escape') - r.input ('"03de"') - self.assertEqual (' ', r.line) + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"03de"') + self.assertEqual (u'', r.line) + r._set_line (u'abc def ghi ') + r.input (u'Escape') + r.input (u'"03de"') + self.assertEqual (u' ', r.line) def test_delete_end_long_to_end_of_line (self): r = ViModeTest () - r._set_line ('a.c d.f g.i') - r.input ('Escape') - r.input ('"03dE"') - self.assertEqual ('', r.line) - r._set_line ('a.c d.f g.i ') - r.input ('Escape') - r.input ('"03dE"') - self.assertEqual (' ', r.line) + r._set_line (u'a.c d.f g.i') + r.input (u'Escape') + r.input (u'"03dE"') + self.assertEqual (u'', r.line) + r._set_line (u'a.c d.f g.i ') + r.input (u'Escape') + r.input (u'"03dE"') + self.assertEqual (u' ', r.line) def test_delete_back_short_to_begining_of_line (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"$3db"') - self.assertEqual ('i', r.line) - r._set_line ('abc def ghi ') - r.input ('Escape') - r.input ('"$3db"') - self.assertEqual (' ', r.line) + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"$3db"') + self.assertEqual (u'i', r.line) + r._set_line (u'abc def ghi ') + r.input (u'Escape') + r.input (u'"$3db"') + self.assertEqual (u' ', r.line) def test_delete_back_long_to_begining_of_line (self): r = ViModeTest () - r._set_line ('a.c d.f g.i') - r.input ('Escape') - r.input ('"$3dB"') - self.assertEqual ('i', r.line) - r._set_line ('a.c d.f g.i ') - r.input ('Escape') - r.input ('"$3dB"') - self.assertEqual (' ', r.line) + r._set_line (u'a.c d.f g.i') + r.input (u'Escape') + r.input (u'"$3dB"') + self.assertEqual (u'i', r.line) + r._set_line (u'a.c d.f g.i ') + r.input (u'Escape') + r.input (u'"$3dB"') + self.assertEqual (u' ', r.line) def test_delete_dollar (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"0ld$"') - self.assertEqual (r.line, 'a') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"0ld$"') + self.assertEqual (r.line, u'a') self.assertEqual (r.line_cursor, 0) def test_motion_left (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"$"') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"$"') self.assertEqual (10, r.line_cursor) - r.input ('"h"') + r.input (u'"h"') self.assertEqual (9, r.line_cursor) - r.input ('"2h"') + r.input (u'"2h"') self.assertEqual (7, r.line_cursor) - r.input ('"2d3h"') + r.input (u'"2d3h"') self.assertEqual (1, r.line_cursor) - self.assertEqual ('a ghi', r.line) - r.input ('"4dh"') + self.assertEqual (u'a ghi', r.line) + r.input (u'"4dh"') self.assertEqual (0, r.line_cursor) - self.assertEqual (' ghi', r.line) + self.assertEqual (u' ghi', r.line) def test_motion_right (self): r = ViModeTest () - r.input ('Escape') - self.assertEqual (r.line, '') + r.input (u'Escape') + self.assertEqual (r.line, u'') self.assertEqual (r.line_cursor, 0) - r.input ('"a"') - self.assertEqual (r.line, '') + r.input (u'"a"') + self.assertEqual (r.line, u'') self.assertEqual (r.line_cursor, 0) - r.input ('"abc"') - self.assertEqual (r.line, 'abc') + r.input (u'"abc"') + self.assertEqual (r.line, u'abc') self.assertEqual (r.line_cursor, 3) - r.input ('Escape') - self.assertEqual (r.line, 'abc') + r.input (u'Escape') + self.assertEqual (r.line, u'abc') self.assertEqual (r.line_cursor, 2) - r.input ('"l"') - self.assertEqual (r.line, 'abc') + r.input (u'"l"') + self.assertEqual (r.line, u'abc') self.assertEqual (r.line_cursor, 2) - r.input ('Left') - self.assertEqual (r.line, 'abc') + r.input (u'Left') + self.assertEqual (r.line, u'abc') self.assertEqual (r.line_cursor, 1) - r.input ('"l"') - self.assertEqual (r.line, 'abc') + r.input (u'"l"') + self.assertEqual (r.line, u'abc') self.assertEqual (r.line_cursor, 2) - r.input ('"l"') - self.assertEqual (r.line, 'abc') + r.input (u'"l"') + self.assertEqual (r.line, u'abc') self.assertEqual (r.line_cursor, 2) def test_motion_right_delete (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"0"') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"0"') self.assertEqual (0, r.line_cursor) - r.input ('"l"') + r.input (u'"l"') self.assertEqual (1, r.line_cursor) - r.input ('"2l"') + r.input (u'"2l"') self.assertEqual (3, r.line_cursor) - r.input ('"2d3l"') + r.input (u'"2d3l"') self.assertEqual (3, r.line_cursor) - self.assertEqual ('abchi', r.line) - r.input ('"4dl"') + self.assertEqual (u'abchi', r.line) + r.input (u'"4dl"') self.assertEqual (2, r.line_cursor) - self.assertEqual ('abc', r.line) + self.assertEqual (u'abc', r.line) def test_backspace_motion (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"$"') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"$"') self.assertEqual (10, r.line_cursor) - r.input ('BackSpace') + r.input (u'BackSpace') self.assertEqual (9, r.line_cursor) - r.input ('"2"') - r.input ('BackSpace') + r.input (u'"2"') + r.input (u'BackSpace') self.assertEqual (7, r.line_cursor) - r.input ('"2d3"') - r.input ('BackSpace') + r.input (u'"2d3"') + r.input (u'BackSpace') self.assertEqual (1, r.line_cursor) - self.assertEqual ('a ghi', r.line) - r.input ('"4d"') - r.input ('BackSpace') + self.assertEqual (u'a ghi', r.line) + r.input (u'"4d"') + r.input (u'BackSpace') self.assertEqual (0, r.line_cursor) - self.assertEqual (' ghi', r.line) + self.assertEqual (u' ghi', r.line) def test_backspace_insert (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"$"') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"$"') self.assertEqual (10, r.line_cursor) - r.input ('"i"') + r.input (u'"i"') self.assertEqual (10, r.line_cursor) - r.input ('BackSpace') + r.input (u'BackSpace') self.assertEqual (9, r.line_cursor) - self.assertEqual ('abc def gi', r.line) + self.assertEqual (u'abc def gi', r.line) def test_insert_lower_i (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"0w"') - r.input ('"i"') - r.input ('"zz"') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"0w"') + r.input (u'"i"') + r.input (u'"zz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, 'abc zzdef ghi') - r.input ('Escape') - r.input ('"w"') - r.input ('"2iyy"') - r.input ('Escape') - self.assertEqual (r.line, 'abc zzdef yyyyghi') + self.assertEqual (r.line, u'abc zzdef ghi') + r.input (u'Escape') + r.input (u'"w"') + r.input (u'"2iyy"') + r.input (u'Escape') + self.assertEqual (r.line, u'abc zzdef yyyyghi') def test_insert_upper_i (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"0w"') - r.input ('"I"') - r.input ('"zz"') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"0w"') + r.input (u'"I"') + r.input (u'"zz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, 'zzabc def ghi') - r.input ('Escape') - r.input ('"w"') - r.input ('"2Iyy"') - r.input ('Escape') - self.assertEqual (r.line, 'yyyyzzabc def ghi') + self.assertEqual (r.line, u'zzabc def ghi') + r.input (u'Escape') + r.input (u'"w"') + r.input (u'"2Iyy"') + r.input (u'Escape') + self.assertEqual (r.line, u'yyyyzzabc def ghi') def test_append_lower_a (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"0"') - r.input ('"a"') - r.input ('"zz"') - self.assertEqual (r.line, 'azzbc def ghi') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"a"') + r.input (u'"zz"') + self.assertEqual (r.line, u'azzbc def ghi') self.assert_ (r.vi_is_insert_mode) - r.input ('Escape') - r.input ('"w"') - r.input ('"2ayy"') - r.input ('Escape') - self.assertEqual (r.line, 'azzbc dyyyyef ghi') + r.input (u'Escape') + r.input (u'"w"') + r.input (u'"2ayy"') + r.input (u'Escape') + self.assertEqual (r.line, u'azzbc dyyyyef ghi') def test_append_upper_a_simple (self): r = ViModeTest () - r._set_line ('') - r.input ('Escape') - r.input ('"2A"') - r.input ('"jj"') - r.input ('Escape') - self.assertEqual (r.line, 'jjjj') + r._set_line (u'') + r.input (u'Escape') + r.input (u'"2A"') + r.input (u'"jj"') + r.input (u'Escape') + self.assertEqual (r.line, u'jjjj') self.assert_ (not r.vi_is_insert_mode) def test_append_upper_a (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"0"') - r.input ('"A"') - r.input ('"zz"') - self.assertEqual (r.line, 'abc def ghizz') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"A"') + r.input (u'"zz"') + self.assertEqual (r.line, u'abc def ghizz') self.assert_ (r.vi_is_insert_mode) - r.input ('Escape') - r.input ('"0w"') - r.input ('"2Ayy"') - r.input ('Escape') - self.assertEqual (r.line, 'abc def ghizzyyyy') + r.input (u'Escape') + r.input (u'"0w"') + r.input (u'"2Ayy"') + r.input (u'Escape') + self.assertEqual (r.line, u'abc def ghizzyyyy') def test_delete_lower_x (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"0w"') - r.input ('"x"') - self.assertEqual (r.line, 'abc ef') - r.input ('"4x"') - self.assertEqual (r.line, 'abc ') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"0w"') + r.input (u'"x"') + self.assertEqual (r.line, u'abc ef') + r.input (u'"4x"') + self.assertEqual (r.line, u'abc ') self.assertEqual (r.line_cursor, 3) - r.input ('"x"') - self.assertEqual (r.line, 'abc') + r.input (u'"x"') + self.assertEqual (r.line, u'abc') self.assertEqual (r.line_cursor, 2) - r.input ('"x"') - self.assertEqual (r.line, 'ab') + r.input (u'"x"') + self.assertEqual (r.line, u'ab') self.assertEqual (r.line_cursor, 1) - r.input ('"x"') - self.assertEqual (r.line, 'a') + r.input (u'"x"') + self.assertEqual (r.line, u'a') self.assertEqual (r.line_cursor, 0) - r.input ('"x"') - self.assertEqual (r.line, '') + r.input (u'"x"') + self.assertEqual (r.line, u'') self.assertEqual (r.line_cursor, 0) - r.input ('"x"') - self.assertEqual (r.line, '') + r.input (u'"x"') + self.assertEqual (r.line, u'') self.assertEqual (r.line_cursor, 0) def test_delete_upper_x (self): r = ViModeTest () - r._set_line ('abc def') + r._set_line (u'abc def') self.assertEqual (r.line_cursor, 7) - r.input ('Escape') + r.input (u'Escape') self.assertEqual (r.line_cursor, 6) - r.input ('"$"') + r.input (u'"$"') self.assertEqual (r.line_cursor, 6) - r.input ('"X"') - self.assertEqual (r.line, 'abc df') + r.input (u'"X"') + self.assertEqual (r.line, u'abc df') self.assertEqual (r.line_cursor, 5) - r.input ('"4X"') - self.assertEqual (r.line, 'af') + r.input (u'"4X"') + self.assertEqual (r.line, u'af') self.assertEqual (r.line_cursor, 1) - r.input ('"2X"') - self.assertEqual (r.line, 'f') + r.input (u'"2X"') + self.assertEqual (r.line, u'f') self.assertEqual (r.line_cursor, 0) - r.input ('"X"') - self.assertEqual (r.line, 'f') + r.input (u'"X"') + self.assertEqual (r.line, u'f') self.assertEqual (r.line_cursor, 0) def test_substitute_lower_s (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"0"') - r.input ('"s"') - r.input ('"qq"') - r.input ('Escape') - self.assertEqual (r.line, 'qqbc def') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"s"') + r.input (u'"qq"') + r.input (u'Escape') + self.assertEqual (r.line, u'qqbc def') self.assertEqual (r.line_cursor, 1) - r.input ('"3s"') - r.input ('"yyy"') - r.input ('Escape') - self.assertEqual (r.line, 'qyyy def') + r.input (u'"3s"') + r.input (u'"yyy"') + r.input (u'Escape') + self.assertEqual (r.line, u'qyyy def') self.assertEqual (r.line_cursor, 3) - r.input ('"w"') - r.input ('"5"') - r.input ('"s"') - r.input ('"zz"') - r.input ('Escape') - self.assertEqual (r.line, 'qyyy zz') + r.input (u'"w"') + r.input (u'"5"') + r.input (u'"s"') + r.input (u'"zz"') + r.input (u'Escape') + self.assertEqual (r.line, u'qyyy zz') self.assertEqual (r.line_cursor, 6) def test_change_to_end_of_line (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"0w"') - r.input ('"C"') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"0w"') + r.input (u'"C"') self.assert_ (r.vi_is_insert_mode) - r.input ('"123"') - self.assertEqual (r.line, 'abc 123') - r.input ('Escape') + r.input (u'"123"') + self.assertEqual (r.line, u'abc 123') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) def test_change_whole_line (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"0w"') - r.input ('"S"') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"0w"') + r.input (u'"S"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, '') - r.input ('"123"') - self.assertEqual (r.line, '123') - r.input ('Escape') + self.assertEqual (r.line, u'') + r.input (u'"123"') + self.assertEqual (r.line, u'123') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) def test_change_word_short (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"0cwzzz"') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"0cwzzz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, 'zzz def ghi') + self.assertEqual (r.line, u'zzz def ghi') self.assertEqual (r.line_cursor, 3) - r.input ('Escape') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 2) - r.input ('"w"') + r.input (u'"w"') self.assertEqual (r.line_cursor, 4) - r.input ('"2cwyyy"') - self.assertEqual (r.line, 'zzz yyy') - r.input ('Escape') - self.assertEqual (r.line, 'zzz yyy') + r.input (u'"2cwyyy"') + self.assertEqual (r.line, u'zzz yyy') + r.input (u'Escape') + self.assertEqual (r.line, u'zzz yyy') def test_change_word_long (self): r = ViModeTest () - r._set_line ('abc.def ghi.jkl mno.pqr') - r.input ('Escape') - r.input ('"0cWss"') - self.assertEqual (r.line, 'ss ghi.jkl mno.pqr') + r._set_line (u'abc.def ghi.jkl mno.pqr') + r.input (u'Escape') + r.input (u'"0cWss"') + self.assertEqual (r.line, u'ss ghi.jkl mno.pqr') self.assert_ (r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 2) - r.input ('Escape') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 1) - r.input ('"w2."') - self.assertEqual (r.line, 'ss ss') + r.input (u'"w2."') + self.assertEqual (r.line, u'ss ss') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 4) def test_change_end_short (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"0cezzz"') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"0cezzz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, 'zzz def ghi') + self.assertEqual (r.line, u'zzz def ghi') self.assertEqual (r.line_cursor, 3) - r.input ('Escape') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 2) - r.input ('"w2."') - self.assertEqual (r.line, 'zzz zzz') + r.input (u'"w2."') + self.assertEqual (r.line, u'zzz zzz') def test_change_end_long (self): r = ViModeTest () - r._set_line ('abc.def ghi jkl.mno pqr stu.vwx') - r.input ('Escape') - r.input ('"02cEzz"') + r._set_line (u'abc.def ghi jkl.mno pqr stu.vwx') + r.input (u'Escape') + r.input (u'"02cEzz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, 'zz jkl.mno pqr stu.vwx') + self.assertEqual (r.line, u'zz jkl.mno pqr stu.vwx') self.assertEqual (r.line_cursor, 2) - r.input ('Escape') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 1) - r.input ('"w2."') - self.assertEqual (r.line, 'zz zz stu.vwx') + r.input (u'"w2."') + self.assertEqual (r.line, u'zz zz stu.vwx') self.assertEqual (r.line_cursor, 5) def test_change_back_short (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"$cbzz"') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"$cbzz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, 'abc def zzi') + self.assertEqual (r.line, u'abc def zzi') self.assertEqual (r.line_cursor, 10) - r.input ('Escape') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 9) - r.input ('"b2."') - self.assertEqual (r.line, 'zzzzi') + r.input (u'"b2."') + self.assertEqual (r.line, u'zzzzi') self.assertEqual (r.line_cursor, 2) def test_change_back_long (self): r = ViModeTest () - r._set_line ('abc.def ghi jkl.mno pqr stu.vwx') - r.input ('Escape') - r.input ('"$2cBzz"') + r._set_line (u'abc.def ghi jkl.mno pqr stu.vwx') + r.input (u'Escape') + r.input (u'"$2cBzz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, 'abc.def ghi jkl.mno zzx') + self.assertEqual (r.line, u'abc.def ghi jkl.mno zzx') self.assertEqual (r.line_cursor, 22) - r.input ('Escape') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 21) - r.input ('"5."') - self.assertEqual (r.line, 'zzzx') + r.input (u'"5."') + self.assertEqual (r.line, u'zzzx') self.assertEqual (r.line_cursor, 2) self.assert_ (not r.vi_is_insert_mode) def test_change_find_lower (self): r = ViModeTest () - r._set_line ('aa bb cc dd ee aa bb cc dd ee') - r.input ('Escape') - r.input ('"0cfbzz"') + r._set_line (u'aa bb cc dd ee aa bb cc dd ee') + r.input (u'Escape') + r.input (u'"0cfbzz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, 'zzb cc dd ee aa bb cc dd ee') + self.assertEqual (r.line, u'zzb cc dd ee aa bb cc dd ee') self.assertEqual (r.line_cursor, 2) - r.input ('Escape') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 1) - r.input ('"c2fcyy"') - self.assertEqual (r.line, 'zyy dd ee aa bb cc dd ee') - r.input ('Escape') - r.input ('"."') - self.assertEqual (r.line, 'zyyy dd ee') + r.input (u'"c2fcyy"') + self.assertEqual (r.line, u'zyy dd ee aa bb cc dd ee') + r.input (u'Escape') + r.input (u'"."') + self.assertEqual (r.line, u'zyyy dd ee') def test_change_find_upper (self): r = ViModeTest () - r._set_line ('aa bb cc aa bb cc') - r.input ('Escape') - r.input ('"$2c2Fazz"') + r._set_line (u'aa bb cc aa bb cc') + r.input (u'Escape') + r.input (u'"$2c2Fazz"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, 'zzc') + self.assertEqual (r.line, u'zzc') self.assertEqual (r.line_cursor, 2) - r.input ('Escape') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 1) - r.input ('"."') - self.assertEqual (r.line, 'zzc') + r.input (u'"."') + self.assertEqual (r.line, u'zzc') def test_change_to_lower (self): r = ViModeTest () - r._set_line ('aa bb cc aa bb cc aa bb cc') - r.input ('Escape') - r.input ('"02c2ta"') + r._set_line (u'aa bb cc aa bb cc aa bb cc') + r.input (u'Escape') + r.input (u'"02c2ta"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, 'aa bb cc') + self.assertEqual (r.line, u'aa bb cc') self.assertEqual (r.line_cursor, 0) - r.input ('"zz "') - self.assertEqual (r.line, 'zz aa bb cc') + r.input (u'"zz "') + self.assertEqual (r.line, u'zz aa bb cc') self.assertEqual (r.line_cursor, 3) - r.input ('Escape') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 2) def test_change_to_upper (self): r = ViModeTest () - r._set_line ('aa bb cc aa bb cc aa bb cc') - r.input ('Escape') - r.input ('"$2c2Ta"') + r._set_line (u'aa bb cc aa bb cc aa bb cc') + r.input (u'Escape') + r.input (u'"$2c2Ta"') self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.line, 'aa bb cc ac') + self.assertEqual (r.line, u'aa bb cc ac') self.assertEqual (r.line_cursor, 10) - r.input ('"zz"') - self.assertEqual (r.line, 'aa bb cc azzc') + r.input (u'"zz"') + self.assertEqual (r.line, u'aa bb cc azzc') self.assertEqual (r.line_cursor, 12) - r.input ('Escape') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 11) - r.input ('"3."') - self.assertEqual (r.line, 'azzzc') + r.input (u'"3."') + self.assertEqual (r.line, u'azzzc') # The following fails but it does not seem that important # self.assertEqual (r.line_cursor, 2) self.assert_ (not r.vi_is_insert_mode) def test_pos_matching (self): - self.assertEqual (6, vi_pos_matching ('aa (bb)')) - self.assertEqual (6, vi_pos_matching ('aa (bb)', 3)) - self.assertEqual (3, vi_pos_matching ('aa (bb)', 6)) - self.assertEqual (11, vi_pos_matching ('aa (bb (cc))')) - self.assertEqual (3, vi_pos_matching ('aa (bb (cc))', 11)) - self.assertEqual (10, vi_pos_matching ('aa (bb (cc))', 4)) - self.assertEqual (7, vi_pos_matching ('aa (bb (cc))', 10)) - self.assertEqual (7, vi_pos_matching ('aa (bb (cc))', 8)) - self.assertEqual (3, vi_pos_matching ('aa (bb (cc) dd)', 12)) - self.assertEqual (3, vi_pos_matching ('aa (bb (cc) dd)', 14)) - self.assertEqual (-1, vi_pos_matching ('aa ((bb (cc) dd)', 3)) - self.assertEqual (-1, vi_pos_matching ('aa (bb (cc) dd) ee)', 16)) - self.assertEqual (-1, vi_pos_matching ('aa (bb (cc) dd) ee)', 18)) - self.assertEqual (6, vi_pos_matching ('aa ')) - self.assertEqual (11, vi_pos_matching ('aa >')) - self.assertEqual (10, vi_pos_matching ('aa >', 4)) - self.assertEqual (6, vi_pos_matching ('aa {bb}')) - self.assertEqual (11, vi_pos_matching ('aa {bb {cc}}')) - self.assertEqual (10, vi_pos_matching ('aa {bb {cc}}', 4)) - self.assertEqual (6, vi_pos_matching ('aa [bb]')) - self.assertEqual (11, vi_pos_matching ('aa [bb [cc]]')) - self.assertEqual (10, vi_pos_matching ('aa [bb [cc]]', 4)) + self.assertEqual (6, vi_pos_matching (u'aa (bb)')) + self.assertEqual (6, vi_pos_matching (u'aa (bb)', 3)) + self.assertEqual (3, vi_pos_matching (u'aa (bb)', 6)) + self.assertEqual (11, vi_pos_matching (u'aa (bb (cc))')) + self.assertEqual (3, vi_pos_matching (u'aa (bb (cc))', 11)) + self.assertEqual (10, vi_pos_matching (u'aa (bb (cc))', 4)) + self.assertEqual (7, vi_pos_matching (u'aa (bb (cc))', 10)) + self.assertEqual (7, vi_pos_matching (u'aa (bb (cc))', 8)) + self.assertEqual (3, vi_pos_matching (u'aa (bb (cc) dd)', 12)) + self.assertEqual (3, vi_pos_matching (u'aa (bb (cc) dd)', 14)) + self.assertEqual (-1, vi_pos_matching (u'aa ((bb (cc) dd)', 3)) + self.assertEqual (-1, vi_pos_matching (u'aa (bb (cc) dd) ee)', 16)) + self.assertEqual (-1, vi_pos_matching (u'aa (bb (cc) dd) ee)', 18)) + self.assertEqual (6, vi_pos_matching (u'aa ')) + self.assertEqual (11, vi_pos_matching (u'aa >')) + self.assertEqual (10, vi_pos_matching (u'aa >', 4)) + self.assertEqual (6, vi_pos_matching (u'aa {bb}')) + self.assertEqual (11, vi_pos_matching (u'aa {bb {cc}}')) + self.assertEqual (10, vi_pos_matching (u'aa {bb {cc}}', 4)) + self.assertEqual (6, vi_pos_matching (u'aa [bb]')) + self.assertEqual (11, vi_pos_matching (u'aa [bb [cc]]')) + self.assertEqual (10, vi_pos_matching (u'aa [bb [cc]]', 4)) def test_matching_paren_forward (self): r = ViModeTest () - r._set_line ('abc (def (ghi)) jkl') - r.input ('Escape') - r.input ('"0w"') - r.input ('"d"') - r.input ('"%"') - self.assertEqual (r.line, 'abc jkl') + r._set_line (u'abc (def (ghi)) jkl') + r.input (u'Escape') + r.input (u'"0w"') + r.input (u'"d"') + r.input (u'"%"') + self.assertEqual (r.line, u'abc jkl') self.assertEqual (r.line_cursor, 4) def test_matching_paren_backward (self): r = ViModeTest () - r._set_line ('abc (def (ghi)) jkl') - r.input ('Escape') - r.input ('"0w"') - r.input ('"%"') + r._set_line (u'abc (def (ghi)) jkl') + r.input (u'Escape') + r.input (u'"0w"') + r.input (u'"%"') self.assertEqual (r.line_cursor, 14) - r.input ('"d"') - r.input ('"%"') - self.assertEqual (r.line, 'abc jkl') + r.input (u'"d"') + r.input (u'"%"') + self.assertEqual (r.line, u'abc jkl') self.assertEqual (r.line_cursor, 4) def test_yank_and_put (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"0"') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"0"') self.assert_ (not r.vi_is_insert_mode) - r.input ('"yw"') + r.input (u'"yw"') self.assert_ (not r.vi_is_insert_mode) - self.assertEqual (r.line, 'abc def') + self.assertEqual (r.line, u'abc def') self.assertEqual (r.line_cursor, 0) - r.input ('"P"') - self.assertEqual (r.line, 'abc abc def') + r.input (u'"P"') + self.assertEqual (r.line, u'abc abc def') self.assertEqual (r.line_cursor, 3) - r.input ('"p"') - self.assertEqual (r.line, 'abc abc abc def') + r.input (u'"p"') + self.assertEqual (r.line, u'abc abc abc def') self.assertEqual (r.line_cursor, 7) def test_put_multiple (self): r = ViModeTest () - r._set_line ('001122') - r.input ('Escape') - r.input ('"0"') - r.input ('"y3l"') + r._set_line (u'001122') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"y3l"') self.assert_ (not r.vi_is_insert_mode) self.assertEqual (r.line_cursor, 0) - r.input ('"2P"') - self.assertEqual (r.line, '001001001122') + r.input (u'"2P"') + self.assertEqual (r.line, u'001001001122') self.assertEqual (r.line_cursor, 5) - r.input ('"f2"') - r.input ('"3p"') - self.assertEqual (r.line, '001001001120010010012') + r.input (u'"f2"') + r.input (u'"3p"') + self.assertEqual (r.line, u'001001001120010010012') self.assertEqual (r.line_cursor, 19) def test_put_undo (self): r = ViModeTest () - r._set_line ('aaa b ccc') - r.input ('Escape') - r.input ('"0ywwp"') - self.assertEqual (r.line, 'aaa baaa ccc') - r.input ('"u"') - self.assertEqual (r.line, 'aaa b ccc') - r.input ('"P"') - self.assertEqual (r.line, 'aaa aaa b ccc') - r.input ('"u"') - self.assertEqual (r.line, 'aaa b ccc') + r._set_line (u'aaa b ccc') + r.input (u'Escape') + r.input (u'"0ywwp"') + self.assertEqual (r.line, u'aaa baaa ccc') + r.input (u'"u"') + self.assertEqual (r.line, u'aaa b ccc') + r.input (u'"P"') + self.assertEqual (r.line, u'aaa aaa b ccc') + r.input (u'"u"') + self.assertEqual (r.line, u'aaa b ccc') def test_x_and_p (self): r = ViModeTest () - r._set_line ('abc') - r.input ('Escape') - r.input ('"0xp"') - self.assertEqual (r.line, 'bac') + r._set_line (u'abc') + r.input (u'Escape') + r.input (u'"0xp"') + self.assertEqual (r.line, u'bac') def test_delete_and_put (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"0dwep"') - self.assertEqual (r.line, 'defabc ') - r.input ('"0xp"') - self.assertEqual (r.line, 'edfabc ') - r.input ('"p"') - self.assertEqual (r.line, 'eddfabc ') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"0dwep"') + self.assertEqual (r.line, u'defabc ') + r.input (u'"0xp"') + self.assertEqual (r.line, u'edfabc ') + r.input (u'"p"') + self.assertEqual (r.line, u'eddfabc ') def test_dot_simple (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"0x"') - self.assertEqual (r.line, 'bc def') - r.input ('"."') - self.assertEqual (r.line, 'c def') - r.input ('"3."') - self.assertEqual (r.line, 'ef') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"0x"') + self.assertEqual (r.line, u'bc def') + r.input (u'"."') + self.assertEqual (r.line, u'c def') + r.input (u'"3."') + self.assertEqual (r.line, u'ef') def test_dot_movement_not_repeated_one (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"0x"') - self.assertEqual (r.line, 'bc def') - r.input ('"$."') - self.assertEqual (r.line, 'bc de') - r.input ('"0."') - self.assertEqual (r.line, 'c de') - r.input ('"$."') - self.assertEqual (r.line, 'c d') - r.input ('"^."') - self.assertEqual (r.line, ' d') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"0x"') + self.assertEqual (r.line, u'bc def') + r.input (u'"$."') + self.assertEqual (r.line, u'bc de') + r.input (u'"0."') + self.assertEqual (r.line, u'c de') + r.input (u'"$."') + self.assertEqual (r.line, u'c d') + r.input (u'"^."') + self.assertEqual (r.line, u' d') def test_dot_movement_not_repeated_two (self): r = ViModeTest () - r._set_line ('abc def ghi jkl mno pqr') - r.input ('Escape') - r.input ('"0x"') - self.assertEqual (r.line, 'bc def ghi jkl mno pqr') - r.input ('"w."') - self.assertEqual (r.line, 'bc ef ghi jkl mno pqr') - r.input ('"fg."') - self.assertEqual (r.line, 'bc ef hi jkl mno pqr') - r.input ('"2b."') - self.assertEqual (r.line, 'c ef hi jkl mno pqr') - r.input ('"3e."') - self.assertEqual (r.line, 'c ef hi jk mno pqr') - r.input ('"Fh."') - self.assertEqual (r.line, 'c ef i jk mno pqr') - r.input ('"tn."') - self.assertEqual (r.line, 'c ef i jk no pqr') - r.input ('"3h."') - self.assertEqual (r.line, 'c ef i k no pqr') - r.input ('"5l."') - self.assertEqual (r.line, 'c ef i k no qr') + r._set_line (u'abc def ghi jkl mno pqr') + r.input (u'Escape') + r.input (u'"0x"') + self.assertEqual (r.line, u'bc def ghi jkl mno pqr') + r.input (u'"w."') + self.assertEqual (r.line, u'bc ef ghi jkl mno pqr') + r.input (u'"fg."') + self.assertEqual (r.line, u'bc ef hi jkl mno pqr') + r.input (u'"2b."') + self.assertEqual (r.line, u'c ef hi jkl mno pqr') + r.input (u'"3e."') + self.assertEqual (r.line, u'c ef hi jk mno pqr') + r.input (u'"Fh."') + self.assertEqual (r.line, u'c ef i jk mno pqr') + r.input (u'"tn."') + self.assertEqual (r.line, u'c ef i jk no pqr') + r.input (u'"3h."') + self.assertEqual (r.line, u'c ef i k no pqr') + r.input (u'"5l."') + self.assertEqual (r.line, u'c ef i k no qr') def test_dot_insert (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"0"') - r.input ('"2izz "') - r.input ('Escape') - self.assertEqual (r.line, 'zz zz abc def') - r.input ('"2w."') - self.assertEqual (r.line, 'zz zz abc zz zz def') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"0"') + r.input (u'"2izz "') + r.input (u'Escape') + self.assertEqual (r.line, u'zz zz abc def') + r.input (u'"2w."') + self.assertEqual (r.line, u'zz zz abc zz zz def') def test_dot_delete_word (self): r = ViModeTest () - r._set_line ('0 1 2 3 4 5 6 7 8 9') - r.input ('Escape') - r.input ('"02dw"') - self.assertEqual (r.line, '2 3 4 5 6 7 8 9') - r.input ('"."') - self.assertEqual (r.line, '4 5 6 7 8 9') - r.input ('"1."') - self.assertEqual (r.line, '5 6 7 8 9') + r._set_line (u'0 1 2 3 4 5 6 7 8 9') + r.input (u'Escape') + r.input (u'"02dw"') + self.assertEqual (r.line, u'2 3 4 5 6 7 8 9') + r.input (u'"."') + self.assertEqual (r.line, u'4 5 6 7 8 9') + r.input (u'"1."') + self.assertEqual (r.line, u'5 6 7 8 9') def test_dot_override_multiplier (self): r = ViModeTest () - r._set_line ('ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab') - r.input ('Escape') - r.input ('"02d2fb"') - self.assertEqual (r.line, ' ab ab ab ab ab ab ab ab ab ab ab ab') - r.input ('"."') - self.assertEqual (r.line, ' ab ab ab ab ab ab ab ab') - r.input ('"3."') - self.assertEqual (r.line, ' ab ab ab ab ab') - r.input ('"."') - self.assertEqual (r.line, ' ab ab') + r._set_line (u'ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab') + r.input (u'Escape') + r.input (u'"02d2fb"') + self.assertEqual (r.line, u' ab ab ab ab ab ab ab ab ab ab ab ab') + r.input (u'"."') + self.assertEqual (r.line, u' ab ab ab ab ab ab ab ab') + r.input (u'"3."') + self.assertEqual (r.line, u' ab ab ab ab ab') + r.input (u'"."') + self.assertEqual (r.line, u' ab ab') def test_dot_yank_and_put (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"0ywP"') - self.assertEqual (r.line, 'abc abc def') - r.input ('"."') - self.assertEqual (r.line, 'abcabc abc def') - r.input ('"p"') - self.assertEqual (r.line, 'abcabc abc abc def') - r.input ('"2."') - self.assertEqual (r.line, 'abcabc abc abc abc abc def') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"0ywP"') + self.assertEqual (r.line, u'abc abc def') + r.input (u'"."') + self.assertEqual (r.line, u'abcabc abc def') + r.input (u'"p"') + self.assertEqual (r.line, u'abcabc abc abc def') + r.input (u'"2."') + self.assertEqual (r.line, u'abcabc abc abc abc abc def') def test_dot_insert_begin (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"Izz "') - r.input ('Escape') - self.assertEqual (r.line, 'zz abc def') - r.input ('"."') - self.assertEqual (r.line, 'zz zz abc def') - r.input ('"2."') - self.assertEqual (r.line, 'zz zz zz zz abc def') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"Izz "') + r.input (u'Escape') + self.assertEqual (r.line, u'zz abc def') + r.input (u'"."') + self.assertEqual (r.line, u'zz zz abc def') + r.input (u'"2."') + self.assertEqual (r.line, u'zz zz zz zz abc def') def test_dot_append_end (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"A yy"') - r.input ('Escape') - self.assertEqual (r.line, 'abc def yy') - r.input ('"."') - self.assertEqual (r.line, 'abc def yy yy') - r.input ('"2."') - self.assertEqual (r.line, 'abc def yy yy yy yy') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"A yy"') + r.input (u'Escape') + self.assertEqual (r.line, u'abc def yy') + r.input (u'"."') + self.assertEqual (r.line, u'abc def yy yy') + r.input (u'"2."') + self.assertEqual (r.line, u'abc def yy yy yy yy') def test_dot_insert_lower (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"b2izz "') - r.input ('Escape') - self.assertEqual (r.line, 'abc zz zz def') - r.input ('"3."') - self.assertEqual (r.line, 'abc zz zzzz zz zz def') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"b2izz "') + r.input (u'Escape') + self.assertEqual (r.line, u'abc zz zz def') + r.input (u'"3."') + self.assertEqual (r.line, u'abc zz zzzz zz zz def') def test_dot_append_lower (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"0e2a zz"') - r.input ('Escape') - self.assertEqual (r.line, 'abc zz zz def') - r.input ('"1."') - self.assertEqual (r.line, 'abc zz zz zz def') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"0e2a zz"') + r.input (u'Escape') + self.assertEqual (r.line, u'abc zz zz def') + r.input (u'"1."') + self.assertEqual (r.line, u'abc zz zz zz def') def test_dot_substitute_lower (self): r = ViModeTest () - r._set_line ('abc def') - r.input ('Escape') - r.input ('"03sqq"') - r.input ('Escape') - self.assertEqual (r.line, 'qq def') - r.input ('"2."') - self.assertEqual (r.line, 'qqqdef') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"03sqq"') + r.input (u'Escape') + self.assertEqual (r.line, u'qq def') + r.input (u'"2."') + self.assertEqual (r.line, u'qqqdef') def test_undo (self): r = ViModeTest () - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"0wdw"') - self.assertEqual (r.line, 'abc ghi') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"0wdw"') + self.assertEqual (r.line, u'abc ghi') self.assertEqual (r.line_cursor, 4) - r.input ('"u"') - self.assertEqual (r.line, 'abc def ghi') + r.input (u'"u"') + self.assertEqual (r.line, u'abc def ghi') self.assertEqual (r.line_cursor, 4) def test_undo_line (self): r = ViModeTest () - r._set_line ('') - r.input ('"abc def ghi"') - r.input ('Escape') - r.input ('"0dwdw"') - self.assertEqual (r.line, 'ghi') - r.input ('"U"') - self.assertEqual (r.line, '') + r._set_line (u'') + r.input (u'"abc def ghi"') + r.input (u'Escape') + r.input (u'"0dwdw"') + self.assertEqual (r.line, u'ghi') + r.input (u'"U"') + self.assertEqual (r.line, u'') def test_undo_line_with_history (self): r = ViModeTest () - r.add_history ('abc 123') - r._set_line ('') - r.input ('"abc def ghi"') - r.input ('Escape') - r.input ('"0dwdw"') - self.assertEqual (r.line, 'ghi') - r.input ('"U"') - self.assertEqual (r.line, '') + r.add_history (u'abc 123') + r._set_line (u'') + r.input (u'"abc def ghi"') + r.input (u'Escape') + r.input (u'"0dwdw"') + self.assertEqual (r.line, u'ghi') + r.input (u'"U"') + self.assertEqual (r.line, u'') def test_history_no_match (self): r = ViModeTest () - r.add_history ('abc 123') - r.add_history ('def 456') - r.add_history ('ghi 789') - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"/"') - self.assertEqual (r.line, '/') + r.add_history (u'abc 123') + r.add_history (u'def 456') + r.add_history (u'ghi 789') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"/"') + self.assertEqual (r.line, u'/') self.assertEqual (r.line_cursor, 1) - r.input ('"zz"') - self.assertEqual (r.line, '/zz') + r.input (u'"zz"') + self.assertEqual (r.line, u'/zz') self.assertEqual (r.line_cursor, 3) self.assertEqual (r.console.bell_count, 0) - r.input ('Return') + r.input (u'Return') # TODO should bell be rung here? # self.assertEqual (r.console.bell_count, 1) - self.assertEqual (r.line, 'abc def ghi') + self.assertEqual (r.line, u'abc def ghi') self.assertEqual (r.line_cursor, 10) def test_history_found_match (self): r = ViModeTest () - r.add_history ('abc 123') - r.add_history ('def 456') - r.add_history ('ghi 789') - r._set_line ('abc def ghi') - r.input ('Escape') - r.input ('"/"') - self.assertEqual (r.line, '/') + r.add_history (u'abc 123') + r.add_history (u'def 456') + r.add_history (u'ghi 789') + r._set_line (u'abc def ghi') + r.input (u'Escape') + r.input (u'"/"') + self.assertEqual (r.line, u'/') self.assertEqual (r.line_cursor, 1) - r.input ('"de"') - self.assertEqual (r.line, '/de') + r.input (u'"de"') + self.assertEqual (r.line, u'/de') self.assertEqual (r.line_cursor, 3) - r.input ('Return') - self.assertEqual (r.line, 'def 456') + r.input (u'Return') + self.assertEqual (r.line, u'def 456') self.assertEqual (r.line_cursor, 0) def test_history_multi_match (self): r = ViModeTest () - r.add_history ('xyz 123') - r.add_history ('xyz 456') - r.add_history ('xyz 789') - r._set_line ('abc def') - r.input ('Escape') - r.input ('"/xyz"') - r.input ('Return') - self.assertEqual (r.line, 'xyz 789') - r.input ('"n"') - self.assertEqual (r.line, 'xyz 456') - r.input ('"n"') - self.assertEqual (r.line, 'xyz 123') + r.add_history (u'xyz 123') + r.add_history (u'xyz 456') + r.add_history (u'xyz 789') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"/xyz"') + r.input (u'Return') + self.assertEqual (r.line, u'xyz 789') + r.input (u'"n"') + self.assertEqual (r.line, u'xyz 456') + r.input (u'"n"') + self.assertEqual (r.line, u'xyz 123') self.assertEqual (r.console.bell_count, 0) - r.input ('"n"') + r.input (u'"n"') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 1) - self.assertEqual (r.line, 'xyz 123') - r.input ('"N"') - self.assertEqual (r.line, 'xyz 456') - r.input ('"N"') - self.assertEqual (r.line, 'xyz 789') + self.assertEqual (r.line, u'xyz 123') + r.input (u'"N"') + self.assertEqual (r.line, u'xyz 456') + r.input (u'"N"') + self.assertEqual (r.line, u'xyz 789') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 1) - r.input ('"N"') + r.input (u'"N"') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 2) - self.assertEqual (r.line, 'xyz 789') + self.assertEqual (r.line, u'xyz 789') def test_history_search_empty_string (self): r = ViModeTest () - r.add_history ('xyz 123') - r.add_history ('xyz 456') - r.add_history ('xyz 789') - r.input ('Escape') - r.input ('"/"') - r.input ('Return') - self.assertEqual (r.line, '') + r.add_history (u'xyz 123') + r.add_history (u'xyz 456') + r.add_history (u'xyz 789') + r.input (u'Escape') + r.input (u'"/"') + r.input (u'Return') + self.assertEqual (r.line, u'') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 1) - r.input ('"/"') - r.input ('Return') - self.assertEqual (r.line, '') + r.input (u'"/"') + r.input (u'Return') + self.assertEqual (r.line, u'') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 2) - r.input ('"/x"') - r.input ('Return') - self.assertEqual (r.line, 'xyz 789') - r.input ('"/"') - r.input ('Return') - self.assertEqual (r.line, 'xyz 456') + r.input (u'"/x"') + r.input (u'Return') + self.assertEqual (r.line, u'xyz 789') + r.input (u'"/"') + r.input (u'Return') + self.assertEqual (r.line, u'xyz 456') def test_history_search_again_after_return (self): r = ViModeTest () - r.add_history ('xyz 123') - r.add_history ('xyz 456') - r.add_history ('xyz 789') - r._set_line ('abc def') - r.input ('Escape') - r.input ('"/xyz"') - r.input ('Return') - self.assertEqual (r.line, 'xyz 789') - r.input ('"n"') - self.assertEqual (r.line, 'xyz 456') - r.input ('Return') - self.assertEqual (r.line, '') - r.input ('Escape') - r.input ('"n"') - self.assertEqual (r.line, 'xyz 123') - r.input ('Return') - r.input ('Escape') - r.input ('"N"') - self.assertEqual (r.line, 'xyz 456') + r.add_history (u'xyz 123') + r.add_history (u'xyz 456') + r.add_history (u'xyz 789') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"/xyz"') + r.input (u'Return') + self.assertEqual (r.line, u'xyz 789') + r.input (u'"n"') + self.assertEqual (r.line, u'xyz 456') + r.input (u'Return') + self.assertEqual (r.line, u'') + r.input (u'Escape') + r.input (u'"n"') + self.assertEqual (r.line, u'xyz 123') + r.input (u'Return') + r.input (u'Escape') + r.input (u'"N"') + self.assertEqual (r.line, u'xyz 456') def test_history_search_again_after_search_failed (self): r = ViModeTest () - r.add_history ('xyz 123') - r.add_history ('xyz 456') - r.add_history ('xyz 789') - r._set_line ('abc def') - r.input ('Escape') - r.input ('"/xyz"') - r.input ('Return') - self.assertEqual (r.line, 'xyz 789') - r.input ('"C"') - self.assertEqual (r.line, '') - r.input ('Escape') + r.add_history (u'xyz 123') + r.add_history (u'xyz 456') + r.add_history (u'xyz 789') + r._set_line (u'abc def') + r.input (u'Escape') + r.input (u'"/xyz"') + r.input (u'Return') + self.assertEqual (r.line, u'xyz 789') + r.input (u'"C"') + self.assertEqual (r.line, u'') + r.input (u'Escape') self.assertEqual (r.console.bell_count, 0) - r.input ('"/abc"') - r.input ('Return') + r.input (u'"/abc"') + r.input (u'Return') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 1) - self.assertEqual (r.line, '') - r.input ('Escape') - r.input ('"n"') - self.assertEqual (r.line, '') + self.assertEqual (r.line, u'') + r.input (u'Escape') + r.input (u'"n"') + self.assertEqual (r.line, u'') def test_history_search_and_backspace (self): r = ViModeTest () - r.add_history ('aaa') - r.add_history ('bbb') - r._set_line ('') - r.input ('Escape') - r.input ('"/aaz"') - self.assertEqual (r.line, '/aaz') - r.input ('BackSpace') - self.assertEqual (r.line, '/aa') - r.input ('Return') - self.assertEqual (r.line, 'aaa') - r.input ('Escape') - r.input ('"/z"') - r.input ('BackSpace') - r.input ('BackSpace') - self.assertEqual (r.line, '') - r.input ('"j"') - self.assertEqual (r.line, 'bbb') - r.input ('"k"') - self.assertEqual (r.line, 'aaa') + r.add_history (u'aaa') + r.add_history (u'bbb') + r._set_line (u'') + r.input (u'Escape') + r.input (u'"/aaz"') + self.assertEqual (r.line, u'/aaz') + r.input (u'BackSpace') + self.assertEqual (r.line, u'/aa') + r.input (u'Return') + self.assertEqual (r.line, u'aaa') + r.input (u'Escape') + r.input (u'"/z"') + r.input (u'BackSpace') + r.input (u'BackSpace') + self.assertEqual (r.line, u'') + r.input (u'"j"') + self.assertEqual (r.line, u'bbb') + r.input (u'"k"') + self.assertEqual (r.line, u'aaa') def test_history_insert_mode (self): r = ViModeTest () - r.add_history ('aaa') - r.add_history ('bbb') - r.add_history ('ccc') - r.input ('Up') - self.assertEqual (r.line, 'ccc') + r.add_history (u'aaa') + r.add_history (u'bbb') + r.add_history (u'ccc') + r.input (u'Up') + self.assertEqual (r.line, u'ccc') self.assert_ (r.vi_is_insert_mode) - r.input ('"z"') - self.assertEqual (r.line, 'cccz') - r.input ('Escape') + r.input (u'"z"') + self.assertEqual (r.line, u'cccz') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) - r.input ('Up') - self.assertEqual (r.line, 'bbb') + r.input (u'Up') + self.assertEqual (r.line, u'bbb') self.assert_ (r.vi_is_insert_mode) - r.input ('"z"') - self.assertEqual (r.line, 'bbbz') - r.input ('Escape') - r.input ('"k"') - self.assertEqual (r.line, 'aaa') + r.input (u'"z"') + self.assertEqual (r.line, u'bbbz') + r.input (u'Escape') + r.input (u'"k"') + self.assertEqual (r.line, u'aaa') self.assert_ (not r.vi_is_insert_mode) - r.input ('"iz"') - self.assertEqual (r.line, 'zaaa') - r.input ('Down') - self.assertEqual (r.line, 'bbb') + r.input (u'"iz"') + self.assertEqual (r.line, u'zaaa') + r.input (u'Down') + self.assertEqual (r.line, u'bbb') self.assert_ (r.vi_is_insert_mode) - r.input ('"y"') - self.assertEqual (r.line, 'bbby') - r.input ('Escape') - r.input ('"j"') - self.assertEqual (r.line, 'ccc') + r.input (u'"y"') + self.assertEqual (r.line, u'bbby') + r.input (u'Escape') + r.input (u'"j"') + self.assertEqual (r.line, u'ccc') self.assert_ (not r.vi_is_insert_mode) - r.input ('"iy"') - self.assertEqual (r.line, 'yccc') + r.input (u'"iy"') + self.assertEqual (r.line, u'yccc') self.assert_ (r.vi_is_insert_mode) def test_history_cursor_arrow (self): r = ViModeTest () self.assertEqual (r._history.history_cursor, 0) - r.add_history ('aaa') + r.add_history (u'aaa') self.assertEqual (r._history.history_cursor, 1) - r.add_history ('bbb') + r.add_history (u'bbb') self.assertEqual (r._history.history_cursor, 2) - self.assertEqual (r.line, '') - r.input ('Up') + self.assertEqual (r.line, u'') + r.input (u'Up') self.assertEqual (r._history.history_cursor, 1) - self.assertEqual (r.line, 'bbb') - r.input ('Up') + self.assertEqual (r.line, u'bbb') + r.input (u'Up') self.assertEqual (r._history.history_cursor, 0) - self.assertEqual (r.line, 'aaa') - r.input ('Down') + self.assertEqual (r.line, u'aaa') + r.input (u'Down') self.assertEqual (r._history.history_cursor, 1) - self.assertEqual (r.line, 'bbb') - r.input ('Down') + self.assertEqual (r.line, u'bbb') + r.input (u'Down') self.assertEqual (r._history.history_cursor, 2) - self.assertEqual (r.line, '') - r.input ('Up') + self.assertEqual (r.line, u'') + r.input (u'Up') self.assertEqual (r._history.history_cursor, 1) - self.assertEqual (r.line, 'bbb') + self.assertEqual (r.line, u'bbb') def test_history_control_n_and_p (self): r = ViModeTest () - r.add_history ('aa') - r.add_history ('bbb') - self.assertEqual (r.line, '') - r.input ('Control-p') - self.assertEqual (r.line, 'bbb') + r.add_history (u'aa') + r.add_history (u'bbb') + self.assertEqual (r.line, u'') + r.input (u'Control-p') + self.assertEqual (r.line, u'bbb') self.assertEqual (r.line_cursor, 3) self.assert_ (r.vi_is_insert_mode) - r.input ('Control-p') - self.assertEqual (r.line, 'aa') + r.input (u'Control-p') + self.assertEqual (r.line, u'aa') self.assertEqual (r.line_cursor, 2) self.assert_ (r.vi_is_insert_mode) - r.input ('Control-n') - self.assertEqual (r.line, 'bbb') + r.input (u'Control-n') + self.assertEqual (r.line, u'bbb') self.assertEqual (r.line_cursor, 3) self.assert_ (r.vi_is_insert_mode) - r.input ('Control-n') - self.assertEqual (r.line, '') + r.input (u'Control-n') + self.assertEqual (r.line, u'') self.assertEqual (r.line_cursor, 0) self.assert_ (r.vi_is_insert_mode) - r.input ('Control-p') - self.assertEqual (r.line, 'bbb') + r.input (u'Control-p') + self.assertEqual (r.line, u'bbb') self.assertEqual (r.line_cursor, 3) self.assert_ (r.vi_is_insert_mode) - r.input ('Escape') - self.assertEqual (r.line, 'bbb') + r.input (u'Escape') + self.assertEqual (r.line, u'bbb') self.assertEqual (r.line_cursor, 2) self.assert_ (not r.vi_is_insert_mode) - r.input ('Control-p') - self.assertEqual (r.line, 'aa') + r.input (u'Control-p') + self.assertEqual (r.line, u'aa') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) - r.input ('Control-n') - self.assertEqual (r.line, 'bbb') + r.input (u'Control-n') + self.assertEqual (r.line, u'bbb') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) - r.input ('Control-n') - self.assertEqual (r.line, '') + r.input (u'Control-n') + self.assertEqual (r.line, u'') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) - r.input ('"/a"') - r.input ('Return') - self.assertEqual (r.line, 'aa') + r.input (u'"/a"') + r.input (u'Return') + self.assertEqual (r.line, u'aa') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) - r.input ('Control-n') - self.assertEqual (r.line, 'bbb') + r.input (u'Control-n') + self.assertEqual (r.line, u'bbb') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) def test_history_cursor_j_and_k (self): r = ViModeTest () - r.add_history ('aaa') - r.input ('Escape') - r.input ('"kiz"') - self.assertEqual (r.line, 'zaaa') - r.input ('Escape') - r.input ('"j"') - self.assertEqual (r.line, '') + r.add_history (u'aaa') + r.input (u'Escape') + r.input (u'"kiz"') + self.assertEqual (r.line, u'zaaa') + r.input (u'Escape') + r.input (u'"j"') + self.assertEqual (r.line, u'') def test_history_input_j_and_k (self): r = ViModeTest () - r.add_history ('aaa') - r.input ('Escape') - r.input ('"kAjk"') - self.assertEqual (r.line, 'aaajk') + r.add_history (u'aaa') + r.input (u'Escape') + r.input (u'"kAjk"') + self.assertEqual (r.line, u'aaajk') def test_history_cursor_search (self): r = ViModeTest () - r.add_history ('aaa') - r.input ('Escape') - r.input ('"/a"') - r.input ('Return') - self.assertEqual (r.line, 'aaa') - r.input ('"iz"') - self.assertEqual (r.line, 'zaaa') + r.add_history (u'aaa') + r.input (u'Escape') + r.input (u'"/a"') + r.input (u'Return') + self.assertEqual (r.line, u'aaa') + r.input (u'"iz"') + self.assertEqual (r.line, u'zaaa') self.assertEqual (r.console.bell_count, 0) - r.input ('Escape') - r.input ('"j"') - self.assertEqual (r.line, 'zaaa') + r.input (u'Escape') + r.input (u'"j"') + self.assertEqual (r.line, u'zaaa') # TODO check bell ringing # self.assertEqual (r.console.bell_count, 1) def test_history_undo (self): r = ViModeTest () - r.add_history ('aaa') - r.input ('Escape') - r.input ('"k"') - r.input ('"A b"') - r.input ('Escape') - r.input ('"A c"') - r.input ('Escape') - self.assertEqual (r.line, 'aaa b c') - r.input ('"U"') - self.assertEqual (r.line, 'aaa') + r.add_history (u'aaa') + r.input (u'Escape') + r.input (u'"k"') + r.input (u'"A b"') + r.input (u'Escape') + r.input (u'"A c"') + r.input (u'Escape') + self.assertEqual (r.line, u'aaa b c') + r.input (u'"U"') + self.assertEqual (r.line, u'aaa') def test_history_arrow_undo (self): r = ViModeTest () - r.add_history ('aaa') - r.input ('Up') - r.input ('" zz"') - self.assertEqual (r.line, 'aaa zz') - r.input ('Escape') - r.input ('"u"') - self.assertEqual (r.line, 'aaa') + r.add_history (u'aaa') + r.input (u'Up') + r.input (u'" zz"') + self.assertEqual (r.line, u'aaa zz') + r.input (u'Escape') + r.input (u'"u"') + self.assertEqual (r.line, u'aaa') # TODO: mode support? # def test_mode (self): @@ -1770,356 +1770,356 @@ class Tests (unittest.TestCase): # self.assertEqual (sio.read(), u' 1 abc\n 2 def\n 3 ghi\n') def test_editor (self): - vee = ViExternalEditorTest ('qwerty before') + vee = ViExternalEditorTest (u'qwerty before') self.assert_ (vee.sio_write.closed) - self.assertEqual (vee.command, 'vim.exe temp.py') + self.assertEqual (vee.command, u'vim.exe temp.py') self.assert_ (vee.sio_read.closed) - self.assertEqual (vee.remove, 'temp.py') - self.assertEqual (vee.result, 'qwerty after') + self.assertEqual (vee.remove, u'temp.py') + self.assertEqual (vee.result, u'qwerty after') def test_completer (self): r = ViModeTest () - r.lst_completions = ['aab', 'aac', 'aad', ] - r.input ('"aa"') - r.input ('Tab') - self.assertEqual (r.line, 'aa') - self.assertEqual (r.console.text, '\naab \naac \naad \n') + r.lst_completions = ['aab', u'aac', u'aad', ] + r.input (u'"aa"') + r.input (u'Tab') + self.assertEqual (r.line, u'aa') + self.assertEqual (r.console.text, u'\naab \naac \naad \n') def test_completer_star (self): r = ViModeTest () - r.lst_completions = ['bbc', 'bbd', 'bbe', ] - r.input ('"aa bb"') - r.input ('Escape') + r.lst_completions = ['bbc', u'bbd', u'bbe', ] + r.input (u'"aa bb"') + r.input (u'Escape') self.assert_ (not r.vi_is_insert_mode) - r.input ('"*"') - self.assertEqual (r.line, 'aa bbc bbd bbe ') + r.input (u'"*"') + self.assertEqual (r.line, u'aa bbc bbd bbe ') self.assertEqual (r.line_cursor, 15) self.assert_ (r.vi_is_insert_mode) - self.assertEqual (r.console.text, '') - r.input ('" "') - r.input ('Escape') - self.assertEqual (r.line, 'aa bbc bbd bbe ') + self.assertEqual (r.console.text, u'') + r.input (u'" "') + r.input (u'Escape') + self.assertEqual (r.line, u'aa bbc bbd bbe ') self.assertEqual (r.line_cursor, 15) - r.input ('"."') - self.assertEqual (r.line, 'aa bbc bbd bbe bbc bbd bbe ') + r.input (u'"."') + self.assertEqual (r.line, u'aa bbc bbd bbe bbc bbd bbe ') self.assertEqual (r.line_cursor, 27) def test_completer_beginning_of_line (self): r = ViModeTest () - r.input ('Tab') - self.assertEqual (r.line, ' ') + r.input (u'Tab') + self.assertEqual (r.line, u' ') self.assertEqual (r.line_cursor, 4) - r.input ('Space') - self.assertEqual (r.line, ' ') + r.input (u'Space') + self.assertEqual (r.line, u' ') self.assertEqual (r.line_cursor, 5) - r.input ('Tab') - self.assertEqual (r.line, ' ') + r.input (u'Tab') + self.assertEqual (r.line, u' ') self.assertEqual (r.line_cursor, 8) - r.input ('Space') - r.input ('Space') - r.input ('Space') - self.assertEqual (r.line, ' ') + r.input (u'Space') + r.input (u'Space') + r.input (u'Space') + self.assertEqual (r.line, u' ') self.assertEqual (r.line_cursor, 11) - r.input ('Tab') - self.assertEqual (r.line, ' ') + r.input (u'Tab') + self.assertEqual (r.line, u' ') self.assertEqual (r.line_cursor, 12) - r.input ('Tab') - self.assertEqual (r.line, ' ') + r.input (u'Tab') + self.assertEqual (r.line, u' ') self.assertEqual (r.line_cursor, 16) def test_replace_lower (self): r = ViModeTest () - r._set_line ('aaa bbb ccc') - r.input ('Escape') - r.input ('"0ry"') - self.assertEqual (r.line, 'yaa bbb ccc') + r._set_line (u'aaa bbb ccc') + r.input (u'Escape') + r.input (u'"0ry"') + self.assertEqual (r.line, u'yaa bbb ccc') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) - r.input ('"i"') - self.assertEqual (r.line, 'yaa bbb ccc') + r.input (u'"i"') + self.assertEqual (r.line, u'yaa bbb ccc') self.assertEqual (r.line_cursor, 0) self.assert_ (r.vi_is_insert_mode) - r.input ('"x"') - self.assertEqual (r.line, 'xyaa bbb ccc') + r.input (u'"x"') + self.assertEqual (r.line, u'xyaa bbb ccc') self.assertEqual (r.line_cursor, 1) self.assert_ (r.vi_is_insert_mode) - r.input ('Escape') - self.assertEqual (r.line, 'xyaa bbb ccc') + r.input (u'Escape') + self.assertEqual (r.line, u'xyaa bbb ccc') self.assertEqual (r.line_cursor, 0) self.assert_ (not r.vi_is_insert_mode) - r.input ('"ll"') - r.input ('"2rz"') - self.assertEqual (r.line, 'xyzz bbb ccc') + r.input (u'"ll"') + r.input (u'"2rz"') + self.assertEqual (r.line, u'xyzz bbb ccc') self.assertEqual (r.line_cursor, 3) self.assert_ (not r.vi_is_insert_mode) - r.input ('"w7."') - self.assertEqual (r.line, 'xyzz zzzzzzz') + r.input (u'"w7."') + self.assertEqual (r.line, u'xyzz zzzzzzz') self.assertEqual (r.line_cursor, 11) self.assert_ (not r.vi_is_insert_mode) def test_replace_lower_undo (self): r = ViModeTest () - r._set_line ('aaa') - r.input ('Escape') + r._set_line (u'aaa') + r.input (u'Escape') # print u'xx', sys._getframe().f_lineno, r._vi_undo_cursor, r._vi_undo_stack - r.input ('"0rz"') - self.assertEqual (r.line, 'zaa') - r.input ('"u"') - self.assertEqual (r.line, 'aaa') - r.input ('"2."') - self.assertEqual (r.line, 'zza') - r.input ('"u"') - self.assertEqual (r.line, 'aaa') + r.input (u'"0rz"') + self.assertEqual (r.line, u'zaa') + r.input (u'"u"') + self.assertEqual (r.line, u'aaa') + r.input (u'"2."') + self.assertEqual (r.line, u'zza') + r.input (u'"u"') + self.assertEqual (r.line, u'aaa') def test_replace_lower_escape (self): r = ViModeTest () - r._set_line ('aaa') - r.input ('Escape') - r.input ('"0r"') - self.assertEqual (r.line, 'aaa') - r.input ('Escape') - self.assertEqual (r.line, 'aaa') - r.input ('"r"') - self.assertEqual (r.line, 'aaa') - r.input ('"z"') - self.assertEqual (r.line, 'zaa') + r._set_line (u'aaa') + r.input (u'Escape') + r.input (u'"0r"') + self.assertEqual (r.line, u'aaa') + r.input (u'Escape') + self.assertEqual (r.line, u'aaa') + r.input (u'"r"') + self.assertEqual (r.line, u'aaa') + r.input (u'"z"') + self.assertEqual (r.line, u'zaa') def test_replace_lower_escape_undo (self): r = ViModeTest () - r._set_line ('aa bb cc') - r.input ('Escape') - r.input ('"0cwdd"') - r.input ('Escape') - self.assertEqual (r.line, 'dd bb cc') - r.input ('"wr"') - r.input ('Escape') - self.assertEqual (r.line, 'dd bb cc') - r.input ('"."') - self.assertEqual (r.line, 'dd dd cc') - r.input ('"u"') - self.assertEqual (r.line, 'dd bb cc') - r.input ('"u"') - self.assertEqual (r.line, 'aa bb cc') + r._set_line (u'aa bb cc') + r.input (u'Escape') + r.input (u'"0cwdd"') + r.input (u'Escape') + self.assertEqual (r.line, u'dd bb cc') + r.input (u'"wr"') + r.input (u'Escape') + self.assertEqual (r.line, u'dd bb cc') + r.input (u'"."') + self.assertEqual (r.line, u'dd dd cc') + r.input (u'"u"') + self.assertEqual (r.line, u'dd bb cc') + r.input (u'"u"') + self.assertEqual (r.line, u'aa bb cc') def test_replace_dot (self): r = ViModeTest () - r._set_line ('ab') - r.input ('Escape') - r.input ('"0rzl"') - self.assertEqual (r.line, 'zb') + r._set_line (u'ab') + r.input (u'Escape') + r.input (u'"0rzl"') + self.assertEqual (r.line, u'zb') self.assertEqual (r.line_cursor, 1) self.assert_ (not r.vi_is_insert_mode) - r.input ('"r."') - self.assertEqual (r.line, 'z.') + r.input (u'"r."') + self.assertEqual (r.line, u'z.') self.assertEqual (r.line_cursor, 1) self.assert_ (not r.vi_is_insert_mode) def test_replace_upper (self): r = ViModeTest () - r._set_line ('aaa bbb') - r.input ('Escape') - r.input ('"0wR"') - self.assertEqual (r.line, 'aaa bbb') + r._set_line (u'aaa bbb') + r.input (u'Escape') + r.input (u'"0wR"') + self.assertEqual (r.line, u'aaa bbb') self.assertEqual (r.line_cursor, 4) self.assert_ (r.vi_is_insert_mode) - r.input ('"z"') - self.assertEqual (r.line, 'aaa zbb') + r.input (u'"z"') + self.assertEqual (r.line, u'aaa zbb') self.assertEqual (r.line_cursor, 5) self.assert_ (r.vi_is_insert_mode) - r.input ('"zzz"') - self.assertEqual (r.line, 'aaa zzzz') + r.input (u'"zzz"') + self.assertEqual (r.line, u'aaa zzzz') self.assertEqual (r.line_cursor, 8) self.assert_ (r.vi_is_insert_mode) - r.input ('Escape') + r.input (u'Escape') self.assertEqual (r.line_cursor, 7) self.assert_ (not r.vi_is_insert_mode) def test_replace_upper_dot (self): r = ViModeTest () - r._set_line ('aaa bbb ccc ddd') - r.input ('Escape') - r.input ('"02Rz"') - r.input ('Escape') - self.assertEqual (r.line, 'zza bbb ccc ddd') + r._set_line (u'aaa bbb ccc ddd') + r.input (u'Escape') + r.input (u'"02Rz"') + r.input (u'Escape') + self.assertEqual (r.line, u'zza bbb ccc ddd') self.assertEqual (r.line_cursor, 1) self.assert_ (not r.vi_is_insert_mode) - r.input ('"w."') - self.assertEqual (r.line, 'zza zzb ccc ddd') + r.input (u'"w."') + self.assertEqual (r.line, u'zza zzb ccc ddd') self.assertEqual (r.line_cursor, 5) self.assert_ (not r.vi_is_insert_mode) - r.input ('"w6."') - self.assertEqual (r.line, 'zza zzb zzzzzzd') + r.input (u'"w6."') + self.assertEqual (r.line, u'zza zzb zzzzzzd') self.assertEqual (r.line_cursor, 13) self.assert_ (not r.vi_is_insert_mode) def test_replace_upper_undo (self): r = ViModeTest () - r._set_line ('aaa bbb ccc') - r.input ('Escape') - r.input ('"0Rzz"') - r.input ('Escape') - self.assertEqual (r.line, 'zza bbb ccc') - r.input ('"w3."') - self.assertEqual (r.line, 'zza zzzzzzc') - r.input ('"u"') - self.assertEqual (r.line, 'zza bbb ccc') - r.input ('"u"') - self.assertEqual (r.line, 'aaa bbb ccc') + r._set_line (u'aaa bbb ccc') + r.input (u'Escape') + r.input (u'"0Rzz"') + r.input (u'Escape') + self.assertEqual (r.line, u'zza bbb ccc') + r.input (u'"w3."') + self.assertEqual (r.line, u'zza zzzzzzc') + r.input (u'"u"') + self.assertEqual (r.line, u'zza bbb ccc') + r.input (u'"u"') + self.assertEqual (r.line, u'aaa bbb ccc') def test_replace_backspace_and_dot (self): r = ViModeTest () - r._set_line ('aa bb') - r.input ('Escape') - r.input ('"0wRc"') - self.assertEqual (r.line, 'aa cb') + r._set_line (u'aa bb') + r.input (u'Escape') + r.input (u'"0wRc"') + self.assertEqual (r.line, u'aa cb') self.assertEqual (r.line_cursor, 4) self.assert_ (r.vi_is_insert_mode) - r.input ('"c"') - self.assertEqual (r.line, 'aa cc') + r.input (u'"c"') + self.assertEqual (r.line, u'aa cc') self.assertEqual (r.line_cursor, 5) - r.input ('"c"') - self.assertEqual (r.line, 'aa ccc') + r.input (u'"c"') + self.assertEqual (r.line, u'aa ccc') self.assertEqual (r.line_cursor, 6) - r.input ('BackSpace') - self.assertEqual (r.line, 'aa cc') + r.input (u'BackSpace') + self.assertEqual (r.line, u'aa cc') self.assertEqual (r.line_cursor, 5) self.assert_ (r.vi_is_insert_mode) - r.input ('BackSpace') - self.assertEqual (r.line, 'aa cb') + r.input (u'BackSpace') + self.assertEqual (r.line, u'aa cb') self.assertEqual (r.line_cursor, 4) self.assert_ (r.vi_is_insert_mode) - r.input ('BackSpace') - self.assertEqual (r.line, 'aa bb') + r.input (u'BackSpace') + self.assertEqual (r.line, u'aa bb') self.assertEqual (r.line_cursor, 3) self.assert_ (r.vi_is_insert_mode) - r.input ('BackSpace') - self.assertEqual (r.line, 'aa bb') + r.input (u'BackSpace') + self.assertEqual (r.line, u'aa bb') self.assertEqual (r.line_cursor, 2) self.assert_ (r.vi_is_insert_mode) - r.input ('"d"') - self.assertEqual (r.line, 'aadbb') + r.input (u'"d"') + self.assertEqual (r.line, u'aadbb') self.assertEqual (r.line_cursor, 3) self.assert_ (r.vi_is_insert_mode) - r.input ('Escape') - self.assertEqual (r.line, 'aadbb') + r.input (u'Escape') + self.assertEqual (r.line, u'aadbb') self.assertEqual (r.line_cursor, 2) self.assert_ (not r.vi_is_insert_mode) - r.input ('"u"') - self.assertEqual (r.line, 'aa bb') + r.input (u'"u"') + self.assertEqual (r.line, u'aa bb') self.assertEqual (r.line_cursor, 3) self.assert_ (not r.vi_is_insert_mode) - r.input ('"hh"') - r.input ('"."') - self.assertEqual (r.line, 'da bb') + r.input (u'"hh"') + r.input (u'"."') + self.assertEqual (r.line, u'da bb') self.assert_ (not r.vi_is_insert_mode) def test_yank_line (self): r = ViModeTest () - r._set_line ('aa bb') - r.input ('Escape') - r.input ('"0wY"') - self.assertEqual (r.line, 'aa bb') + r._set_line (u'aa bb') + r.input (u'Escape') + r.input (u'"0wY"') + self.assertEqual (r.line, u'aa bb') self.assert_ (not r.vi_is_insert_mode) - r.input ('"P"') - self.assertEqual (r.line, 'aa aa bbbb') + r.input (u'"P"') + self.assertEqual (r.line, u'aa aa bbbb') self.assert_ (not r.vi_is_insert_mode) - r.input ('"u"') - self.assertEqual (r.line, 'aa bb') + r.input (u'"u"') + self.assertEqual (r.line, u'aa bb') self.assert_ (not r.vi_is_insert_mode) def test_column (self): r = ViModeTest () - r._set_line ('aaa bbb') - r.input ('Escape') - r.input ('"099|"') - self.assertEqual (r.line, 'aaa bbb') + r._set_line (u'aaa bbb') + r.input (u'Escape') + r.input (u'"099|"') + self.assertEqual (r.line, u'aaa bbb') self.assertEqual (r.line_cursor, 6) - r.input ('"4|"') - self.assertEqual (r.line, 'aaa bbb') + r.input (u'"4|"') + self.assertEqual (r.line, u'aaa bbb') self.assertEqual (r.line_cursor, 3) - r.input ('"d1|"') - self.assertEqual (r.line, ' bbb') + r.input (u'"d1|"') + self.assertEqual (r.line, u' bbb') self.assertEqual (r.line_cursor, 0) - r.input ('"u"') - self.assertEqual (r.line, 'aaa bbb') + r.input (u'"u"') + self.assertEqual (r.line, u'aaa bbb') self.assertEqual (r.line_cursor, 3) - r.input ('"d7|"') - self.assertEqual (r.line, 'aaab') + r.input (u'"d7|"') + self.assertEqual (r.line, u'aaab') self.assertEqual (r.line_cursor, 3) def test_change_case (self): r = ViModeTest () - r._set_line ('aaa B7B ccc') - r.input ('Escape') - r.input ('"0~"') - self.assertEqual (r.line, 'Aaa B7B ccc') + r._set_line (u'aaa B7B ccc') + r.input (u'Escape') + r.input (u'"0~"') + self.assertEqual (r.line, u'Aaa B7B ccc') self.assertEqual (r.line_cursor, 1) self.assert_ (not r.vi_is_insert_mode) - r.input ('"h."') - self.assertEqual (r.line, 'aaa B7B ccc') + r.input (u'"h."') + self.assertEqual (r.line, u'aaa B7B ccc') self.assertEqual (r.line_cursor, 1) self.assert_ (not r.vi_is_insert_mode) - r.input ('"9~"') - self.assertEqual (r.line, 'aAA b7b CCc') + r.input (u'"9~"') + self.assertEqual (r.line, u'aAA b7b CCc') self.assertEqual (r.line_cursor, 10) self.assert_ (not r.vi_is_insert_mode) - r.input ('"u"') - self.assertEqual (r.line, 'aaa B7B ccc') + r.input (u'"u"') + self.assertEqual (r.line, u'aaa B7B ccc') self.assertEqual (r.line_cursor, 1) self.assert_ (not r.vi_is_insert_mode) def test_redo (self): r = ViModeTest () - r._set_line ('') - r.input ('Escape') - r.input ('"Saaa"') - self.assertEqual (r.line, 'aaa') - r.input ('Escape') - r.input ('"Sbbb"') - self.assertEqual (r.line, 'bbb') - r.input ('Escape') - r.input ('"Sccc"') - r.input ('Escape') - self.assertEqual (r.line, 'ccc') - r.input ('"u"') - self.assertEqual (r.line, 'bbb') - r.input ('Control-r') - self.assertEqual (r.line, 'ccc') - r.input ('"u"') - self.assertEqual (r.line, 'bbb') - r.input ('"u"') - self.assertEqual (r.line, 'aaa') - r.input ('"u"') - self.assertEqual (r.line, '') - r.input ('"u"') - self.assertEqual (r.line, '') - r.input ('Control-r') - self.assertEqual (r.line, 'aaa') - r.input ('Control-r') - self.assertEqual (r.line, 'bbb') - r.input ('Control-r') - self.assertEqual (r.line, 'ccc') - r.input ('Control-r') - self.assertEqual (r.line, 'ccc') - r.input ('"u"') - self.assertEqual (r.line, 'bbb') - r.input ('"Szzz"') - r.input ('Escape') - self.assertEqual (r.line, 'zzz') - r.input ('"u"') - self.assertEqual (r.line, 'bbb') - r.input ('Control-r') - self.assertEqual (r.line, 'zzz') - r.input ('"U"') - self.assertEqual (r.line, '') - r.input ('Control-r') - self.assertEqual (r.line, 'aaa') - r.input ('Control-r') - self.assertEqual (r.line, 'bbb') - r.input ('Control-r') - self.assertEqual (r.line, 'zzz') - r.input ('Control-r') - self.assertEqual (r.line, 'zzz') + r._set_line (u'') + r.input (u'Escape') + r.input (u'"Saaa"') + self.assertEqual (r.line, u'aaa') + r.input (u'Escape') + r.input (u'"Sbbb"') + self.assertEqual (r.line, u'bbb') + r.input (u'Escape') + r.input (u'"Sccc"') + r.input (u'Escape') + self.assertEqual (r.line, u'ccc') + r.input (u'"u"') + self.assertEqual (r.line, u'bbb') + r.input (u'Control-r') + self.assertEqual (r.line, u'ccc') + r.input (u'"u"') + self.assertEqual (r.line, u'bbb') + r.input (u'"u"') + self.assertEqual (r.line, u'aaa') + r.input (u'"u"') + self.assertEqual (r.line, u'') + r.input (u'"u"') + self.assertEqual (r.line, u'') + r.input (u'Control-r') + self.assertEqual (r.line, u'aaa') + r.input (u'Control-r') + self.assertEqual (r.line, u'bbb') + r.input (u'Control-r') + self.assertEqual (r.line, u'ccc') + r.input (u'Control-r') + self.assertEqual (r.line, u'ccc') + r.input (u'"u"') + self.assertEqual (r.line, u'bbb') + r.input (u'"Szzz"') + r.input (u'Escape') + self.assertEqual (r.line, u'zzz') + r.input (u'"u"') + self.assertEqual (r.line, u'bbb') + r.input (u'Control-r') + self.assertEqual (r.line, u'zzz') + r.input (u'"U"') + self.assertEqual (r.line, u'') + r.input (u'Control-r') + self.assertEqual (r.line, u'aaa') + r.input (u'Control-r') + self.assertEqual (r.line, u'bbb') + r.input (u'Control-r') + self.assertEqual (r.line, u'zzz') + r.input (u'Control-r') + self.assertEqual (r.line, u'zzz') #---------------------------------------------------------------------- # utility functions @@ -2127,20 +2127,20 @@ class Tests (unittest.TestCase): #---------------------------------------------------------------------- -if __name__ == '__main__': +if __name__ == u'__main__': Tester() - tested=list(ViModeTest.tested_commands.keys()) + tested=ViModeTest.tested_commands.keys() tested.sort() - print(" Tested functions ".center(60,"-")) - print("\n".join(tested)) - print() + print " Tested functions ".center(60,"-") + print "\n".join(tested) + print - all_funcs=dict([(x.__name__,x) for x in list(ViModeTest().key_dispatch.values())]) - all_funcs=list(all_funcs.keys()) + all_funcs=dict([(x.__name__,x) for x in ViModeTest().key_dispatch.values()]) + all_funcs=all_funcs.keys() not_tested=[x for x in all_funcs if x not in tested] not_tested.sort() - print(" Not tested functions ".center(60,"-")) - print("\n".join(not_tested)) + print " Not tested functions ".center(60,"-") + print "\n".join(not_tested) diff --git a/pyreadline/unicode_helper.py b/pyreadline/unicode_helper.py index 4e867cc..bf171ab 100644 --- a/pyreadline/unicode_helper.py +++ b/pyreadline/unicode_helper.py @@ -12,25 +12,25 @@ try: except AttributeError: # This error occurs when pdb imports readline and doctest has replaced # stdout with stdout collector. We will assume ascii codepage - pyreadline_codepage = "ascii" + pyreadline_codepage = u"ascii" if pyreadline_codepage is None: - pyreadline_codepage = "ascii" + pyreadline_codepage = u"ascii" -def ensure_str(text): - """helper to ensure that text passed to WriteConsoleW is unicode""" - if isinstance(text, bytes): - try: - return text.decode(pyreadline_codepage, "replace") - except (LookupError, TypeError): - return text.decode("ascii", "replace") - return text - -def ensure_bytes(text): - """Convert unicode to str using pyreadline_codepage""" +def ensure_unicode(text): + u"""helper to ensure that text passed to WriteConsoleW is unicode""" if isinstance(text, str): try: - return text.encode(pyreadline_codepage, "replace") + return text.decode(pyreadline_codepage, u"replace") except (LookupError, TypeError): - return text.encode("ascii", "replace") + return text.decode(u"ascii", u"replace") + return text + +def ensure_str(text): + u"""Convert unicode to str using pyreadline_codepage""" + if isinstance(text, unicode): + try: + return text.encode(pyreadline_codepage, u"replace") + except (LookupError, TypeError): + return text.encode(u"ascii", u"replace") return text diff --git a/readline.py b/readline.py index 17107a8..99db186 100644 --- a/readline.py +++ b/readline.py @@ -39,7 +39,7 @@ if rl.disable_readline: globals()[funk] = dummy else: def GetOutputFile(): - '''Return the console object used by readline so that it can be used for printing in color.''' + u'''Return the console object used by readline so that it can be used for printing in color.''' return rl.console __all__.append("GetOutputFile") diff --git a/setup.py b/setup.py index 504b125..79a698b 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ if os.path.exists('MANIFEST'): os.remove('MANIFEST') # from distutils.core import setup -exec(compile(open('pyreadline/release.py').read(), 'pyreadline/release.py', 'exec')) +execfile('pyreadline/release.py') try: import sphinx From 07229069568a74697e35e685e299bec88d6cd17c Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Sat, 9 Apr 2011 16:21:32 +0900 Subject: [PATCH 09/19] remove relative import for adapt to 2to3 --- pyreadline/test/test_emacs.py | 4 ++-- pyreadline/test/test_vi.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyreadline/test/test_emacs.py b/pyreadline/test/test_emacs.py index 8554f18..534dbdb 100644 --- a/pyreadline/test/test_emacs.py +++ b/pyreadline/test/test_emacs.py @@ -9,12 +9,12 @@ import sys, unittest import pdb -sys.path.append (u'../..') +sys.path.insert(0, u'../..') from pyreadline.modes.emacs import * from pyreadline import keysyms from pyreadline.lineeditor import lineobj -from common import * +from pyreadline.test.common import * from pyreadline.logger import log import pyreadline.logger as logger logger.sock_silent=True diff --git a/pyreadline/test/test_vi.py b/pyreadline/test/test_vi.py index 8b5c904..6504556 100644 --- a/pyreadline/test/test_vi.py +++ b/pyreadline/test/test_vi.py @@ -7,15 +7,15 @@ #***************************************************************************** import sys, unittest,pdb -sys.path.append (u'../..') +sys.path.insert(0, u'../..') from pyreadline.modes.vi import * from pyreadline import keysyms from pyreadline.lineeditor import lineobj from pyreadline.logger import log import pyreadline.logger as logger -from common import * +from pyreadline.test.common import * -from common import * +from pyreadline.test.common import * #---------------------------------------------------------------------- class ViModeTest (ViMode): From 88df4051ed09c2c9485d498a38446d6a044a9c7c Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Sat, 9 Apr 2011 16:52:04 +0900 Subject: [PATCH 10/19] remove 'exceptions' package name. it is not need in Python2 and Python3. --- pyreadline/lineeditor/history.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pyreadline/lineeditor/history.py b/pyreadline/lineeditor/history.py index 3eae6dd..dd1362f 100644 --- a/pyreadline/lineeditor/history.py +++ b/pyreadline/lineeditor/history.py @@ -15,9 +15,7 @@ else: import lineobj -import exceptions - -class EscapeHistory(exceptions.Exception): +class EscapeHistory(Exception): pass from pyreadline.logger import log From 452c5d831c43adc7292f320502806335c4eebc8a Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Sat, 9 Apr 2011 17:06:00 +0900 Subject: [PATCH 11/19] add ignore for python3's pyc cache directory. --- .bzrignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.bzrignore b/.bzrignore index 378eac2..c095e69 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1 +1,2 @@ build +__pycache__/ From bf8f52bad95234a93882192ae587f5f6dd695dde Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Sat, 9 Apr 2011 18:04:41 +0900 Subject: [PATCH 12/19] bytes/str/unicode tweaking for py2/3. --- pyreadline/console/console.py | 9 ++++++--- pyreadline/modes/basemode.py | 4 ++-- pyreadline/unicode_helper.py | 5 ++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/pyreadline/console/console.py b/pyreadline/console/console.py index 2204003..9487b88 100644 --- a/pyreadline/console/console.py +++ b/pyreadline/console/console.py @@ -30,6 +30,9 @@ try: except ImportError: raise ImportError(u"You need ctypes to run this code") +if sys.version_info < (2, 6): + bytes = str + def nolog(string): pass @@ -690,7 +693,7 @@ def hook_wrapper_23(stdin, stdout, prompt): # call the Python hook res = ensure_str(readline_hook(prompt)) # make sure it returned the right sort of thing - if res and not isinstance(res, str): + if res and not isinstance(res, bytes): raise TypeError, u'readline must return a string.' except KeyboardInterrupt: # GNU readline returns 0 on keyboard interrupt @@ -714,7 +717,7 @@ def hook_wrapper(prompt): # call the Python hook res = ensure_str(readline_hook(prompt)) # make sure it returned the right sort of thing - if res and not isinstance(res, str): + if res and not isinstance(res, bytes): raise TypeError, u'readline must return a string.' except KeyboardInterrupt: # GNU readline returns 0 on keyboard interrupt @@ -738,7 +741,7 @@ def install_readline(hook): readline_hook = hook # get the address of PyOS_ReadlineFunctionPointer so we can update it PyOS_RFP = c_int.from_address(Console.GetProcAddress(sys.dllhandle, - "PyOS_ReadlineFunctionPointer")) + "PyOS_ReadlineFunctionPointer".encode('ascii'))) # save a reference to the generated C-callable so it doesn't go away if sys.version < '2.3': readline_ref = HOOKFUNC22(hook_wrapper) diff --git a/pyreadline/modes/basemode.py b/pyreadline/modes/basemode.py index df1147d..35e2e79 100644 --- a/pyreadline/modes/basemode.py +++ b/pyreadline/modes/basemode.py @@ -195,7 +195,7 @@ class BaseMode(object): i = 0 while 1: try: - r = ensure_unicode(self.completer(text, i)) + r = self.completer(ensure_unicode(text), i) except IndexError: break i += 1 @@ -215,7 +215,7 @@ class BaseMode(object): break text = ensure_str(u''.join(buf[self.begidx:self.endidx])) log(u'file complete text="%s"' % ensure_unicode(text)) - completions = map(ensure_unicode, glob.glob(os.path.expanduser(text) + '*')) + completions = map(ensure_unicode, glob.glob(os.path.expanduser(text) + '*'.encode('ascii'))) if self.mark_directories == u'on': mc = [] for f in completions: diff --git a/pyreadline/unicode_helper.py b/pyreadline/unicode_helper.py index bf171ab..7fffd9f 100644 --- a/pyreadline/unicode_helper.py +++ b/pyreadline/unicode_helper.py @@ -17,9 +17,12 @@ except AttributeError: if pyreadline_codepage is None: pyreadline_codepage = u"ascii" +if sys.version_info < (2, 6): + bytes = str + def ensure_unicode(text): u"""helper to ensure that text passed to WriteConsoleW is unicode""" - if isinstance(text, str): + if isinstance(text, bytes): try: return text.decode(pyreadline_codepage, u"replace") except (LookupError, TypeError): From 317402ad248c5464321997fa114e1a78e046cf87 Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Sat, 9 Apr 2011 18:15:19 +0900 Subject: [PATCH 13/19] new module was deprecated at python2.6 and types work with py2/3. --- pyreadline/rlmain.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyreadline/rlmain.py b/pyreadline/rlmain.py index 66e469a..23deb9d 100644 --- a/pyreadline/rlmain.py +++ b/pyreadline/rlmain.py @@ -282,9 +282,9 @@ class BaseReadline(object): self.mode = modes[name] def bind_key(key, name): - import new + import types if callable(name): - modes[mode]._bind_key(key, new.instancemethod(name, modes[mode], modes[mode].__class__)) + modes[mode]._bind_key(key, types.MethodType(name, modes[mode])) elif hasattr(modes[mode], name): modes[mode]._bind_key(key, getattr(modes[mode], name)) else: From 08f4cf1c2bc3a5c3713f4f7411149656495fdde9 Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Sat, 9 Apr 2011 18:22:08 +0900 Subject: [PATCH 14/19] bytes/str/unicode tweaking for py2/3. --- pyreadline/lineeditor/history.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyreadline/lineeditor/history.py b/pyreadline/lineeditor/history.py index dd1362f..2716417 100644 --- a/pyreadline/lineeditor/history.py +++ b/pyreadline/lineeditor/history.py @@ -91,7 +91,7 @@ class LineHistory(object): fp = open(filename, u'wb') for line in self.history[-self.history_length:]: fp.write(ensure_str(line.get_line_text())) - fp.write(u'\n') + fp.write('\n'.encode('ascii')) fp.close() From d398d1e98786443d8c06e6c83185cce7e057f90c Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Sat, 9 Apr 2011 18:46:51 +0900 Subject: [PATCH 15/19] bytes/str/unicode tweaking for py2/3. --- pyreadline/console/console.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyreadline/console/console.py b/pyreadline/console/console.py index 9487b88..84e65f6 100644 --- a/pyreadline/console/console.py +++ b/pyreadline/console/console.py @@ -289,7 +289,7 @@ class Console(object): # This pattern should match all characters that change the cursor position differently # than a normal character. - motion_char_re = re.compile(u'([\n\r\t\010\007])') + motion_char_re = re.compile('([\n\r\t\010\007])'.encode('ascii')) def write_scrolling(self, text, attr=None): u'''write text at current cursor position while watching for scrolling. @@ -309,7 +309,7 @@ class Console(object): w, h = self.size() scroll = 0 # the result # split the string into ordinary characters and funny characters - chunks = self.motion_char_re.split(text) + chunks = self.motion_char_re.split(ensure_str(text)) for chunk in chunks: n = self.write_color(chunk, attr) if len(chunk) == 1: # the funny characters will be alone From d2e943c6708b0a2051c719563d79f8db1fb37b17 Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Sun, 10 Apr 2011 02:09:27 +0900 Subject: [PATCH 16/19] remove syntax rely on python2. --- eggsetup.py | 2 +- pyreadline/release.py | 50 +++++++++++++++++++++---------------------- setup.py | 2 +- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/eggsetup.py b/eggsetup.py index b5bcf75..7661d85 100644 --- a/eggsetup.py +++ b/eggsetup.py @@ -8,7 +8,7 @@ #***************************************************************************** import glob from setuptools import setup,find_packages -execfile('pyreadline/release.py') +exec(compile(open('pyreadline/release.py').read(), 'pyreadline/release.py', 'exec')) setup(name=name, version = version, diff --git a/pyreadline/release.py b/pyreadline/release.py index 43859f6..38926f6 100644 --- a/pyreadline/release.py +++ b/pyreadline/release.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -u"""Release data for the pyreadline project. +"""Release data for the pyreadline project. $Id$""" @@ -13,23 +13,23 @@ $Id$""" # Name of the package for release purposes. This is the name which labels # the tarballs and RPMs made by distutils, so it's best to lowercase it. -name = u'pyreadline' +name = 'pyreadline' # For versions with substrings (like 0.6.16.svn), use an extra . to separate # the new substring. We have to avoid using either dashes or underscores, # because bdist_rpm does not accept dashes (an RPM) convention, and # bdist_deb does not accept underscores (a Debian convention). -branch = u'' +branch = '' -version = u'1.7' +version = '1.7' -revision = u'$Revision$' +revision = '$Revision$' -description = u"A python implmementation of GNU readline." +description = "A python implmementation of GNU readline." long_description = \ -u""" +""" The pyreadline package is a python implementation of GNU readline functionality it is based on the ctypes based UNC readline package by Gary Bishop. It is not complete. It has been tested for use with windows 2000 and windows xp. @@ -51,31 +51,31 @@ Features: .. _repository: """ -license = u'BSD' +license = 'BSD' -authors = {u'Jorgen' : (u'Jorgen Stenarson',u'jorgen.stenarson@bostream.nu'), - u'Gary': (u'Gary Bishop', ''), - u'Jack': (u'Jack Trainor', ''), +authors = {'Jorgen' : ('Jorgen Stenarson','jorgen.stenarson@bostream.n'), + 'Gary': ('Gary Bishop', ''), + 'Jack': ('Jack Trainor', ''), } -url = u'http://ipython.scipy.org/moin/PyReadline/Intro' +url = 'http://ipython.scipy.org/moin/PyReadline/Intro' -download_url = u'https://launchpad.net/pyreadline/+download' +download_url = 'https://launchpad.net/pyreadline/+download' -platforms = [u'Windows XP/2000/NT', - u'Windows 95/98/ME'] +platforms = ['Windows XP/2000/NT', + 'Windows 95/98/ME'] -keywords = [u'readline', - u'pyreadline'] +keywords = ['readline', + 'pyreadline'] -classifiers = [u'Development Status :: 5 - Production/Stable', - u'Environment :: Console', - u'Operating System :: Microsoft :: Windows', - u'License :: OSI Approved :: BSD License', - u'Programming Language :: Python :: 2.4', - u'Programming Language :: Python :: 2.5', - u'Programming Language :: Python :: 2.6', - u'Programming Language :: Python :: 2.7', +classifiers = ['Development Status :: 5 - Production/Stable', + 'Environment :: Console', + 'Operating System :: Microsoft :: Windows', + 'License :: OSI Approved :: BSD License', + 'Programming Language :: Python :: 2.4', + 'Programming Language :: Python :: 2.5', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', ] diff --git a/setup.py b/setup.py index 79a698b..504b125 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ if os.path.exists('MANIFEST'): os.remove('MANIFEST') # from distutils.core import setup -execfile('pyreadline/release.py') +exec(compile(open('pyreadline/release.py').read(), 'pyreadline/release.py', 'exec')) try: import sphinx From 88b892079d8d3fb82ad04287b48ef6ea93963e2e Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Sun, 10 Apr 2011 03:00:18 +0900 Subject: [PATCH 17/19] setup now have 2to3 sequence that functionality depend on `distribute` package. --- .bzrignore | 2 ++ pyreadline/release.py | 3 ++- setup.py | 21 ++++++++++++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/.bzrignore b/.bzrignore index c095e69..5d658c0 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1,2 +1,4 @@ build +dist +pyreadline.egg-info/ __pycache__/ diff --git a/pyreadline/release.py b/pyreadline/release.py index 38926f6..db5cb03 100644 --- a/pyreadline/release.py +++ b/pyreadline/release.py @@ -53,7 +53,7 @@ Features: license = 'BSD' -authors = {'Jorgen' : ('Jorgen Stenarson','jorgen.stenarson@bostream.n'), +authors = {'Jorgen' : ('Jorgen Stenarson','jorgen.stenarson@bostream.nu'), 'Gary': ('Gary Bishop', ''), 'Jack': ('Jack Trainor', ''), } @@ -76,6 +76,7 @@ classifiers = ['Development Status :: 5 - Production/Stable', 'Programming Language :: Python :: 2.5', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.2', ] diff --git a/setup.py b/setup.py index 504b125..9501c1d 100644 --- a/setup.py +++ b/setup.py @@ -9,6 +9,7 @@ #***************************************************************************** import os +import sys import glob # BEFORE importing distutils, remove MANIFEST. distutils doesn't properly @@ -16,7 +17,24 @@ import glob if os.path.exists('MANIFEST'): os.remove('MANIFEST') # -from distutils.core import setup +extra = {} +_distribute = False + +try: + import setuptools + setup = setuptools.setup + _distribute = getattr(setuptools, '_distribute', False) +except ImportError: + from distutils.core import setup + +if sys.version_info >= (3, 0): + if _distribute == False: + raise RuntimeError('You must installed `distribute` to setup pyreadline with Python3') + + extra.update( + use_2to3=True + ) + exec(compile(open('pyreadline/release.py').read(), 'pyreadline/release.py', 'exec')) try: @@ -50,5 +68,6 @@ setup(name=name, package_data = {'pyreadline':['configuration/*']}, data_files = [], cmdclass = cmd_class, + **extra ) From 10b2612e143cf09f87c62830c98bfd1e04ef18a4 Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Sun, 10 Apr 2011 03:16:43 +0900 Subject: [PATCH 18/19] update documents. --- doc/ChangeLog | 3 +++ doc/source/introduction.rst | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 730a5fe..2854b86 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,6 @@ +2011-04-10 Takayuki SHIMIZUKAWA + * Python3 ready. + 2008-08-25 Jörgen Stenarson * Merging tab insert patch from Vivian De Smedt. Removed comments with vds initials. diff --git a/doc/source/introduction.rst b/doc/source/introduction.rst index 924a7a4..3b5ae9d 100644 --- a/doc/source/introduction.rst +++ b/doc/source/introduction.rst @@ -11,7 +11,7 @@ like python library can also be useful when implementing commandline like interfaces in GUIs. The use of pyreadline for anything but the windows console is still under development. -The pyreadline module does not yet support Python 3.x this will be targeted for the 2.0 version. +The pyreadline module support also Python 3.x. Dependencies From 2a03c0cab6b189639ab52b172c92e596f7be6100 Mon Sep 17 00:00:00 2001 From: shimizukawa <> Date: Sat, 23 Apr 2011 17:25:23 +0900 Subject: [PATCH 19/19] fixed: bytes iteration generate int literal instead of bytes literal --- pyreadline/lineeditor/lineobj.py | 6 +++--- pyreadline/unicode_helper.py | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pyreadline/lineeditor/lineobj.py b/pyreadline/lineeditor/lineobj.py index 4347ffb..25ab657 100644 --- a/pyreadline/lineeditor/lineobj.py +++ b/pyreadline/lineeditor/lineobj.py @@ -10,7 +10,7 @@ import re, operator, sys import wordmatcher import pyreadline.clipboard as clipboard from pyreadline.logger import log -from pyreadline.unicode_helper import ensure_unicode +from pyreadline.unicode_helper import ensure_unicode, biter kill_ring_to_clipboard = False #set to true to copy every addition to kill ring to clipboard @@ -272,12 +272,12 @@ class TextLine(object): def _insert_text(self, text, argument=1): text = text * argument if self.overwrite: - for c in text: + for c in biter(text): #if self.point: self.line_buffer[self.point] = c self.point += 1 else: - for c in text: + for c in biter(text): self.line_buffer.insert(self.point, c) self.point += 1 diff --git a/pyreadline/unicode_helper.py b/pyreadline/unicode_helper.py index 7fffd9f..7bb8811 100644 --- a/pyreadline/unicode_helper.py +++ b/pyreadline/unicode_helper.py @@ -20,6 +20,8 @@ if pyreadline_codepage is None: if sys.version_info < (2, 6): bytes = str +PY3 = (sys.version_info >= (3, 0)) + def ensure_unicode(text): u"""helper to ensure that text passed to WriteConsoleW is unicode""" if isinstance(text, bytes): @@ -37,3 +39,9 @@ def ensure_str(text): except (LookupError, TypeError): return text.encode(u"ascii", u"replace") return text + +def biter(text): + if PY3 and isinstance(text, bytes): + return (s.to_bytes(1, 'big') for s in text) + else: + return iter(text)