【问题标题】:How to see the current working directory in WinGHCi如何在 WinGHCi 中查看当前工作目录
【发布时间】:2012-06-28 17:53:10
【问题描述】:

我已经开始自学 Haskell,为此我为 Windows 安装了 The Haskell Platform。我现在使用WinGHCi。我了解到它具有用于更改目录的命令:cd。但问题是,我怎么知道我目前在哪个目录?首先不知道为什么我要更改目录。我搜索了很多,但找不到答案。

请告诉我是否有办法知道当前工作目录。最好我想配置命令提示符本身以显示当前目录,很像 Linux 的控制台。


按照@Daniel 的建议,我做了这些:

  • 由于我在 Windows 7 上工作,因此没有 .ghci 文件(我认为它适用于类 Unix 操作系统),所以我在 C:\Users\Apelles\AppData\Roaming\ghc 文件夹中创建了一个文件 ghci.conf,作为 it is instructed here。李>
  • 将 Daniel 回复中的脚本复制粘贴到 ghci.conf
  • 然后我启动了ghci.exe,这是一个类似控制台的窗口。我注意到它加载的模块比以前通常加载的模块多。这是快照:

你可以看到它加载了更多的模块,最后一行说,

无法解析提示字符串。使用 Haskell 语法。

这是什么意思?哪一行导致问题(来自以下脚本)?

let cur fill = do { cwd <- System.Directory.getCurrentDirectory; return (":set prompt \"" ++ cwd ++ fill ++ " \""); }
:def doprompt (\_ -> cur ">")
:def mycd (\dir -> System.Directory.setCurrentDirectory dir >> cur ">")
:doprompt

另外,如果我将ghci.conf 文件重命名为某个随机名称,然后启动ghci.exe,它会加载这些模块:

正如我之前所说,它加载的模块数量更少,这意味着 使用 ghci.confghci.exe 成功地做了一些事情,但在某些时候失败了。如何解决?

【问题讨论】:

  • 试试Prelude&gt; :! pwd (或任何 Windows 的 pwd 等效项)。我认为 WinGHCi 在下面运行一个普通的 ghci,所以应该可以。
  • @DanielFischer:效果很好。是否可以配置命令提示符本身?
  • 是的,您可以使用:set prompt Whatever 配置提示(输入:? 以获得有关ghci 命令的简短帮助)。但是,这是每个会话。要使其永久化,请在您的.ghci 文件中执行此操作(我认为它们在 Windows 上的名称不同,不记得是什么了)。不过,我不确定如何将其设置为当前目录。
  • @DanielFischer: :set prompt Whatever?我应该用什么代替 Whatever 以便它显示当前工作目录? :set prompt :!pwd 在这里没有帮助。
  • 无关:如果不是太麻烦(如果您不打算进行开发,我认为不是,应该有安装程序),您应该升级到更新的 GHC ,当前版本为7.4.2。

标签: haskell ghci working-directory winghci


【解决方案1】:

System.Directory.getCurrentDirectory 来自 directory 包。

【讨论】:

  • 有用的替代方案,但不应该是这样做的首选方式。这是对语言函数的调用,它不能帮助用户学习 GHCi 的命令。就像我问如何输入字母 ~ 而你给了我 Alt 代码(输入“Alt 126”),而不是告诉我按 '~' 键。
【解决方案2】:

我不确定这是否是“正确”的方法,但由于 :! 允许使用 shell 命令,因此您也可以使用适当的 shell 命令(您的操作系统)来读取目录或内容(如cdls 等)。例如,你可以写:

:! cd

这取决于您需要该目录的用途。如果您只想在控制台中将其打印出来,那么这会有所帮助。

一切顺利!

【讨论】:

  • 当然是更简单的一种
【解决方案3】:

将 ghci 提示设置为当前工作目录的穷人解决方案是放置

let cur fill = do { cwd <- System.Directory.getCurrentDirectory; return (":set prompt \"" ++ cwd ++ fill ++ " \""); }
:def doprompt (\_ -> cur ">")
:def mycd (\dir -> System.Directory.setCurrentDirectory dir >> cur ">")
:doprompt

.ghci 文件中。

在第一行中,我们定义了cur :: String -&gt; IO String,它获取当前目录并返回 ghci 命令以相应地设置提示。然后我们定义一个执行该操作的 ghci 命令doprompt 和一个更改目录并设置提示的命令。最后一行在启动时执行:doprompt

很遗憾,:cd dir 并不能反映目录的变化,之后必须手动操作:doprompt,或者使用:mycd 来更改目录。

为避免提示过长,可以通过删除文件路径的初始部分来操纵getCurrentDirectory 的结果。

这种简单方法的另一个缺点是提示不再包含有关已加载模块的信息。我相信所有这些都可以克服,但我现在没有足够的动力去挖掘。

【讨论】:

  • 让我试试这个。暂时,尝试回答 +1。
  • 我在 Windows 上试过了,但没有用。我在我的问题中添加了我所做的事情。看看吧。
  • 很遗憾听到这个消息。任何迹象表明什么失败了? (我还没有看到对您的问题的修改)
  • 抱歉,编辑我的问题需要时间。我试图发布尽可能多的信息。现在已经完成了。 :-)
  • 糟糕。我忘了给 +1 的尝试。 :|
【解决方案4】:

在 ghci 命令提示符下键入:! cd,它将为您提供当前目录的输出。通常,在 ghci 命令提示符下使用:! 后跟 shell 命令来运行任何 shell 命令。 Windows 和 Mac/Linux 上的 shell 不同,因此您可以使用的命令也会有所不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 2015-02-22
    • 2016-01-06
    • 2011-06-19
    • 2021-01-18
    • 2020-02-24
    相关资源
    最近更新 更多