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

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

提问人:artella 提问时间:8/12/2012 最后编辑:Richard J. Ross IIIartella 更新时间:8/18/2020 访问量:908

问:

在 haskell 模式下的 emacs 中,我想更改命令

  • “C-x C-s”

  • “C-x C-s”后跟“C-c C-l”。

从以下方面获得提示: 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))

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

[编辑2]其他变体包括:

(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))
haskell emacs elisp haskell 模式

评论

0赞 tripleee 8/12/2012
您可以将键盘序列绑定到命令,而不是将另一个键盘序列绑定。你想完成什么?
0赞 artella 8/12/2012
基本上,我希望“C-s C-x”首先保存文件,然后自动将文件加载到启动器中,而不仅仅是保存文件。谢谢
2赞 tripleee 8/12/2012
寻找或创建一个函数来执行此操作。 ...概念验证,查找如何传递当前缓冲区以及“启动器”的确切命令。haskell-mode-after-save-hook(defun my-haskell-save-buffer (buf) (interactive ...) (save-buffer buf) (haskell-launch buf) )interactive
1赞 vivian 8/12/2012
绑定保存文件然后加载文件可能更有意义,而不是每次保存文件时都加载文件。C-c C-l
0赞 artella 8/12/2012
@vivian : 对我来说,这只是一个学习 emacs 的实验。正如 Tikhon Jelvis 所指出的,“C-c C-l”已经保存了,所以(除了在缓冲区之间移动光标之外)上述功能实际上没有任何附加值!谢谢

答:

6赞 Tikhon Jelvis 8/12/2012 #1

您要做的是运行运行的函数,然后运行该函数。您可以通过 找到某个键绑定运行的函数。也就是说,首先键入您感兴趣的键命令。C-x C-sC-c C-lC-h kC-h k

这给了我们 for 和 for .它的含义正是你认为它的作用——这个论点是可选的,所以我们不关心它。(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。每当您想要将多个不同的键绑定合并为一个键时,此方法都有效。

评论

0赞 Hartmut Pfarr 1/10/2014
哇,这为我每天节省了 1 个小时。谢谢
0赞 Veera Sivarajan 8/18/2020 #2

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

所以修复后的功能是

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