提问人:artella 提问时间:8/12/2012 最后编辑:Richard J. Ross IIIartella 更新时间:8/18/2020 访问量:908
Emacs:在 Haskell 模式下重新定义命令 (haskell-mode-hook)
Emacs : Redefining command in Haskell-mode (haskell-mode-hook)
问:
在 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))
答:
您要做的是运行运行的函数,然后运行该函数。您可以通过 找到某个键绑定运行的函数。也就是说,首先键入您感兴趣的键命令。C-x C-s
C-c C-l
C-h k
C-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。每当您想要将多个不同的键绑定合并为一个键时,此方法都有效。
评论
公认的答案在 2020 年不起作用。要修复它,您必须替换为 .(inferior-haskell-load-file)
(haskell-process-load-file)
所以修复后的功能是
(defun haskell-mode-save-load-buffer ()
(interactive)
(save-buffer)
(haskell-process-load-file))
上一个:恢复已删除的子模块
评论
haskell-mode-after-save-hook
(defun my-haskell-save-buffer (buf) (interactive ...) (save-buffer buf) (haskell-launch buf) )
interactive
C-c C-l