Emacs自定义命令行参数

Sla*_*nov 17 emacs elisp

从文档中我可以看到我可以访问命令行参数(命令行参数).我想添加自己的论点,但Emacs在启动时抱怨它不能识别它们.

例如

emacs -my_argument
Run Code Online (Sandbox Code Playgroud)

我明白了:

command-line-1: Unknown option `-my_argument'

什么是定义我的自定义参数并向我的Emacs会话提供信息的正确方法?有没有办法从命令行弹出参数?

Sea*_*ght 29

加入这样的事情你的~/.emacs,~/.emacs.el~/.emacs.d/init.el文件:

(defun my-argument-fn (switch)
  (message "i was passed -my_argument"))

(add-to-list 'command-switch-alist '("-my_argument" . my-argument-fn))
Run Code Online (Sandbox Code Playgroud)

然后你可以执行emacs -my_argument它应该打印i was passed -my_argument到迷你缓冲区.您可以在GNU elisp参考中找到更多信息.


kjf*_*tch 8

如另一篇文章所述,您可以添加自定义开关command-switch-alist,emacs将为命令行传入的任何匹配开关调用处理函数.但是,此操作.emacs在评估文件后完成.这适用于大多数情况,但您可能希望使用命令行参数来更改.emacs评估的执行路径或行为; 我经常这样做来启用/禁用配置块(主要用于调试).

为此,您可以command-line-args手动读取并检查您的交换机,然后从列表中删除它,这将停止emacs抱怨未知的参数.

(setq my-switch-found (member "-myswitch" command-line-args))
(setq command-line-args (delete "-myswitch" command-line-args))
Run Code Online (Sandbox Code Playgroud)

这样可以改变你的.emacs评价:

(unless my-switch-found
  (message "Didn't find inhibit switch, loading some config.") 
  ...)
Run Code Online (Sandbox Code Playgroud)

你可以把它构建成一个步骤:

;; This was written in SO text-box, not been tested.
(defun found-custom-arg (switch)
  (let ((found-switch (member switch command-line-args)))
    (setq command-line-args (delete switch command-line-args))
    found-switch))

(unless (found-custom-arg "-myswitch")
  (message "Loading config...")
  ...)
Run Code Online (Sandbox Code Playgroud)

  • 测试了标记为“未测试”的代码。它的工作原理与描述的完全一样。 (3认同)