Подтвердить что ты не робот

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

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

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


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

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

enter image description here

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

Невозможно разобрать строку подсказки. Используйте синтаксис Haskell.

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

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, он загрузит эти модули: enter image description here

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

4b9b3361

Ответ 1

System.Directory.getCurrentDirectory

Ответ 2

Решение для бедных людей, чтобы установить приглашение 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, отбросив начальную часть пути к файлу.

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

Ответ 3

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

:! cd

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

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

Ответ 4

В командной строке ghci введите :! cd :! cd, он даст вам вывод для текущего каталога и использовать :! затем команды оболочки для запуска любой команды оболочки в командной строке ghci. Оболочки различаются в Windows и Mac/Linux, поэтому команды, которые вы можете использовать, будут разными.