Как посмотреть текущий рабочий каталог в WinGHCi

Я'начал учить себя Haskell, и для этого я'установил The Haskell Platform для Windows. На данный момент я использую WinGHCi. Я узнал, что в ней есть команда :cd, которая используется для смены каталога. Но вопрос в том, как мне узнать, в какой директории я сейчас нахожусь? Не зная этого, зачем мне менять каталог. Я много искал, но так и не смог найти ответ.

Пожалуйста, подскажите, есть ли способ узнать текущий рабочий каталог. Предпочтительно я хотел бы настроить командную строку так, чтобы она показывала текущий каталог, почти как консоль Linux.


Следуя предложению @Daniel', я сделал следующее:

  • Так как я работал на Windows 7, там нет файла .ghci (я думаю, что это для Unix-подобных ОС), поэтому я создал файл ghci.conf в папке C:\Users\Apelles\AppData\Roaming\ghc, как указано здесь.
  • Скопировал скрипт из ответа Daniel'a в ghci.conf.
  • Затем я запустил ghci.exe, который представляет собой консольное окно. Я заметил, что он загрузил несколько больше модулей, чем обычно загружал до этого. Вот снимок:

Как вы можете видеть, он загружает больше модулей, и последняя строка говорит,

Can't parse prompt string. Используйте синтаксис Haskell.

Что это значит? Какая строка вызывает проблему (из следующего сценария)?

let cur fill = do { cwd <- System.Directory.getCurrentDirectory; return (":set prompt \"" ++ cwd ++ fill ++ " \""); }
:def doprompt (\_ -> cur ">")
:def mycd (\dir -> System.Directory.setCurrentDirectory dir >> cur ">")
:doprompt

Также, если я переименую файл ghci.conf в произвольное имя, а затем запущу ghci.exe, он загрузит эти модули:

Как я уже говорил, он загружает меньшее количество модулей, что означает, что с ghci.conf, ghci.exe делает что-то успешно, но в какой-то момент терпит неудачу. Как это исправить?

Комментарии к вопросу (16)

Я не уверен, что это "правильный" способ сделать это, но поскольку :! позволяет команды оболочки, вы также можете получить его с соответствующей командой оболочки (вашей ОС) для чтения каталога или содержимого (так cd, ls и тому подобное). Например, вы можете написать:

:! cd

Это зависит от того, для чего вам нужен каталог. Если вы просто хотите вывести его в консоль, то это может помочь.

Всего наилучшего!

Комментарии (0)

Бедным решением для установки подсказки ghci в текущую рабочую директорию было бы размещение

let cur fill = do { cwd  cur ">")
:def mycd (\dir -> System.Directory.setCurrentDirectory dir >> cur ">")
:doprompt

в файле .ghci.

В первой строке мы определяем cur :: String -> IO String, которая получает текущий каталог и возвращает команду ghci для установки подсказки соответствующим образом. Затем мы определяем ghci-команду doprompt, которая выполняет это действие, а также команду для смены каталога и установки подсказки. Последняя строка выполняет :doprompt при запуске.

К сожалению, это не заставляет команду :cd dir отражать смену каталога, поэтому после этого придется вручную выполнить :doprompt или использовать :mycd для смены каталога.

Чтобы избежать слишком длинных запросов, можно манипулировать результатом getCurrentDirectory, отбрасывая начальную часть пути к файлу.

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

Комментарии (5)

В командной строке Тип г :! компакт-диск, это даст вам выход для текущего каталога. В общем, использовать:! ` следуют команды оболочки для запуска командной оболочки в командной строке ГГц. Снаряды по-разному на Windows и Mac/Linux, поэтому команды будут разные.

Комментарии (0)