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

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

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


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

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

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

Не удается разобрать строку приглашения. Используйте синтаксис 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.confghci.exe делает что-то успешно, но в какой-то момент терпит неудачу. Как это исправить?

3 ответа

System.Directory.getCurrentDirectory

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

:! cd

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

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

Решение бедного человека для установки приглашения ghci на текущий рабочий каталог было бы поставить

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 файл.

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

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

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

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

В командной строке ghci введите ":! Cd" (без кавычек), он выдаст вывод для текущего каталога и использует ":!" затем команды оболочки для работы в командной строке ghci.

Другие вопросы по тегам