我怎样才能让 GHCI 识别工作目录的变化?

How can I make GHCI recognize working directory changes?

我正在尝试使用 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 > " 的方法也是一样的。 我最好的猜测是 ghci 以某种方式从 user-space 模块中保留了一个完全独立的文件系统模块。我可能需要深入研究 ghci 源代码才能弄清楚发生了什么。

不限于 Turtle,Filesystem.setWorkingDirectory 显示与 Turtle.cd 相同的行为。

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

最小的例子..

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