Как я могу заставить GHCI распознавать изменения рабочего каталога?

Я экспериментирую с использованием ghci+Turtle в качестве интерактивной оболочки вместо bash. Пока это работает довольно хорошо! Но я бы очень хотел Turtle's cd функция для изменения рабочего каталога ghci, команда way ghci :cd делает.

Допустим, я загружаю GHCI и черепаху в /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 обертка. Я предполагаю, что мне нужно использовать API GHC? Я не могу найти ничего очевидного.

РЕДАКТИРОВАТЬ: я обнаружил, что аналогичная проблема существует, когда я пытаюсь изменить приглашение ghci с помощью : set prompt-function. Если вы поместите в ваш ghci.conf следующее:

:module + Turtle
:set prompt-function \libs n -> (\wd -> encodeString wd ++ "> ") <$> pwd

Приглашение не изменит рабочие каталоги с cd, но будет с :cd, Используя что-то вроде :set prompt "%w > " работает так же. Мое лучшее предположение заключается в том, что ghci каким-то образом сохраняет совершенно отдельный модуль файловой системы от модуля пользовательского пространства. Возможно, мне придется покопаться в источнике ghci, чтобы выяснить, что происходит.

Это не только черепаха, Filesystem.setWorkingDirectory показывает то же поведение, что и Turtle.cd,

0 ответов

У меня была похожая проблема при разработке тссс. Я работал над этим, предоставляя cd функция, которая устанавливает PWD а также изменение каталога и использование prompt-function который читает эту переменную.

Минимальный пример..

:set prompt-function \_ _ -> getEnv "PWD"
cd :: FilePath -> IO ()
cd p = do
    setCurrentDirectory p
    a <- getCurrentDirectory
    setEnv "PWD" a
Другие вопросы по тегам