【问题标题】:How can I make GHCI recognize working directory changes?如何让 GHCI 识别工作目录更改?
【发布时间】:2018-07-13 18:15:28
【问题描述】:

我正在尝试使用 ghci+Turtle 作为我的交互式 shell 而不是 bash。到目前为止,它工作得很好! 但我真的很喜欢 Turtle 的 cd 函数来更改 ghci 的工作目录,就像 ghci 命令 :cd 所做的那样。

假设我在/home中加载了ghci和turtle

λ> pwd
FilePath "/home"
λ> :show paths
current working directory: 
  /home
module import search paths:
  .
λ> :cd /tmp/
λ> pwd
FilePath "/tmp"
λ> :show paths
current working directory: 
  /tmp
module import search paths:
  .
λ> 

到目前为止一切顺利:使用 ghci 的 :cd 更改目录也会更改 Turtle 的工作目录。 但另一种说法不正确:

λ> cd "/home"
λ> pwd
FilePath "/home"
λ> :show paths
current working directory: 
  /tmp
module import search paths:
  .
λ> 

这意味着如果我用 Turtle 更改目录,我不能使用 :load:script 或利用 ghci 的制表符补全。 我总是可以使用:cd 而不是cd,但是因为:cd 是一个ghci 命令,它不能从函数中调用或以任何方式组合。

创建一个与 ghci 对话的 cd 函数需要什么?我想我需要做类似的事情 编写我自己的包装器cd 以某种方式改变环境。 我不确定那是什么样子,因为我无法在 cd 包装器中调用 :cd。 我猜我需要使用 ghc API?我找不到任何明显的东西。

编辑:当我尝试使用 :set prompt-function 更改 ghci 提示符时,我发现存在类似的问题。如果您在 ghci.conf 中添加以下内容:

:module + Turtle
:set prompt-function \libs n -> (\wd -> encodeString wd ++ "> ") <$> pwd

提示不会使用cd 更改工作目录,但会使用:cd。使用 :set prompt "%w &gt; " 之类的东西也是一样的。 我最好的猜测是 ghci 以某种方式将文件系统模块与用户空间模块完全分开。我可能必须深入研究 ghci 源才能弄清楚发生了什么。

不限于 Turtle,Filesystem.setWorkingDirectory 表现出与 Turtle.cd 相同的行为。

【问题讨论】:

  • 我认为这个问题基本上是“为什么Filesystem.setWorkingDirectory 不会影响 ghci 中的模块搜索路径(就像:cd 一样),我该如何改变呢?”
  • 嗯,这是我感到困惑的一部分。 Filesystem.getWorkingDirectory(以及 Turtle.pwd 和 System.Directory.getCurrentDirectory)在 ghci repl 中都返回不同的值,而不是它们返回 :set prompt-function 和我认为是 :paths 公开的“内部”ghci,尽管目前尚不清楚我在报告“工作目录”时,:paths 的确切值是什么。

标签: haskell filesystems ghci haskell-turtle


【解决方案1】:

我在开发 shh 时遇到了类似的问题。我通过提供设置PWDcd 函数以及更改目录并使用读取该变量的prompt-function 来解决此问题。

最小的例子..

:set prompt-function \_ _ -> getEnv "PWD"
cd :: FilePath -> IO ()
cd p = do
    setCurrentDirectory p
    a <- getCurrentDirectory
    setEnv "PWD" a

【讨论】:

    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 2015-12-08
    • 2012-12-29
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2021-09-09
    相关资源
    最近更新 更多