2012-11-03 11 views
5

Sto modificando un file sorgente haskell. Voglio eseguire la mia funzione principale nel mio buffer inferiore-haskell (già aperto in un frame diverso) e continuare a modificare il mio file sorgente. Per fare questo, lo faccioFunzione per valutare haskell in ghci durante la modifica del file sorgente utilizzando Emacs

C-c C-l, cornice cambio, main<ret>, tornare alla cornice originale

Questo sembra abbastanza inefficiente. Mi piacerebbe avere una funzione/chiave emacs che faccia un colpo.

risposta

7

In realtà esiste una funzione già definita in inf-haskell.el: inferior-haskell-load-and-run. Carica il tuo file corrente e viene eseguito :main.

È possibile associare ad un tasto in modalità Haskell con l'aggiunta di un gancio:

(defun my-haskell-mode-hook() 
    (local-set-key (kbd "C-x C-r") 'inferior-haskell-load-and-run)) 
(add-hook 'haskell-mode-hook 'my-haskell-mode-hook) 

Tuttavia, giocare con questo per un po ', sembra avere un problema strano sul mio computer: a volte , quando si apre sul buffer *haskell*, non sposta il punto verso la fine. Trovo questo piuttosto fastidioso. Si può facilmente risolvere il problema spostando il punto fino alla fine da soli:

(defun my-haskell-load-and-run() 
    "Loads and runs the current Haskell file." 
    (interactive) 
    (inferior-haskell-load-and-run inferior-haskell-run-command) 
    (sleep-for 0 100) 
    (end-of-buffer)) 

Credo che il sleep-for è necessaria perché il comando Haskell viene eseguito in modo asincrono e prende un po 'di tempo per tornare. Tutta questa faccenda è qualcosa di un hack, ma sembra funzionare.

Inoltre, è possibile personalizzare esattamente ciò che è inferior-haskell-run-command. Per impostazione predefinita, è :main. Tuttavia, per me, penso che solo main sarebbe meglio perché main è interessato da :set args ... dove non lo è :main.

Se si vuole rimanere nella vostra buffer di Haskell corrente, è possibile solo fare questo:

(defun my-haskell-load-and-run() 
    "Loads and runs the current Haskell file." 
    (interactive) 
    (let ((start-buffer (current-buffer))) 
    (inferior-haskell-load-and-run inferior-haskell-run-command) 
    (sleep-for 0 100) 
    (end-of-buffer) 
    (pop-to-buffer start-buffer))) 
+0

Ciò funziona grande tranne il mio focus è sul telaio inferiore-Haskell alla fine. Mi piacerebbe che fosse sul file sorgente che stavo modificando. –

+0

La soluzione più semplice sarebbe quella di tornare al buffer in cui hai iniziato. Lo modificherò nella mia risposta. –

+0

Grazie. Per catturare tutte le eccezioni nel registro di Inf-Haskell, nel mio caso ho aumentato un po 'il tempo di attesa. (sleep-for 1 750) – Hartmut

Problemi correlati