Emacs:在Haskell模式下重新定义命令(Haskell模式挂钩)

Emacs:在Haskell模式下重新定义命令(Haskell模式挂钩),haskell,emacs,macros,elisp,haskell-mode,Haskell,Emacs,Macros,Elisp,Haskell Mode,在haskell模式下的emacs中,我想更改命令 “C-x C-s” 到 “C-x C-s”后接“C-C-l” 借鉴:我尝试将以下变体插入到.emacs文件中,但它们不起作用。任何关于如何实现上述功能的建议都将受到欢迎!谢谢 变体1 变体2 [EDIT 1]@Tikhon Jelvis:这绝对是一个很好的学习练习!谢谢使用您文章中概述的方法,我将您的功能更改为: (defun my-haskell-mode-save-buffer () (interactive) (sav

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

  • “C-x C-s”

  • “C-x C-s”后接“C-C-l”
借鉴:我尝试将以下变体插入到.emacs文件中,但它们不起作用。任何关于如何实现上述功能的建议都将受到欢迎!谢谢

变体1

变体2



[EDIT 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)) 
以及:


您要做的是运行
C-x C-s
运行的函数,然后运行
C-C-l
执行的函数。您可以通过
C-hk
找到某个键绑定运行的函数。也就是说,首先键入
C-hk
,然后键入您感兴趣的键命令

这为
C-x C-s
提供了
(保存缓冲区和可选参数)
(低级haskell加载文件和可选重新加载)
用于
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-l
会在加载文件之前默认保存文件。这意味着你可以直接写

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

并且在不编写自己的函数的情况下具有完全相同的效果。然而,我认为以我的方式编写它是一个很好的学习练习:P。每当你想将多个不同的键绑定组合成一个键绑定时,这种方法就会起作用。

公认的答案在2020年不起作用。要修复它,您必须将

(劣质haskell加载文件)
替换为
(haskell进程加载文件)

因此,修复后的功能是

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

可以将键盘序列绑定到命令,而不是其他键盘序列。你想完成什么?基本上我希望“C-s C-x”先保存文件,然后在启动器中自动加载文件,而不仅仅是保存文件。感谢您在保存hook后查看
haskell模式,或者创建一个执行此操作的函数<代码>(取消我的haskell保存缓冲区(buf)(交互式…(保存缓冲区buf)(haskell启动buf))
。。。概念验证,查看如何使用
interactive
传递当前缓冲区以及“启动器”的确切命令。绑定保存文件然后加载到
C-C-l
可能更有意义,而不是每次保存时都加载文件。@vivian:这只是我学习emacs的一个实验。正如Tikhon Jelvis所指出的,“C-C-l”已经保存了,因此(除了在缓冲区之间移动光标之外),上面的功能实际上没有增加任何价值!谢谢,这样我一天可以节省1小时。非常感谢。
(add-hook 'haskell-mode-hook (lambda () 
                                (local-set-key (kbd "C-x C-s") 'my-haskell-mode-save-buffer)))
(add-hook 'haskell-mode-hook (lambda ()
                            (local-set-key (kbd "C-x C-s") 'inferior-haskell-load-file)))
(defun haskell-mode-save-load-buffer ()
      (interactive)
      (save-buffer)
      (haskell-process-load-file))