我想有一个按键 f7
绑定到一个函数 project-run-app
,现在想根据当前 buffer 的 major-mode
调用不同的实现
比如 c++-mode
和 python-mode
的 project-run-app
的实现应该是不同的,在 c++-mode
的 buffer 中调用 c++
的 project-run-app
的实现,在 python-mode
的 buffer 中调用 python
的 project-run-app
的实现。
已知的一种方式就是用 if-else
判断,但是这样耦合太重了,不知道有没有一种动态派发的方式?
(cl-defgeneric myfunc ())
(cl-defmethod myfunc (&context (major-mode foo-mode)) ...)
(cl-defmethod myfunc (&context (major-mode bar-mode)) ...)
6 个赞
可以了,非常感谢!
(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 的话,可能要考虑的比较多,我这个是自己的配置,简单一点就行