From 888dc1988283e9aa0dfd0ba21a836b07e6cd6bef Mon Sep 17 00:00:00 2001 From: Ralph Moritz Date: Sat, 29 Jun 2013 16:23:48 +0200 Subject: [PATCH] Get Hy working on Windows by making readline use conditional. --- AUTHORS | 2 +- hy/cmdline.py | 17 ++++------- hy/completer.py | 9 ++---- hy/readline_helpers.py | 65 ++++++++++++++++++++++++++++++++++++++++++ setup.py | 6 +++- 5 files changed, 78 insertions(+), 21 deletions(-) create mode 100644 hy/readline_helpers.py diff --git a/AUTHORS b/AUTHORS index 9136050..3630a44 100644 --- a/AUTHORS +++ b/AUTHORS @@ -14,4 +14,4 @@ * Thomas Ballinger * Morten Linderud * Guillermo Vayá - +* Ralph Möritz diff --git a/hy/cmdline.py b/hy/cmdline.py index 0393e6a..2ea7ec7 100644 --- a/hy/cmdline.py +++ b/hy/cmdline.py @@ -28,7 +28,6 @@ import ast import code import optparse import os -import readline import sys import hy @@ -40,13 +39,13 @@ from hy.core import process from hy.importer import ast_compile, import_buffer_to_module import hy.completer +from hy.readline_helpers import read_history_file, write_history_file from hy.macros import macro, require from hy.models.expression import HyExpression from hy.models.string import HyString from hy.models.symbol import HySymbol - _machine = Machine(Idle, 1, 0) try: @@ -185,15 +184,7 @@ def run_repl(hr=None): sys.ps1 = "=> " sys.ps2 = "... " - history = os.path.expanduser("~/.hy-history") - readline.parse_and_bind("set blink-matching-paren on") - - try: - readline.read_history_file(history) - except IOError: - open(history, 'a').close() - - readline.parse_and_bind("tab: complete") + history = read_history_file() if not hr: hr = HyREPL() @@ -201,7 +192,9 @@ def run_repl(hr=None): appname=hy.__appname__, version=hy.__version__ )) - readline.write_history_file(history) + + write_history_file(history) + return 0 diff --git a/hy/completer.py b/hy/completer.py index d02be23..f88a880 100644 --- a/hy/completer.py +++ b/hy/completer.py @@ -20,6 +20,7 @@ import hy.macros import hy.compiler +from hy.readline_helpers import set_completer try: import __builtin__ @@ -57,11 +58,5 @@ class Completer(object): except IndexError: return None +set_completer(Completer().complete, "()[]{} ") -try: - import readline -except ImportError: - pass -else: - readline.set_completer(Completer().complete) - readline.set_completer_delims("()[]{} ") diff --git a/hy/readline_helpers.py b/hy/readline_helpers.py new file mode 100644 index 0000000..3818b4d --- /dev/null +++ b/hy/readline_helpers.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2013 Paul Tagliamonte +# Copyright (c) 2013 Gergely Nagy +# Copyright (c) 2013 James King +# Copyright (c) 2013 Julien Danjou +# Copyright (c) 2013 Konrad Hinsen +# Copyright (c) 2013 Thom Neale +# Copyright (c) 2013 Will Kahn-Greene +# Copyright (c) 2013 Ralph Möritz +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +import os + +noop = False + +try: + import readline +except ImportError: + try: + import pyreadline.rlmain + import pyreadline.unicode_helper + import readline + except ImportError: + noop = True + +def set_completer(completer, delims): + if not noop: + readline.set_completer(completer) + readline.set_completer_delims(delims) + +def read_history_file(): + if noop: + return None + + history = os.path.expanduser("~/.hy-history") + readline.parse_and_bind("set blink-matching-paren on") + + try: + readline.read_history_file(history) + except IOError: + open(history, 'a').close() + + readline.parse_and_bind("tab: complete") + return history + +def write_history_file(history): + if not noop: + readline.write_history_file(history) diff --git a/setup.py b/setup.py index 7fac3f3..38ef5f5 100755 --- a/setup.py +++ b/setup.py @@ -22,16 +22,20 @@ from hy import __appname__, __version__ from setuptools import setup - +import os long_description = """Hy is a Python <--> Lisp layer. It helps make things work nicer, and lets Python and the Hy lisp variant play nice together. """ +install_requires = [] +if os.name == 'nt': + install_requires.append('pyreadline==2.0') setup( name=__appname__, version=__version__, + install_requires=install_requires, scripts=[ "bin/hy", "bin/hyc",