Как посмотреть текущий рабочий каталог в 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 ответа
Я не уверен, что это "правильный" способ сделать это, но так как :!
позволяет команды оболочки, вы также можете получить его с помощью соответствующей команды оболочки (вашей ОС) для чтения каталога или содержимого (так 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.