in emacs in haskell-mode, I wanted to change the command
- "C-x C-s"
to
- "C-x C-s" followed by "C-c C-l".
Taking a cue from : Haskell.org : Emacs/Keybindings and simple usage I tried inserting the following variants into the .emacs file but they did not work. Any suggestions as to how I might go about implementing the functionality above would be most welcomed! Thanks.
Variant 1
(defun haskell-hook ()
(define-key haskell-mode-map (kbd "C-x C-s") (kbd "C-x C-s C-c C-l"))
(add-hook 'haskell-mode-hook 'haskell-hook)
Variant 2
(defun haskell-hook ()
(define-key haskell-mode-map (kbd "C-x C-s") 'my-haskell-mode-save-buffer)
(defun my-haskell-mode-save-buffer ()
(interactive)
(execute-kbd-macro [?\C-s ?\C-x ?\C-c ?\C-l return]))
(add-hook 'haskell-mode-hook 'haskell-hook)
[EDIT 1] @Tikhon Jelvis : that was definitely a good learning exercise! Thanks. Using the methods outlined in your post I changed your function to :
(defun my-haskell-mode-save-buffer ()
(interactive)
(save-buffer)
(inferior-haskell-load-file)
(other-window 1))
where the last line programmatically switches the cursor to the interactive window. Thank you.
[EDIT2] Other variants include :
(defun my-haskell-mode-save-buffer ()
(interactive)
(execute-kbd-macro (read-kbd-macro "C-c C-l"))
(other-window 1))
and :
(defun my-haskell-mode-save-buffer ()
(interactive)
(execute-kbd-macro [?\C-c ?\C-l])
(other-window 1))
What you want to do is run the function that
C-x C-s
runs followed by running the functionC-c C-l
does. You can find out what function is run by some key binding viaC-h k
. That is, first typeC-h k
then the key command you're interested in.This gives us
(save-buffer &optional ARGS)
forC-x C-s
and(inferior-haskell-load-file &optional RELOAD)
forC-c C-l
. The&optional
means exactly what you think it does--that argument is optional, so we don't care about it.Now write the function that does both of them:
Now you can bind this function to
C-x C-s
in haskell mode exactly how you've been doing it:EDIT: It seems
C-c C-l
saves your file by default before loading it. This means you can just writeand have exactly the same effect without writing your own function. However, I think writing it my way is a good learning exercise :P. That approach works whenever you want to combine multiple different key bindings into one.