Как посмотреть текущий рабочий каталог в 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.conf ghci.exe что-то делает успешно, но в какой-то момент происходит сбой. Как это исправить?


person Nawaz    schedule 28.06.2012    source источник
comment
Попробуйте Prelude> :! pwd (или любой другой эквивалент pwd в Windows). Я думаю, что под WinGHCi работает обычный ghci, так что это должно работать.   -  person Daniel Fischer    schedule 28.06.2012
comment
@DanielFischer: Это прекрасно работает. Можно ли настроить саму командную строку?   -  person Nawaz    schedule 28.06.2012
comment
Да, вы можете настроить приглашение с помощью :set prompt Whatever (введите :? для краткой справки по командам ghci). Однако это за сеанс. Чтобы сделать его постоянным, сделайте это в своем файле .ghci (кажется, в Windows они называются по-другому, не помню как). Однако я не уверен, как установить его в текущий каталог.   -  person Daniel Fischer    schedule 28.06.2012
comment
@DanielFischer: :set prompt Whatever? Что я должен поставить вместо Whatever, чтобы он показывал текущий рабочий каталог? :set prompt :!pwd здесь не поможет.   -  person Nawaz    schedule 28.06.2012
comment
Нет, действительно так не работает. Я не знаю, как это сделать, возможно, руководство пользователя помогает. Я убежден, что это возможно, но я никогда не занимался такой настройкой, поэтому боюсь, что не могу помочь, кроме общих идей.   -  person Daniel Fischer    schedule 28.06.2012
comment
@DanielFischer В Windows cd без дополнительных аргументов выводит текущий каталог вместо его установки.   -  person MathematicalOrchid    schedule 30.06.2012
comment
@MathematicalOrchid: в Windows cd ни не печатает, ни устанавливает текущий каталог. Он скорее используется для изменения каталога (т.е. для навигации), отсюда и название cd.   -  person Nawaz    schedule 30.06.2012
comment
То, что он загружает больше пакетов с ghci.conf, неудивительно, dot-ghci использует System.Directory, поэтому необходимо загрузить пакет directory и его зависимости.   -  person Daniel Fischer    schedule 30.06.2012
comment
@DanielFischer: Ага. Это понял сразу увидев их. На самом деле я хотел сказать, что он что-то делает успешно, но в какой-то момент дает сбой. (отредактировал вопрос)   -  person Nawaz    schedule 30.06.2012
comment
Для строки подсказки «Не удается разобрать». Используйте синтаксис Haskell. Я не знаю. Может быть что-то с разделителем пути Windows. Что выводит System.Directory.getCurrentDirectory >>= print?   -  person Daniel Fischer    schedule 30.06.2012
comment
Несвязанный: если это не слишком сложно (и если вы не планируете заниматься разработкой, я думаю, что нет, должен быть установщик), вам следует перейти на более новый GHC, текущая версия 7.4.2 .   -  person Daniel Fischer    schedule 30.06.2012
comment
@DanielFischer: Конечно, я это сделаю. Спасибо за информацию. :-)   -  person Nawaz    schedule 30.06.2012
comment
давайте продолжим это обсуждение в чате   -  person Daniel Fischer    schedule 30.06.2012
comment
@Nawaz Наваз, ты нашел решение для этого сценария с текущим каталогом? Я начал с haskell сейчас и столкнулся с той же проблемой... в качестве обходного пути я обнаружил, что :cd <absolute_directory_path> поможет. и WinGHCi запускается с текущим каталогом, в котором установлен двоичный файл. Пожалуйста, дайте мне знать, если вы что-нибудь узнаете. Спасибо.   -  person Koushik Shetty    schedule 19.10.2013
comment
@Koushik: Нет, я не изучаю Haskell, это говорит. Я вернусь к нему, как только у меня будет свободное время. :-)   -  person Nawaz    schedule 19.10.2013


Ответы (4)


System.Directory.getCurrentDirectory из пакета directory.

person jp093121    schedule 27.02.2014
comment
Полезная альтернатива, но не должна быть предпочтительным способом сделать это. Это вызов языковой функции, которая не помогает пользователю выучить команды GHCi. Это как если бы я спросил, как набрать букву ~, а вы дали бы мне альтернативный код (введите Alt 126) вместо того, чтобы сказать мне нажать клавишу «~». - person Ryan; 18.07.2019

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

:! cd

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

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

person Бојан Матовски    schedule 30.05.2018
comment
конечно проще - person sandwood; 21.03.2020

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

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

person Daniel Fischer    schedule 29.06.2012
comment
Позвольте мне попробовать это. А пока +1 за попытку ответить. - person Nawaz; 29.06.2012
comment
Я попробовал это в Windows, и это не сработало. Я добавил то, что я сделал, к моему вопросу. Видеть это. - person Nawaz; 30.06.2012
comment
Мне очень жаль это слышать. Любые указания на то, что не удалось? (Я пока не вижу редактирования вашего вопроса) - person Daniel Fischer; 30.06.2012
comment
Извините, потребовалось время, чтобы отредактировать мой вопрос. Я постарался разместить как можно больше информации. Это сделано сейчас. :-) - person Nawaz; 30.06.2012
comment
Упс. Забыл поставить +1 за попытку. :| - person Nawaz; 30.06.2012

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

person Srijan Chaudhary    schedule 14.03.2019