Emacs:在Haskell模式下重新定义命令(haskell-mode-hook)

时间:2012-08-11 18:19:22

标签: haskell emacs macros elisp haskell-mode

在haskell-mode的emacs中,我想更改命令

  • “C-x C-s”

  • “C-x C-s”,接着是“C-c C-1”。

Haskell.org : Emacs/Keybindings and simple usage中获取提示我尝试将以下变体插入.emacs文件,但它们不起作用。关于如何实现上述功能的任何建议都将受到欢迎!感谢。

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

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


[编辑1] @Tikhon Jelvis:这绝对是一次很好的学习练习!谢谢。使用帖子中列出的方法,我将您的功能更改为:

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

其中最后一行以编程方式将光标切换到交互式窗口。谢谢。

[EDIT2] 其他变种包括:

(defun my-haskell-mode-save-buffer ()
  (interactive)
  (execute-kbd-macro (read-kbd-macro "C-c C-l"))
  (other-window 1)) 

和:

(defun my-haskell-mode-save-buffer ()
  (interactive)
  (execute-kbd-macro [?\C-c ?\C-l])
  (other-window 1))

2 个答案:

答案 0 :(得分:6)

您要执行的是运行C-x C-s运行的函数,然后运行函数C-c C-l。您可以通过C-h k找出某些键绑定运行的函数。也就是说,首先输入C-h k然后输入你感兴趣的关键命令。

这为(save-buffer &optional ARGS)提供了C-x C-s,为(inferior-haskell-load-file &optional RELOAD)提供了C-c C-l&optional意味着你的想法 - 这个论点是可选的,所以我们不关心它。

现在编写执行这两项操作的函数:

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

现在你可以在haskell模式下将这个函数绑定到C-x C-s,完全按照你的方式进行:

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

编辑:在加载文件之前,默认情况下C-c C-l会保存您的文件。这意味着你可以写

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

并且在不编写自己的函数的情况下具有完全相同的效果。但是,我认为以我的方式写它是一个很好的学习练习:P。只要您想将多个不同的键绑定合并为一个,该方法就可以使用。

答案 1 :(得分:0)

可接受的答案在2020年不起作用。要解决该问题,您必须将(inferior-haskell-load-file)替换为(haskell-process-load-file)

所以修复后的功能是

(defun haskell-mode-save-load-buffer ()
      (interactive)
      (save-buffer)
      (haskell-process-load-file))