同一个按键如何根据不同的 major-mode 调用对应的实现函数

我想有一个按键 f7 绑定到一个函数 project-run-app ,现在想根据当前 buffer 的 major-mode 调用不同的实现

比如 c++-modepython-modeproject-run-app 的实现应该是不同的,在 c++-mode 的 buffer 中调用 c++project-run-app 的实现,在 python-mode 的 buffer 中调用 pythonproject-run-app 的实现。

已知的一种方式就是用 if-else 判断,但是这样耦合太重了,不知道有没有一种动态派发的方式?

(cl-defgeneric myfunc ())

(cl-defmethod myfunc (&context (major-mode foo-mode)) ...)

(cl-defmethod myfunc (&context (major-mode bar-mode)) ...)
5 个赞

jerrypnz/major-mode-hydra.el: Spacemacs-esque major mode leader key powered by Hydra (github.com) 也行

可以了,非常感谢!

  (cl-defgeneric my-run-project()
    "Run project by current project type."
    (message "Not implement!"))

  (defun my/run-project()
    (interactive)
    (my-run-project))

  (cl-defmethod my-run-project (&context (major-mode dart-mode))
    "Run dart or flutter."
    (let* ((file (buffer-file-name))
           (test-file? (lsp-dart-test-file-p file)))
      (lsp-dart-code-lens--run-application file test-file?)))

实际上我应该想要的是一个命令有不同的实现

看起来楼主是想要实现多态呀。。。其实用keymap就行了,不必被OOP毒害

我感觉像这种全局性的命令用多态的方式一致性要好一些,keymap 的话每个 mode 都要去写一个绑定,每个绑定还要到不同名称的函数

如果是对大多数major-mode要做处理的话可以参考flycheck或者dumb-jump之类的方式,针对不同mode设置不同rule,灵活性很高,也易于扩展。

感谢建议 如果是 package 的话,可能要考虑的比较多,我这个是自己的配置,简单一点就行