I am working through the amazing Data 61 Functional Programming Course (seriously, put it on your list!) and I found myself doing a repeated set of actions. Repeated sets of actions are perfect for automation!
The course has some sections with comments indicating the expected behavior:
-- >>> parse (satisfyAll (isUpper :. (/= 'X') :. Nil)) "ABC" -- Result >BC< 'A' -- -- >>> isErrorResult (parse (satisfyAll (isUpper :. (/= 'X') :. Nil)) "XBc") -- True satisfyAll :: List (Char -> Bool) -> Parser Char satisfyAll = error "fill this in"
After about the hundredth time copying a comment to my REPL and running it, I decided to make a keyboard shortcut to do it.
In my emacs init file, I start a new binding:
(define-key haskell-mode-map (kbd "<f5>") 'copy-haskell-comment) (defun copy-haskell-comment () (interactive) (message "test") )
eval-last-sexp to add the binding and the function into my running
emacs instance without needing to restart. Now, going to the haskell file, I can
hit F5 and see “test” printed!
From here on out, I just need to figure out exactly what commands I ran to copy
the line over, delete the comment parts, and run it. Using
C-h k I can
find out the names of the commands, and I came up with this:
(defun copy-haskell-comment () (interactive) (haskell-interactive-copy-to-prompt) ;; copy line to REPL (haskell-interactive-switch) ;; move to REPL buffer (evil-goto-line) ;; move to last line in REPL buffer (replace-string "-- >>>" "" ) ;; remove the comment and chevrons (evil-end-of-line) ;; move cursor to end of line (haskell-interactive-mode-return) ;; submit the line of code (haskell-interactive-switch-back) ;; return to the original buffer )
Venerable emacs users will see some odd commands in there: those are just
imported from Evil and Spacemacs. All it took was using
C-h k to find the
names of the commands, and then putting the commands into the function! After
each new line, I used
eval-last-sexp to reevaulate the function so I could
ensure it performed as expected.
Now I have a single keystroke to do what took me many before! This is why I keep using emacs!