Haskell/GHCI中的别名

6
在ghci.conf文件中设置别名是否可能?
例如,我在bash.bashrc中有alias sbh='cd Desktop/Sandbox/Haskell',这让我快速跳转到指定的文件夹。在ghci中通过在ghci.conf文件中设置别名是否也可以实现同样的功能?
我已经在ghci.conf中有一些命令,但我想设置多个别名以便快速跳转到文件夹位置,而不必每次都使用:cd home/sandbox/foo/bar。我在谷歌上找不到任何信息,所以要么这从未被考虑过,要么我错过了非常简单的东西。

根据手册(https://www.haskell.org/ghc/docs/7.2.2/html/users_guide/ghci-dot-files.html),在 .ghci 文件中的命令是逐行执行的。因此,我认为除非您需要的内容可以通过在 ghci 中键入“:help”时列出的任何命令来表达,否则可能不可能实现。 - rethab
3个回答

10

通过:def命令,可以实现这个功能:

:def sbh const $ return ":cd Desktop/Sandbox/Haskell"

如您所见,这比仅仅给出替换字符串要复杂一些:它需要一个类型为String -> IO String的Haskell函数,新定义的命令将此函数应用于其参数字符串以计算要运行的新命令。

然后在GHCI中输入:sbh来调用。


2
非常感谢,这正是我想要的。我对答案进行了小修改,以避免任何新手在使用GHCI/Haskell时犯同样的错误(将sbh绑定到GHCI而不是:sbh)。 - Dave0504
很好的描述。对我来说,类型为“String -> IO String”的函数比替换更舒适。也许经过这么多年后,我已经从我的awk黑客日子中恢复了过来。 - AndrewC

3
GHCI宏可以满足您的需求。请参考:https://www.haskell.org/ghc/docs/7.6.2/html/users_guide/ghci-commands.html
搜索“macros”(或:def,这是定义宏的命令)。您可以将它们放在ghci.conf文件中。
例如(来自上面提到的相同URL): Prelude> let mycd d = Directory.setCurrentDirectory d >> return "" Prelude> :def mycd mycd Prelude> :mycd .. 希望这可以帮助您。

1

可能不完全符合您的需求,但是如果快速跳转功能足以满足您的要求,请尝试使用此方法进行第一次修复(通过:sbh调用):

:def sbh (\arg -> return ("System.Directory.setCurrentDirectory \"Desktop/Sandbox/Haskell\""))

你后续的解决方案可能会像这样使用arg参考:

:def sbh (\arg -> return ("System.Directory.setCurrentDirectory " ++ "\"" ++ args ++ "\""))

然后通过:sbh Desktop/Sandbox/Haskell调用后者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接