Pregunta

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))
¿Fue útil?

Solución

What you want to do is run the function that C-x C-s runs followed by running the function C-c C-l does. You can find out what function is run by some key binding via C-h k. That is, first type C-h k then the key command you're interested in.

This gives us (save-buffer &optional ARGS) for C-x C-s and (inferior-haskell-load-file &optional RELOAD) for C-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:

(defun my-haskell-mode-save-buffer ()
  (interactive)
  (save-buffer)
  (inferior-haskell-load-file)) 

Now you can bind this function to C-x C-s in haskell mode exactly how you've been doing it:

(add-hook 'haskell-mode-hook (lambda () 
                                (local-set-key (kbd "C-x C-s") 'my-haskell-mode-save-buffer)))

EDIT: It seems C-c C-l saves your file by default before loading it. This means you can just write

(add-hook 'haskell-mode-hook (lambda ()
                            (local-set-key (kbd "C-x C-s") 'inferior-haskell-load-file)))

and 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.

Otros consejos

The accepted answer does not work in the year 2020. To fix it, you'd have to replace (inferior-haskell-load-file) with (haskell-process-load-file).

So the function after fixing is

(defun haskell-mode-save-load-buffer ()
      (interactive)
      (save-buffer)
      (haskell-process-load-file))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top