简体   繁体   中英

Emacs : Redefining command in Haskell-mode (haskell-mode-hook)

in emacs in haskell-mode, I wanted to change the command

  • "Cx Cs"

to

  • "Cx Cs" followed by "Cc Cl".

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 Cx Cs runs followed by running the function Cc Cl does. You can find out what function is run by some key binding via Ch k . That is, first type Ch k then the key command you're interested in.

This gives us (save-buffer &optional ARGS) for Cx Cs and (inferior-haskell-load-file &optional RELOAD) for Cc Cl . 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 Cx Cs 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 Cc Cl 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.

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))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM