2012-06-28 13 views
21

Ich habe angefangen, mich selbst zu unterrichten Haskell, und dafür habe ich The Haskell Platform für Windows installiert. Ich benutze ab sofort. Ich habe gelernt, dass es Befehl :cd hat, die verwendet wird, um Verzeichnis zu ändern. Aber die Frage ist, woher soll ich wissen, in welchem ​​Verzeichnis ich mich gerade befinde? Ohne das zuerst zu wissen, warum sollte ich das Verzeichnis wechseln wollen. Ich habe viel gesucht, konnte aber keine Antwort finden.So sehen Sie das aktuelle Arbeitsverzeichnis in WinGHCi

Bitte sagen Sie mir, ob es eine Möglichkeit gibt, das aktuelle Arbeitsverzeichnis zu kennen. Am liebsten würde ich die Eingabeaufforderung selbst so konfigurieren, dass das aktuelle Verzeichnis angezeigt wird, ähnlich wie in der Linux-Konsole.


Nach @ Daniel Vorschlag, habe ich diese:

  • Da ich auf Windows 7 gearbeitet, gibt es keine .ghci Datei (ich glaube es für Unix-ähnlichen Betriebssystem ist), so habe ich eine Datei ghci.conf in C:\Users\Apelles\AppData\Roaming\ghc Ordner, wie it is instructed here.
  • Kopieren eingefügt das Skript aus Daniels Antwort auf ghci.conf.
  • Dann begann ich ghci.exe, die das konsolenähnliche Fenster ist. Ich habe festgestellt, dass es weniger Module geladen hat, als normalerweise zum Laden verwendet wurde. Hier ist die Momentaufnahme:

enter image description here

Wie Sie sehen können es mehrere Module lädt, und die letzte Zeile sagt,

Kann nicht Prompt-String analysieren. Verwenden Sie die Haskell-Syntax.

Was bedeutet das? Welche Zeile verursacht ein Problem (aus dem folgenden Skript)?

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 

Auch, wenn ich ghci.conf Datei an einem beliebigen Namen umbenennen und dann ghci.exe starten, lädt es diese Module: enter image description here

Wie ich schon sagte, lädt es eine geringere Anzahl von Modulen, die bedeutet mit ghci.conf, ghci.exe macht etwas erfolgreich, scheitert aber irgendwann. Wie behebt man das?

+8

Versuchen 'Prelude>: pwd' (oder was auch immer Windows Pendant von pwd ist). Ich denke WinGHCi läuft ein gewöhnliches ghci darunter, damit sollte es funktionieren. –

+0

@DanielFischer: Das funktioniert super. Wäre es möglich, die Eingabeaufforderung selbst zu konfigurieren? – Nawaz

+0

Ja, Sie können die Eingabeaufforderung mit ': set prompt Whatever 'konfigurieren (geben Sie':? 'Ein, um eine kurze Hilfe zu ghci-Befehlen zu erhalten). Das ist jedoch pro Sitzung. Um es dauerhaft zu machen, tun Sie es in Ihrer '.ghci' Datei (ich denke sie werden unter Windows anders genannt, erinnern sich nicht an was). Ich bin mir nicht sicher, wie ich es auf das aktuelle Verzeichnis einstellen soll. –

Antwort

3

Eine Lösung des armen Mannes die GHCI prompt auf die aktuelle Arbeitsverzeichnis einstellen würde

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 

in der .ghci Datei werden Putten.

In der ersten Zeile definieren wir cur :: String -> IO String, die das aktuelle Verzeichnis abruft und den Befehl ghci zurückgibt, um die Eingabeaufforderung entsprechend zu setzen. Dann definieren wir einen ghci-Befehl doprompt, der diese Aktion und einen Befehl ausführt, um das Verzeichnis zu ändern und die Eingabeaufforderung zu setzen. Die letzte Zeile führt beim Start :doprompt aus.

Leider macht das nicht :cd dir die Änderung des Verzeichnisses widerspiegeln, würde man danach eine manuelle :doprompt machen, oder :mycd verwenden, um das Verzeichnis zu ändern.

Um zu lange Eingabeaufforderungen zu vermeiden, könnte man das Ergebnis von getCurrentDirectory manipulieren, indem man einen Anfangsteil des Dateipfads löscht.

Ein weiterer Nachteil dieses einfachen Ansatzes ist, dass die Eingabeaufforderung keine Informationen mehr über die geladenen Module enthält. Ich glaube, dass alles überwunden werden konnte, aber ich bin nicht motiviert genug, um jetzt zu graben.

+0

Lass mich das versuchen. Vorläufig +1 für den Versuch, zu antworten. – Nawaz

+0

Ich habe es unter Windows versucht, und es hat nicht funktioniert. Ich fügte Dinge hinzu, die ich getan habe, zu meiner Frage. Sieh es dir an. – Nawaz

+0

Es tut mir leid, das zu hören. Irgendwelche Anzeichen, was fehlgeschlagen ist? (Ich sehe noch keine Bearbeitung Ihrer Frage) –

21

System.Directory.getCurrentDirectory

Verwandte Themen