我怎样才能让 GHCI 识别工作目录的变化?
How can I make GHCI recognize working directory changes?
我正在尝试使用 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 以某种方式从 user-space 模块中保留了一个完全独立的文件系统模块。我可能需要深入研究 ghci 源代码才能弄清楚发生了什么。
不限于 Turtle,Filesystem.setWorkingDirectory
显示与 Turtle.cd
相同的行为。
我在开发 shh 时遇到了类似的问题。我通过提供 cd
函数来设置 PWD
以及更改目录,并使用读取该变量的 prompt-function
来解决这个问题。
最小的例子..
:set prompt-function \_ _ -> getEnv "PWD"
cd :: FilePath -> IO ()
cd p = do
setCurrentDirectory p
a <- getCurrentDirectory
setEnv "PWD" a
我正在尝试使用 ghci+Turtle 作为我的交互 shell 而不是 bash。到目前为止,它工作得很好!
但我真的很喜欢 Turtle 的 cd
函数来更改 ghci 的工作目录,就像 ghci 命令 :cd
所做的那样。
假设我在 /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 :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 以某种方式从 user-space 模块中保留了一个完全独立的文件系统模块。我可能需要深入研究 ghci 源代码才能弄清楚发生了什么。
不限于 Turtle,Filesystem.setWorkingDirectory
显示与 Turtle.cd
相同的行为。
我在开发 shh 时遇到了类似的问题。我通过提供 cd
函数来设置 PWD
以及更改目录,并使用读取该变量的 prompt-function
来解决这个问题。
最小的例子..
:set prompt-function \_ _ -> getEnv "PWD"
cd :: FilePath -> IO ()
cd p = do
setCurrentDirectory p
a <- getCurrentDirectory
setEnv "PWD" a