【发布时间】: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 > " 之类的东西也是一样的。
我最好的猜测是 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