elisp/shm-init.el
changeset 78 7d7662fcc8d1
parent 77 c99c95938a05
child 79 f3334abf4322
equal deleted inserted replaced
77:c99c95938a05 78:7d7662fcc8d1
     1 ;; ~/.emacs.d/elisp/shm-init.el
       
     2 ;; Luke Hoersten <[email protected]>
       
     3 
       
     4 ;; Require packages
       
     5 (require 'package-require)
       
     6 (package-require '(haskell-mode shm hindent flymake-haskell-multi))
       
     7 
       
     8 ;; Requirements
       
     9 (require 'shm)
       
    10 (require 'hindent)
       
    11 (require 'shm-case-split)
       
    12 (require 'shm-reformat)
       
    13 (require 'haskell)
       
    14 (require 'haskell-mode)
       
    15 (require 'hindent)
       
    16 (require 'haskell-process)
       
    17 (require 'haskell-simple-indent)
       
    18 (require 'haskell-interactive-mode)
       
    19 (require 'haskell-font-lock)
       
    20 
       
    21 ;; Functions
       
    22 (defun haskell-process-all-types ()
       
    23   "List all types in a grep-mode buffer."
       
    24   (interactive)
       
    25   (let ((session (haskell-session)))
       
    26     (switch-to-buffer (get-buffer-create (format "*%s:all-types*"
       
    27                                                  (haskell-session-name (haskell-session)))))
       
    28     (setq haskell-session session)
       
    29     (cd (haskell-session-current-dir session))
       
    30     (let ((inhibit-read-only t))
       
    31       (erase-buffer)
       
    32       (let ((haskell-process-log nil))
       
    33         (insert (haskell-process-queue-sync-request (haskell-process) ":all-types")))
       
    34       (unless (eq major-mode  'compilation-mode)
       
    35         (compilation-mode)
       
    36         (setq compilation-error-regexp-alist
       
    37               haskell-compilation-error-regexp-alist)))))
       
    38 
       
    39 (defun haskell-interactive-toggle-print-mode ()
       
    40   (interactive)
       
    41   (setq haskell-interactive-mode-eval-mode
       
    42         (intern
       
    43          (ido-completing-read "Eval result mode: "
       
    44                               '("fundamental-mode"
       
    45                                 "haskell-mode"
       
    46                                 "ghc-core-mode")))))
       
    47 
       
    48 (defun haskell-insert-doc ()
       
    49   "Insert the documentation syntax."
       
    50   (interactive)
       
    51   (insert "-- | "))
       
    52 
       
    53 (defun haskell-insert-undefined ()
       
    54   "Insert undefined."
       
    55   (interactive)
       
    56   (if (and (boundp 'structured-haskell-mode)
       
    57            structured-haskell-mode)
       
    58       (shm-insert-string "undefined")
       
    59     (insert "undefined")))
       
    60 
       
    61 (defun haskell-move-right ()
       
    62   (interactive)
       
    63   (haskell-move-nested 1))
       
    64 
       
    65 (defun haskell-move-left ()
       
    66   (interactive)
       
    67   (haskell-move-nested -1))
       
    68 
       
    69 (defun haskell-who-calls (&optional prompt)
       
    70   "Grep the codebase to see who uses the symbol at point."
       
    71   (interactive "P")
       
    72   (let ((sym (if prompt
       
    73                  (read-from-minibuffer "Look for: ")
       
    74                (haskell-ident-at-point))))
       
    75     (let ((existing (get-buffer "*who-calls*")))
       
    76       (when existing
       
    77         (kill-buffer existing)))
       
    78     (let ((buffer
       
    79            (grep-find (format "cd %s && find . -name '*.hs' -exec grep -inH -e %s {} +"
       
    80                               (haskell-session-current-dir (haskell-session))
       
    81                               sym))))
       
    82       (with-current-buffer buffer
       
    83         (rename-buffer "*who-calls*")
       
    84         (switch-to-buffer-other-window buffer)))))
       
    85 
       
    86 (defun haskell-auto-insert-module-template ()
       
    87   "Insert a module template for the newly created buffer."
       
    88   (interactive)
       
    89   (when (and (= (point-min)
       
    90                 (point-max))
       
    91              (buffer-file-name))
       
    92     (insert
       
    93      "-- | "
       
    94      "\n"
       
    95      "\n"
       
    96      "module "
       
    97      )
       
    98     (let ((name (haskell-guess-module-name)))
       
    99       (if (string= name "")
       
   100           (progn (insert "Main")
       
   101                  (shm-evaporate (- (point) 5)
       
   102                                 (point)))
       
   103         (insert name)))
       
   104     (insert " where"
       
   105             "\n"
       
   106             "\n")
       
   107     (goto-char (point-min))
       
   108     (forward-char 4)))
       
   109 
       
   110 (defun shm-contextual-space ()
       
   111   "Do contextual space first, and run shm/space if no change in
       
   112 the cursor position happened."
       
   113   (interactive)
       
   114   (if (looking-back "import")
       
   115       (call-interactively 'haskell-mode-contextual-space)
       
   116     (progn
       
   117       (let ((ident (haskell-ident-at-point)))
       
   118         (when ident
       
   119           (and interactive-haskell-mode
       
   120                (haskell-process-do-try-type ident))))
       
   121       (call-interactively 'shm/space))))
       
   122 
       
   123 ;; Mode settings
       
   124 (custom-set-variables
       
   125  '(haskell-process-type 'cabal-repl)
       
   126  '(haskell-process-args-cabal-repl
       
   127    '("--ghc-option=-ferror-spans" "--with-ghc=ghci-ng"))
       
   128  '(haskell-notify-p t)
       
   129  '(haskell-stylish-on-save nil)
       
   130  '(haskell-tags-on-save nil)
       
   131  '(haskell-process-suggest-remove-import-lines t)
       
   132  '(haskell-process-auto-import-loaded-modules t)
       
   133  '(haskell-process-log t)
       
   134  '(haskell-process-reload-with-fbytecode nil)
       
   135  '(haskell-process-use-presentation-mode t)
       
   136  '(haskell-interactive-mode-include-file-name nil)
       
   137  '(haskell-interactive-mode-eval-pretty nil)
       
   138  '(shm-use-presentation-mode t)
       
   139  '(shm-auto-insert-skeletons t)
       
   140  '(shm-auto-insert-bangs t)
       
   141  '(haskell-process-suggest-haskell-docs-imports t)
       
   142  '(hindent-style "chris-done")
       
   143  '(haskell-interactive-mode-eval-mode 'haskell-mode)
       
   144  '(haskell-process-path-ghci "ghci-ng")
       
   145  '(haskell-process-args-ghci '("-ferror-spans"))
       
   146  '(haskell-process-args-cabal-repl
       
   147    '("--ghc-option=-ferror-spans" "--with-ghc=ghci-ng"))
       
   148  '(haskell-process-generate-tags nil)
       
   149  '(haskell-complete-module-preferred
       
   150    '("Data.ByteString"
       
   151      "Data.ByteString.Lazy"
       
   152      "Data.List"
       
   153      "Data.Map"
       
   154      "Data.Maybe"
       
   155      "Data.Monoid"
       
   156      "Data.Ord")))
       
   157 
       
   158 ;; Add hook
       
   159 (add-hook 'haskell-mode-hook 'structured-haskell-mode)
       
   160 (add-hook 'haskell-mode-hook 'interactive-haskell-mode)
       
   161 (add-hook 'haskell-interactive-mode-hook 'structured-haskell-repl-mode)
       
   162 (add-hook 'haskell-mode-hook 'haskell-auto-insert-module-template)
       
   163 
       
   164 ;; Keybindings
       
   165 (define-key interactive-haskell-mode-map [f5] 'haskell-process-load-or-reload)
       
   166 (define-key interactive-haskell-mode-map [f12] 'haskell-process-reload-devel-main)
       
   167 (define-key interactive-haskell-mode-map (kbd "M-,") 'haskell-who-calls)
       
   168 (define-key interactive-haskell-mode-map (kbd "C-`") 'haskell-interactive-bring)
       
   169 (define-key interactive-haskell-mode-map (kbd "C-c C-k") 'haskell-interactive-mode-clear)
       
   170 (define-key interactive-haskell-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build)
       
   171 (define-key interactive-haskell-mode-map (kbd "C-c c") 'haskell-process-cabal)
       
   172 (define-key interactive-haskell-mode-map (kbd "M-.") 'haskell-mode-goto-loc)
       
   173 (define-key interactive-haskell-mode-map (kbd "C-?") 'haskell-mode-find-uses)
       
   174 (define-key interactive-haskell-mode-map (kbd "C-c C-t") 'haskell-mode-show-type-at)
       
   175 
       
   176 (define-key haskell-mode-map (kbd "C-c i") 'hindent/reformat-decl)
       
   177 (define-key haskell-mode-map [f8] 'haskell-navigate-imports)
       
   178 (define-key haskell-mode-map (kbd "C-c C-u") 'haskell-insert-undefined)
       
   179 (define-key haskell-mode-map (kbd "C-c C-a") 'haskell-insert-doc)
       
   180 (define-key haskell-mode-map (kbd "C-<return>") 'haskell-simple-indent-newline-indent)
       
   181 (define-key haskell-mode-map (kbd "C-<right>") 'haskell-move-right)
       
   182 (define-key haskell-mode-map (kbd "C-<left>") 'haskell-move-left)
       
   183 (define-key haskell-mode-map (kbd "<space>") 'haskell-mode-contextual-space)
       
   184 
       
   185 (define-key haskell-cabal-mode-map (kbd "C-`") 'haskell-interactive-bring)
       
   186 (define-key haskell-cabal-mode-map [?\C-c ?\C-z] 'haskell-interactive-switch)
       
   187 (define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build)
       
   188 (define-key haskell-cabal-mode-map (kbd "C-c c") 'haskell-process-cabal)
       
   189 (define-key haskell-cabal-mode-map (kbd "C-c C-k") 'haskell-interactive-mode-clear)
       
   190 
       
   191 (define-key haskell-interactive-mode-map (kbd "C-c C-v") 'haskell-interactive-toggle-print-mode)
       
   192 (define-key haskell-interactive-mode-map (kbd "C-c C-i") 'haskell-process-do-info)
       
   193 (define-key haskell-interactive-mode-map [f12] 'haskell-process-reload-devel-main)
       
   194 (define-key haskell-interactive-mode-map (kbd "C-<left>") 'haskell-interactive-mode-error-backward)
       
   195 (define-key haskell-interactive-mode-map (kbd "C-<right>") 'haskell-interactive-mode-error-forward)
       
   196 (define-key haskell-interactive-mode-map (kbd "C-c c") 'haskell-process-cabal)
       
   197 
       
   198 (define-key shm-map (kbd "C-c C-p") 'shm/expand-pattern)
       
   199 (define-key shm-map (kbd "C-c C-s") 'shm/case-split)
       
   200 (define-key shm-map (kbd "SPC") 'shm-contextual-space)
       
   201 (define-key shm-map (kbd "C-\\") 'shm/goto-last-point)
       
   202 (define-key shm-map (kbd "C-c C-f") 'shm-fold-toggle-decl)
       
   203 (define-key shm-map (kbd "C-c i") 'shm-reformat-decl)
       
   204 
       
   205 (turn-on-haskell-simple-indent)
       
   206 (load "haskell-mode-autoloads.el")
       
   207 
       
   208 (message "Loading shm-init...done")
       
   209 (provide 'shm-init)