1
0
forked from GitHub/gf-core

always use Haskeline. drop Readline & Editline

This commit is contained in:
krasimir
2010-04-19 15:12:52 +00:00
parent 6313244eac
commit 7c67a90327
7 changed files with 40 additions and 238 deletions

View File

@@ -6,18 +6,6 @@ license: GPL
license-file: LICENSE license-file: LICENSE
synopsis: Grammatical Framework synopsis: Grammatical Framework
flag haskeline
Description: Enable Haskeline in the shell
Default: True
flag readline
Description: Enable Readline in the shell
Default: True
flag editline
Description: Enable Editline in the shell
Default: True
flag interrupt flag interrupt
Description: Enable Ctrl+Break in the shell Description: Enable Ctrl+Break in the shell
Default: True Default: True
@@ -74,7 +62,8 @@ executable gf
old-time, old-time,
process, process,
pretty, pretty,
mtl mtl,
haskeline
build-tools: happy, alex build-tools: happy, alex
if os(windows) if os(windows)
build-depends: Win32 build-depends: Win32
@@ -142,7 +131,6 @@ executable gf
GF.Compile.PGFtoProlog GF.Compile.PGFtoProlog
GF.Compile.PGFtoJS GF.Compile.PGFtoJS
GF.Compile GF.Compile
GF.System.Readline
GF.Quiz GF.Quiz
PGF PGF
PGF.CId PGF.CId
@@ -161,23 +149,6 @@ executable gf
GFC GFC
GFI GFI
if flag(haskeline)
build-depends: haskeline
cpp-options: -DUSE_HASKELINE
other-modules: GF.System.UseHaskeline
else
if flag(readline)
build-depends: readline
cpp-options: -DUSE_READLINE
other-modules: GF.System.UseReadline
else
if flag(editline)
build-depends: editline
cpp-options: -DUSE_EDITLINE
other-modules: GF.System.UseEditline
else
other-modules: GF.System.NoReadline
if flag(interrupt) if flag(interrupt)
cpp-options: -DUSE_INTERRUPT cpp-options: -DUSE_INTERRUPT
other-modules: GF.System.UseSignal other-modules: GF.System.UseSignal

View File

@@ -1,33 +0,0 @@
----------------------------------------------------------------------
-- |
-- Module : GF.System.NoReadline
-- Maintainer : BB
-- Stability : (stable)
-- Portability : (portable)
--
-- > CVS $Date: 2005/05/10 15:04:01 $
-- > CVS $Author: bringert $
-- > CVS $Revision: 1.1 $
--
-- Do not use readline.
-----------------------------------------------------------------------------
module GF.System.NoReadline (fetchCommand, setCompletionFunction, filenameCompletionFunction) where
import System.IO.Error (try)
import System.IO (stdout,hFlush)
fetchCommand :: String -> IO (String)
fetchCommand s = do
putStr s
hFlush stdout
res <- try getLine
case res of
Left e -> return "q"
Right l -> return l
setCompletionFunction :: Maybe (String -> String -> Int -> IO [String]) -> IO ()
setCompletionFunction _ = return ()
filenameCompletionFunction :: String -> IO [String]
filenameCompletionFunction _ = return []

View File

@@ -1,35 +0,0 @@
{-# OPTIONS -cpp #-}
----------------------------------------------------------------------
-- |
-- Module : GF.System.Readline
-- Maintainer : BB
-- Stability : (stable)
-- Portability : (portable)
--
-- > CVS $Date: 2005/05/10 15:04:01 $
-- > CVS $Author: bringert $
-- > CVS $Revision: 1.2 $
--
-- Uses the right readline library to read user input.
-----------------------------------------------------------------------------
module GF.System.Readline (fetchCommand, setCompletionFunction, filenameCompletionFunction) where
#ifdef USE_HASKELINE
import GF.System.UseHaskeline
#elif USE_READLINE
import GF.System.UseReadline
#elif USE_EDITLINE
import GF.System.UseEditline
#else
import GF.System.NoReadline
#endif

View File

@@ -1,36 +0,0 @@
----------------------------------------------------------------------
-- |
-- Module : GF.System.UseReadline
-- Maintainer : BB
-- Stability : (stable)
-- Portability : (portable)
--
-- > CVS $Date: 2005/05/10 15:04:01 $
-- > CVS $Author: bringert $
-- > CVS $Revision: 1.1 $
--
-- Use GNU readline
-----------------------------------------------------------------------------
module GF.System.UseEditline (fetchCommand, setCompletionFunction, filenameCompletionFunction) where
import System.Console.Editline.Readline
fetchCommand :: String -> IO (String)
fetchCommand s = do
setCompletionAppendCharacter Nothing
--setBasicQuoteCharacters ""
res <- readline s
case res of
Nothing -> return "q"
Just s -> do addHistory s
return s
setCompletionFunction :: Maybe (String -> String -> Int -> IO [String]) -> IO ()
setCompletionFunction Nothing = setCompletionEntryFunction Nothing
setCompletionFunction (Just fn) = setCompletionEntryFunction (Just my_fn)
where
my_fn prefix = do
s <- getLineBuffer
p <- getPoint
fn s prefix p

View File

@@ -1,43 +0,0 @@
----------------------------------------------------------------------
-- |
-- Module : GF.System.UseReadline
-- Maintainer : BB
-- Stability : (stable)
-- Portability : (portable)
--
-- > CVS $Date: 2005/05/10 15:04:01 $
-- > CVS $Author: bringert $
-- > CVS $Revision: 1.1 $
--
-- Use GNU readline
-----------------------------------------------------------------------------
module GF.System.UseHaskeline (fetchCommand, setCompletionFunction, filenameCompletionFunction) where
import System.Console.Haskeline
import System.Directory
fetchCommand :: String -> IO (String)
fetchCommand s = do
settings <- getGFSettings
res <- runInputT settings (getInputLine s)
case res of
Nothing -> return "q"
Just s -> return s
getGFSettings :: IO (Settings IO)
getGFSettings = do
path <- getAppUserDataDirectory "gf_history"
return $
Settings {
complete = completeFilename,
historyFile = Just path,
autoAddHistory = True
}
setCompletionFunction :: Maybe (String -> String -> Int -> IO [String]) -> IO ()
setCompletionFunction _ = return ()
filenameCompletionFunction :: String -> IO [String]
filenameCompletionFunction _ = return []

View File

@@ -1,36 +0,0 @@
----------------------------------------------------------------------
-- |
-- Module : GF.System.UseReadline
-- Maintainer : BB
-- Stability : (stable)
-- Portability : (portable)
--
-- > CVS $Date: 2005/05/10 15:04:01 $
-- > CVS $Author: bringert $
-- > CVS $Revision: 1.1 $
--
-- Use GNU readline
-----------------------------------------------------------------------------
module GF.System.UseReadline (fetchCommand, setCompletionFunction, filenameCompletionFunction) where
import System.Console.Readline
fetchCommand :: String -> IO (String)
fetchCommand s = do
setCompletionAppendCharacter Nothing
setBasicQuoteCharacters ""
res <- readline s
case res of
Nothing -> return "q"
Just s -> do addHistory s
return s
setCompletionFunction :: Maybe (String -> String -> Int -> IO [String]) -> IO ()
setCompletionFunction Nothing = setCompletionEntryFunction Nothing
setCompletionFunction (Just fn) = setCompletionEntryFunction (Just my_fn)
where
my_fn prefix = do
s <- getLineBuffer
p <- getPoint
fn s prefix p

View File

@@ -19,7 +19,7 @@ import GF.Infra.CheckM
import GF.Infra.UseIO import GF.Infra.UseIO
import GF.Infra.Option import GF.Infra.Option
import GF.Infra.Modules (greatestResource, modules, emptyModInfo) import GF.Infra.Modules (greatestResource, modules, emptyModInfo)
import GF.System.Readline import qualified System.Console.Haskeline as Haskeline
import GF.Compile.Coding import GF.Compile.Coding
@@ -79,11 +79,9 @@ loop opts gfenv0 = do
let ifv act = if isv then act else return () let ifv act = if isv then act else return ()
let env = commandenv gfenv0 let env = commandenv gfenv0
let sgr = sourcegrammar gfenv0 let sgr = sourcegrammar gfenv0
setCompletionFunction (Just (wordCompletion gfenv0)) s0 <- case flag optMode opts of
let fetch = case flag optMode opts of ModeRun -> tryGetLine
ModeRun -> tryGetLine _ -> fetchCommand gfenv0
_ -> fetchCommand (prompt env)
s0 <- fetch
let gfenv = gfenv0 {history = s0 : history gfenv0} let gfenv = gfenv0 {history = s0 : history gfenv0}
let let
pwords = case words s0 of pwords = case words s0 of
@@ -204,6 +202,20 @@ loop opts gfenv0 = do
gfenv' <- either (\e -> (print e >> return gfenv)) return r gfenv' <- either (\e -> (print e >> return gfenv)) return r
loop opts gfenv' loop opts gfenv'
fetchCommand :: GFEnv -> IO String
fetchCommand gfenv = do
path <- getAppUserDataDirectory "gf_history"
let settings =
Haskeline.Settings {
Haskeline.complete = wordCompletion gfenv,
Haskeline.historyFile = Just path,
Haskeline.autoAddHistory = True
}
res <- Haskeline.runInputT settings (Haskeline.getInputLine (prompt (commandenv gfenv)))
case res of
Nothing -> return "q"
Just s -> return s
importInEnv :: GFEnv -> Options -> [FilePath] -> IO GFEnv importInEnv :: GFEnv -> Options -> [FilePath] -> IO GFEnv
importInEnv gfenv opts files importInEnv gfenv opts files
| flag optRetainResource opts = | flag optRetainResource opts =
@@ -262,34 +274,37 @@ emptyGFEnv = do
decode _ = id -- decodeUnicode . coding decode _ = id -- decodeUnicode . coding
wordCompletion gfenv line prefix p = wordCompletion gfenv (left,right) = do
case wc_type (take p line) of case wc_type (reverse left) of
CmplCmd pref CmplCmd pref
-> ret ' ' [name | name <- Map.keys (commands cmdEnv), isPrefixOf pref name] -> ret (length pref) [Haskeline.simpleCompletion name | name <- Map.keys (commands cmdEnv), isPrefixOf pref name]
CmplStr (Just (Command _ opts _)) s CmplStr (Just (Command _ opts _)) s0
-> do mb_state0 <- try (evaluate (initState pgf (optLang opts) (optType opts))) -> do mb_state0 <- try (evaluate (initState pgf (optLang opts) (optType opts)))
case mb_state0 of case mb_state0 of
Right state0 -> let ws = words (take (length s - length prefix) s) Right state0 -> let (rprefix,rs) = break isSpace (reverse s0)
s = reverse rs
prefix = reverse rprefix
ws = words s
in case loop state0 ws of in case loop state0 ws of
Nothing -> ret ' ' [] Nothing -> ret 0 []
Just state -> let compls = getCompletions state prefix Just state -> let compls = getCompletions state prefix
in ret ' ' (Map.keys compls) in ret (length prefix) (map (\x -> Haskeline.simpleCompletion x) (Map.keys compls))
Left (_ :: SomeException) -> ret ' ' [] Left (_ :: SomeException) -> ret 0 []
CmplOpt (Just (Command n _ _)) pref CmplOpt (Just (Command n _ _)) pref
-> case Map.lookup n (commands cmdEnv) of -> case Map.lookup n (commands cmdEnv) of
Just inf -> do let flg_compls = ['-':flg | (flg,_) <- flags inf, isPrefixOf pref flg] Just inf -> do let flg_compls = [Haskeline.Completion ('-':flg++"=") ('-':flg) False | (flg,_) <- flags inf, isPrefixOf pref flg]
opt_compls = ['-':opt | (opt,_) <- options inf, isPrefixOf pref opt] opt_compls = [Haskeline.Completion ('-':opt) ('-':opt) True | (opt,_) <- options inf, isPrefixOf pref opt]
ret (if null flg_compls then ' ' else '=') ret (length pref+1)
(flg_compls++opt_compls) (flg_compls++opt_compls)
Nothing -> ret ' ' [] Nothing -> ret (length pref) []
CmplIdent (Just (Command "i" _ _)) _ -- HACK: file name completion for command i CmplIdent (Just (Command "i" _ _)) _ -- HACK: file name completion for command i
-> filenameCompletionFunction prefix -> Haskeline.completeFilename (left,right)
CmplIdent _ pref CmplIdent _ pref
-> do mb_abs <- try (evaluate (abstract pgf)) -> do mb_abs <- try (evaluate (abstract pgf))
case mb_abs of case mb_abs of
Right abs -> ret ' ' [name | cid <- Map.keys (funs abs), let name = showCId cid, isPrefixOf pref name] Right abs -> ret (length pref) [Haskeline.simpleCompletion name | cid <- Map.keys (funs abs), let name = showCId cid, isPrefixOf pref name]
Left (_ :: SomeException) -> ret ' ' [] Left (_ :: SomeException) -> ret (length pref) []
_ -> ret ' ' [] _ -> ret 0 []
where where
pgf = multigrammar cmdEnv pgf = multigrammar cmdEnv
cmdEnv = commandenv gfenv cmdEnv = commandenv gfenv
@@ -305,8 +320,7 @@ wordCompletion gfenv line prefix p =
Left es -> Nothing Left es -> Nothing
Right ps -> loop ps ts Right ps -> loop ps ts
ret c [x] = return [x++[c]] ret len xs = return (drop len left,xs)
ret _ xs = return xs
data CompletionType data CompletionType