我正在尝试使用 ghci+Turtle 作为我的交互式 shell 而不是 bash。到目前为止,它工作得很好!但我真的很喜欢 Turtle 的cd
功能来更改 ghci 的工作目录,就像 ghci 命令:cd
所做的那样。
假设我加载了 ghci 和 turtle/home
λ> 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's 更改目录: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 命令,所以它不能从函数中调用或以任何方式组合。
制作一个cd
与 ghci 对话的函数需要什么?我想我需要做一些事情,比如编写我自己的包装器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
.