如何使GHCI识别工作目录更改?

时间:2018-07-13 18:15:29

标签: haskell filesystems ghci haskell-turtle

我正在尝试使用ghci + Turtle作为交互式shell而不是bash。到目前为止,它运行良好! 但是我真的很希望Turtle的cd函数能像ghci命令:cd那样改变ghci的工作目录。

假设我在/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会以某种方式将完整的文件系统模块与用户空间模块分开。我可能需要深入研究ghci来源,以了解发生了什么情况。

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

1 个答案:

答案 0 :(得分:1)

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

最小的例子。

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