GF Shell: "ph | wf -file=foo.gfs" now works as advertised

The print_history command was among the commands implemented in an ad-hoc
way instead of being handled by the command line interpreter, which means
it could not be used in a pipe, as in the example in the help info.
The refactoring in the previous patch made this old bug easy to fix.

Also fixed a bug in the "empty" command, introduced when moving the PGF from
CommandEnv to GFEnv.

TODO: fix the undocumented eh command. A comment in the help info for
print_history, and some commented out old code, suggest that eh means
"execute_history", but at present it does nothing...
This commit is contained in:
hallgren
2015-08-13 15:30:23 +00:00
parent 87e64a804c
commit 2df2d4a683
2 changed files with 58 additions and 24 deletions

View File

@@ -8,7 +8,7 @@ import GF.Command.Interpreter(CommandEnv(..),mkCommandEnv,interpretCommandLine)
import GF.Command.Commands(flags,options,PGFEnv,HasPGFEnv(..),pgf,pgfEnv,pgfCommands) import GF.Command.Commands(flags,options,PGFEnv,HasPGFEnv(..),pgf,pgfEnv,pgfCommands)
import GF.Command.CommonCommands(commonCommands,extend) import GF.Command.CommonCommands(commonCommands,extend)
import GF.Command.SourceCommands import GF.Command.SourceCommands
--import GF.Command.CommandInfo(mapCommandEnv,liftCommandInfo) import GF.Command.CommandInfo
import GF.Command.Help(helpCommand) import GF.Command.Help(helpCommand)
import GF.Command.Abstract import GF.Command.Abstract
import GF.Command.Parse(readCommandLine,pCommand) import GF.Command.Parse(readCommandLine,pCommand)
@@ -34,7 +34,7 @@ import qualified Text.ParserCombinators.ReadP as RP
--import System.CPUTime(getCPUTime) --import System.CPUTime(getCPUTime)
import System.Directory({-getCurrentDirectory,-}getAppUserDataDirectory) import System.Directory({-getCurrentDirectory,-}getAppUserDataDirectory)
import Control.Exception(SomeException,fromException,evaluate,try) import Control.Exception(SomeException,fromException,evaluate,try)
import Control.Monad.State import Control.Monad.State hiding (void)
import qualified GF.System.Signal as IO(runInterruptibly) import qualified GF.System.Signal as IO(runInterruptibly)
#ifdef SERVER_MODE #ifdef SERVER_MODE
import GF.Server(server) import GF.Server(server)
@@ -133,10 +133,10 @@ execute1 opts s0 =
"eh":ws -> eh ws "eh":ws -> eh ws
"i" :ws -> import_ ws "i" :ws -> import_ ws
-- other special commands, working on GFEnv -- other special commands, working on GFEnv
"e" :_ -> empty
"dc":ws -> define_command ws "dc":ws -> define_command ws
"dt":ws -> define_tree ws "dt":ws -> define_tree ws
"ph":_ -> print_history -- "e" :_ -> empty
-- "ph":_ -> print_history
"r" :_ -> reload_last "r" :_ -> reload_last
-- ordinary commands -- ordinary commands
_ -> do env <- gets commandenv _ -> do env <- gets commandenv
@@ -190,9 +190,6 @@ execute1 opts s0 =
continue continue
continue continue
empty = do modify $ \ gfenv -> gfenv { commandenv=emptyCommandEnv }
continue
define_command (f:ws) = define_command (f:ws) =
case readCommandLine (unwords ws) of case readCommandLine (unwords ws) of
Just comm -> Just comm ->
@@ -224,10 +221,6 @@ execute1 opts s0 =
dt_not_parsed = putStrLnE "value definition not parsed" >> continue dt_not_parsed = putStrLnE "value definition not parsed" >> continue
print_history =
do mapM_ putStrLnE . reverse . drop 1 . history =<< get
continue
reload_last = do reload_last = do
gfenv0 <- get gfenv0 <- get
let imports = [(s,ws) | s <- history gfenv0, ("i":ws) <- [pwords s]] let imports = [(s,ws) | s <- history gfenv0, ("i":ws) <- [pwords s]]
@@ -239,6 +232,30 @@ execute1 opts s0 =
putStrLnE $ "no import in history" putStrLnE $ "no import in history"
continue continue
moreCommands = [
("e", emptyCommandInfo {
longname = "empty",
synopsis = "empty the environment (except the command history)",
exec = \ _ _ ->
do modify $ \ gfenv -> emptyGFEnv { history=history gfenv }
return void
}),
("ph", emptyCommandInfo {
longname = "print_history",
synopsis = "print command history",
explanation = unlines [
"Prints the commands issued during the GF session.",
"The result is readable by the eh command.",
"The result can be used as a script when starting GF."
],
examples = [
mkEx "ph | wf -file=foo.gfs -- save the history into a file"
],
exec = \ _ _ ->
fmap (fromString . unlines . reverse . drop 1 . history) get
})
]
printException e = maybe (print e) (putStrLn . ioErrorText) (fromException e) printException e = maybe (print e) (putStrLn . ioErrorText) (fromException e)
@@ -305,7 +322,7 @@ emptyCommandEnv = mkCommandEnv allCommands
multigrammar = pgf . snd . pgfenv multigrammar = pgf . snd . pgfenv
allCommands = allCommands =
extend pgfCommands [helpCommand allCommands] extend pgfCommands (helpCommand allCommands:moreCommands)
`Map.union` sourceCommands `Map.union` sourceCommands
`Map.union` commonCommands `Map.union` commonCommands

View File

@@ -4,9 +4,9 @@ module GF.Interactive2 (mainGFI,mainRunGFI{-,mainServerGFI-}) where
import Prelude hiding (putStrLn,print) import Prelude hiding (putStrLn,print)
import qualified Prelude as P(putStrLn) import qualified Prelude as P(putStrLn)
import GF.Command.Interpreter(CommandEnv(..),commands,mkCommandEnv,interpretCommandLine) import GF.Command.Interpreter(CommandEnv(..),commands,mkCommandEnv,interpretCommandLine)
--import GF.Command.Importing(importSource,importGrammar)
import GF.Command.Commands2(flags,options,PGFEnv,HasPGFEnv(..),pgf,concs,pgfEnv,emptyPGFEnv,pgfCommands) import GF.Command.Commands2(flags,options,PGFEnv,HasPGFEnv(..),pgf,concs,pgfEnv,emptyPGFEnv,pgfCommands)
import GF.Command.CommonCommands import GF.Command.CommonCommands
import GF.Command.CommandInfo
import GF.Command.Help(helpCommand) import GF.Command.Help(helpCommand)
import GF.Command.Abstract import GF.Command.Abstract
import GF.Command.Parse(readCommandLine,pCommand) import GF.Command.Parse(readCommandLine,pCommand)
@@ -35,7 +35,7 @@ import System.Directory({-getCurrentDirectory,-}getAppUserDataDirectory)
import System.FilePath(takeExtensions) import System.FilePath(takeExtensions)
import Control.Exception(SomeException,fromException,try) import Control.Exception(SomeException,fromException,try)
--import Control.Monad --import Control.Monad
import Control.Monad.State import Control.Monad.State hiding (void)
import qualified GF.System.Signal as IO(runInterruptibly) import qualified GF.System.Signal as IO(runInterruptibly)
{- {-
@@ -135,10 +135,10 @@ execute1 opts s0 =
"eh":ws -> eh ws "eh":ws -> eh ws
"i" :ws -> import_ ws "i" :ws -> import_ ws
-- other special commands, working on GFEnv -- other special commands, working on GFEnv
"e" :_ -> empty
"dc":ws -> define_command ws "dc":ws -> define_command ws
"dt":ws -> define_tree ws "dt":ws -> define_tree ws
"ph":_ -> print_history -- "e" :_ -> empty
-- "ph":_ -> print_history
"r" :_ -> reload_last "r" :_ -> reload_last
-- ordinary commands -- ordinary commands
_ -> do env <- gets commandenv _ -> do env <- gets commandenv
@@ -192,9 +192,6 @@ execute1 opts s0 =
continue continue
continue continue
empty = do modify $ \ gfenv -> gfenv { commandenv=emptyCommandEnv }
continue
define_command (f:ws) = define_command (f:ws) =
case readCommandLine (unwords ws) of case readCommandLine (unwords ws) of
Just comm -> Just comm ->
@@ -226,10 +223,6 @@ execute1 opts s0 =
dt_not_parsed = putStrLnE "value definition not parsed" >> continue dt_not_parsed = putStrLnE "value definition not parsed" >> continue
print_history =
do mapM_ putStrLnE . reverse . drop 1 . history =<< get
continue
reload_last = do reload_last = do
gfenv0 <- get gfenv0 <- get
let imports = [(s,ws) | s <- history gfenv0, ("i":ws) <- [pwords s]] let imports = [(s,ws) | s <- history gfenv0, ("i":ws) <- [pwords s]]
@@ -241,6 +234,30 @@ execute1 opts s0 =
putStrLnE $ "no import in history" putStrLnE $ "no import in history"
continue continue
moreCommands = [
("e", emptyCommandInfo {
longname = "empty",
synopsis = "empty the environment (except the command history)",
exec = \ _ _ ->
do modify $ \ gfenv -> emptyGFEnv { history=history gfenv }
return void
}),
("ph", emptyCommandInfo {
longname = "print_history",
synopsis = "print command history",
explanation = unlines [
"Prints the commands issued during the GF session.",
"The result is readable by the eh command.",
"The result can be used as a script when starting GF."
],
examples = [
mkEx "ph | wf -file=foo.gfs -- save the history into a file"
],
exec = \ _ _ ->
fmap (fromString . unlines . reverse . drop 1 . history) get
})
]
printException e = maybe (print e) (putStrLn . ioErrorText) (fromException e) printException e = maybe (print e) (putStrLn . ioErrorText) (fromException e)
@@ -306,7 +323,7 @@ multigrammar = pgf . pgfenv
concretes = concs . pgfenv concretes = concs . pgfenv
allCommands = allCommands =
extend pgfCommands [helpCommand allCommands] extend pgfCommands (helpCommand allCommands:moreCommands)
`Map.union` commonCommands `Map.union` commonCommands
instance HasPGFEnv ShellM where getPGFEnv = gets pgfenv instance HasPGFEnv ShellM where getPGFEnv = gets pgfenv