在haskell-mode的emacs中,我想更改命令
到
从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))
答案 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))