怎么能定义一个可以在M-x里面可以用的命令

求助万能的社区~

我定义了一个函数,但是M-x的时候找不到它

我想问问,怎么能定义一个M-x里面的命令,全局的怎么定义,单个mode的怎么定义?

谢谢大家.

(defun foo ()
  (interactive)
  ...)
2 个赞

好像不能针对单个 mode 定义吧,感觉也没啥必要,一般就是全局定义,楼上说的

1 个赞

elisp 没有真正意义上的公有/私有方法,一般通过命名来区分:

(defun packagename-public-funciton () ...)
(defun packagename--private-funciton () ...)

两个连接符号表示私有成员,这好像已经是共识了,但具体用什么符号就各自发挥了,比如 spacemacs:

(defun layername/public-function() ...)
(defun layername//private-function() ...)
(defmacro layername|a-macro() ...)
(defvar layername-public-variable ...)
(defvar layername--private-variable ...)

跟 python 一样,这些只是君子协定,不具备约束力,全靠自觉。即使声明了 private,仍然可以从外部调用。

虽然 elisp 没有 namespace,但是却有人写了 names 这样的包:

(define-namespace packagename-
  (defun -private-function() ...)
  (defun public-function()
    ...
    (-private-function)
    ...)
)

在外部看到的是 packagename--private-functionpackagename-public-function,详见:https://github.com/Malabarba/names/blob/master/UsageExample.org

3 个赞

defvar 生成的变量都是全局变量, 没有模块的概念

1 个赞

能从 M-x 执行的函数叫做命令,它比普通的函数多一个 interactive 语句,如

(defun foo ()
  (interactive)
  (message "Hello, World!"))

详细文档可参考:(elisp) Defining Commands

2 个赞