2

我正在尝试使用 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,以某种方式改变环境。我不确定那是什么样子,因为我无法:cdcd包装器中调用。我猜我需要使用 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.

4

1 回答 1

1

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

最小的例子..

:set prompt-function \_ _ -> getEnv "PWD"
cd :: FilePath -> IO ()
cd p = do
    setCurrentDirectory p
    a <- getCurrentDirectory
    setEnv "PWD" a
于 2019-03-08T03:18:42.543 回答