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

art*_*lla 8 emacs macros haskell elisp haskell-mode

在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)
Run Code Online (Sandbox Code Playgroud)

变体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)
Run Code Online (Sandbox Code Playgroud)

[编辑1] @Tikhon Jelvis:这绝对是一个很好的学习练习!谢谢.使用帖子中列出的方法,我将您的功能更改为:

(defun my-haskell-mode-save-buffer ()
  (interactive)
  (save-buffer)
  (inferior-haskell-load-file)
  (other-window 1))
Run Code Online (Sandbox Code Playgroud)

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

[EDIT2]其他变种包括:

(defun my-haskell-mode-save-buffer ()
  (interactive)
  (execute-kbd-macro (read-kbd-macro "C-c C-l"))
  (other-window 1)) 
Run Code Online (Sandbox Code Playgroud)

并且:

(defun my-haskell-mode-save-buffer ()
  (interactive)
  (execute-kbd-macro [?\C-c ?\C-l])
  (other-window 1))
Run Code Online (Sandbox Code Playgroud)

Tik*_*vis 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)) 
Run Code Online (Sandbox Code Playgroud)

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

(add-hook 'haskell-mode-hook (lambda () 
                                (local-set-key (kbd "C-x C-s") 'my-haskell-mode-save-buffer)))
Run Code Online (Sandbox Code Playgroud)

编辑:C-c C-l在加载之前,它似乎默认保存您的文件.这意味着你可以写

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

并且在不编写自己的功能的情况下具有完全相同的效果 但是,我认为以我的方式写它是一个很好的学习练习:P.只要您想将多个不同的键绑定合并为一个,该方法就可以使用.