diff --git a/elisp/ghc-rewrite.el b/elisp/ghc-rewrite.el index 681c897..a0e3f90 100644 --- a/elisp/ghc-rewrite.el +++ b/elisp/ghc-rewrite.el @@ -11,6 +11,22 @@ (require 'ghc-func) (require 'ghc-process) +;; Common code for case splitting and refinement + +(defun ghc-perform-rewriting (info) + (let* ((current-line (line-number-at-pos)) + (begin-line (ghc-sinfo-get-beg-line info)) + (begin-line-diff (+ 1 (- begin-line current-line))) + (begin-line-pos (line-beginning-position begin-line-diff)) + (begin-pos (- (+ begin-line-pos (ghc-sinfo-get-beg-column info)) 1)) + (end-line (ghc-sinfo-get-end-line info)) + (end-line-diff (+ 1 (- end-line current-line))) + (end-line-pos (line-beginning-position end-line-diff)) + (end-pos (- (+ end-line-pos (ghc-sinfo-get-end-column info)) 1)) ) + (delete-region begin-pos end-pos) + (insert (ghc-sinfo-get-info info)) ) + ) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Case splitting @@ -23,17 +39,7 @@ (let ((info (ghc-obtain-case-split))) (if (null info) (message "Cannot split in cases") - (let* ((current-line (line-number-at-pos)) - (begin-line (ghc-sinfo-get-beg-line info)) - (begin-line-diff (+ 1 (- begin-line current-line))) - (begin-line-pos (line-beginning-position begin-line-diff)) - (begin-pos (- (+ begin-line-pos (ghc-sinfo-get-beg-column info)) 1)) - (end-line (ghc-sinfo-get-end-line info)) - (end-line-diff (+ 1 (- end-line current-line))) - (end-line-pos (line-beginning-position end-line-diff)) - (end-pos (- (+ end-line-pos (ghc-sinfo-get-end-column info)) 1)) ) - (delete-region begin-pos end-pos) - (insert (ghc-sinfo-get-info info)) ) ))) + (ghc-perform-rewriting info)) )) (defun ghc-obtain-case-split () (let* ((ln (int-to-string (line-number-at-pos))) @@ -42,6 +48,25 @@ (cmd (format "split %s %s %s\n" file ln cn))) (ghc-sync-process cmd))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Refinement +;;; + +(defun ghc-refine () + (interactive) + (let ((info (ghc-obtain-refine (read-string "Refine with: ")))) + (if (null info) + (message "Cannot refine") + (ghc-perform-rewriting info)) )) + +(defun ghc-obtain-refine (expr) + (let* ((ln (int-to-string (line-number-at-pos))) + (cn (int-to-string (1+ (current-column)))) + (file (buffer-file-name)) + (cmd (format "refine %s %s %s %s\n" file ln cn expr))) + (ghc-sync-process cmd))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Initial code from signature diff --git a/elisp/ghc.el b/elisp/ghc.el index 7678cb3..6136f16 100644 --- a/elisp/ghc.el +++ b/elisp/ghc.el @@ -73,8 +73,9 @@ (defvar ghc-hoogle-key (format "\C-c%c" (ghc-find-C-h))) (defvar ghc-shallower-key "\C-c<") (defvar ghc-deeper-key "\C-c>") -(defvar ghc-case-split-key "\C-c\C-p") -(defvar ghc-initial-sig-key "\C-c\C-s") +(defvar ghc-case-split-key "\C-c\C-s") +(defvar ghc-initial-sig-key "\C-c\C-g") +(defvar ghc-refine-key "\C-c\C-r") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; @@ -109,6 +110,7 @@ (define-key haskell-mode-map ghc-deeper-key 'ghc-make-indent-deeper) (define-key haskell-mode-map ghc-case-split-key 'ghc-case-split) (define-key haskell-mode-map ghc-initial-sig-key 'ghc-initial-code-from-signature) + (define-key haskell-mode-map ghc-refine-key 'ghc-refine) (ghc-comp-init) (setq ghc-initialized t)) (ghc-import-module)