我正在尝试使用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
相同。
答案 0 :(得分:1)
在开发嘘时,我遇到了类似的问题。我通过提供一个cd
函数来设置PWD
并更改目录,并使用prompt-function
来读取该变量来解决此问题。
最小的例子。
:set prompt-function \_ _ -> getEnv "PWD"
cd :: FilePath -> IO ()
cd p = do
setCurrentDirectory p
a <- getCurrentDirectory
setEnv "PWD" a