8

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

  • “Cx Cs”

  • “Cx Cs”后跟“Cc Cl”。

从:Haskell.org:Emacs/Keybindings 和简单用法中得到提示,我尝试将以下变体插入 .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))
4

2 回答 2

6

您要做的是运行运行的函数,C-x C-s然后运行该函数C-c C-l。您可以通过C-h k. 也就是说,首先键入C-h k您感兴趣的键盘命令。

这给了我们(save-buffer &optional ARGS)forC-x C-s(inferior-haskell-load-file &optional RELOAD)for C-c C-l。这&optional意味着你认为它的作用——这个参数是可选的,所以我们不关心它。

现在编写同时执行它们的函数:

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

现在您可以将这个函数绑定到C-x C-shaskell 模式,就像您一直在做的那样:

(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。每当您想将多个不同的键绑定组合成一个时,这种方法就可以工作。

于 2012-08-11T20:38:13.540 回答
0

接受的答案在 2020 年不起作用。要修复它,您必须替换(inferior-haskell-load-file)(haskell-process-load-file).

所以修复后的功能是

(defun haskell-mode-save-load-buffer ()
      (interactive)
      (save-buffer)
      (haskell-process-load-file))
于 2020-08-18T11:44:04.810 回答