#emacs #daemon #cross-platform #mode #tool #command #cli-tool

app mph

一个用于在守护进程模式下使用 emacs 的 CLI 工具

8 个版本

0.1.8 2023 年 6 月 14 日
0.1.7 2023 年 6 月 14 日
0.1.3 2022 年 8 月 27 日
0.1.2 2022 年 6 月 7 日

#485命令行工具

Download history

每月 59 次下载

MPL-2.0 许可证

34KB
849

关于

mph 是一个用于与守护进程模式的 emacs 交互的 Rust CLI 工具。它负责以跨平台方式启动 emacs,并在某些方面比 emacsclient 更方便。

mph 是一个正在进行中的项目 - 它现在非常简单且组织混乱,但会随着时间的推移有机地发展,以执行其他任务。

安装

您可以使用 cargo 安装 mph

cargo install mph

命令

$ mph --help
mph 0.1.0
a rusty swiss army knife for emacs

USAGE:
    mph [FILE] [SUBCOMMAND]

ARGS:
    <FILE>


OPTIONS:
    -h, --help
            Print help information

    -V, --version
            Print version information

SUBCOMMANDS:
    client

    help
            Print this message or the help of the given subcommand(s)
    restart

    start

    status

    stop

启动、停止和重启

Linux

在 Linux 上,这些命令调用 systemctl,假设 emacs.service 已配置为用户单元。它应该会自动运行守护进程。

macOS

在 macOS 上,这些命令将使用 osascriptopen 启动由 homebrew tap 安装的 Emacs.app。您的 emacs 配置需要启动守护进程!

Windows

在 Windows 上,这些命令使用 Windows PowerShell 启动由 winget 安装的 runemacs.exe。您的 emacs 配置需要启动守护进程!

打开文件

如果您尝试使用 mph 打开文件,它将

  1. 使用 emacsclient 检查守护进程是否正在运行,并在必要时调用启动钩子
  2. 运行一个 emacs lisp 片段来检查是否已打开桌面框架
  3. 如果已存在,则只创建一个新的框架

开发

此项目有一个 justfile,其中包含基本的配方,这些配方包装了 emacs 和 cargo 相关的构建步骤。

elisp

此项目使用 org-babel 作为交互式 emacs lisp 开发环境。然后,这些片段被纠缠以供 rust 导入。

此任务尝试调用 doom emacsorg-tangle{.verbatim} 脚本来自动纠缠 ./elisp.org。它依赖于 emacs 的运行,因此任务被配置为尽力而为,并在失败时发出警告。

要手动纠缠文件,请将其在 emacs 中打开并按 C-v C-t

README

本项目的README是用org编写的,但crates.io只支持Markdown。使用just readme命令将使用pandoc生成Markdown格式的README。由于它不那么挑剔,因此它不会像elisp tangling那样优雅地失败。

构建、测试、检查、运行和发布

这些命令封装了它们的cargo等价命令,但首先尝试将lisp代码进行tangle并生成Markdown格式的README。

请注意,测试并不能有效地覆盖命令行当前的功能 - 您可以运行它们,但要确保应用程序正常工作,您还需要尝试交互式操作。

许可证

mph使用Mozilla公共许可证2.0。有关更多信息,请参阅./LICENSE。请注意,它不是emacs的一部分,而是第三方工具。

附录1:Lisp解释器

mph最有趣的功能依赖于使用emacsclient执行emacs lisp代码片段并解释结果。当前的调用只需要检查一个真值。然而,我希望从emacs解析更复杂的结果。

由emacsclient返回的文本旨在被解析为lisp。它不一定是运行的目的 - 许多对象不可序列化 - 但它可以被解析并作为结构化结果进行交互。

为此,我阅读了Bodil关于解析器组合器的教程,将新知识转换为nom,并开始编写正确的解析器。

此代码位于./src/elisp.rs,部分已完成。对于解析器有测试,大约有一半成功。

在我实现字符串、符号和cons单元格解析之前,它不会特别有用,并且是惰性的。然而,如果完成解析器,我计划将来用它来处理其他emacs lisp调用中emacsclient的结果。

附录2:远程服务器

我已经很久以前就一直在考虑在远程服务器上运行emacs的想法,使用ssh访问它,并使用计划任务和文件监视来生成和发布org内容,例如wiki。

   |-[docker container]--------------------------------|
  _|______           __________________                |
->| sshd |---------->| emacsclient -t |                |
  |______|<-,        |________________|                |
   |         '-------,       | (unix socket)           |
   |       (child     |      |                         |
  _|_______ processes |  ____v___________              |
<-| caddy |<------------| emacs --daemon |<-,          |
  |_______|             |________________|  |          |
   |   ^ (child process)>     |             |          |
   |   |             _________v________     | <(edits) |
   |   | <(serves)  | emacs --batch \ |     |          |
   |   |            | publish.el      |     |          |
   |   |            |_________________|     |          |
   |   | (publishes)> |         ^ <(loads)  |          |
   |  _|______________v____  ___|___________v__        |
   |__| published volume  |__| content volume  |_______|
      |___________________|  |_________________|

这个项目超出了mph本身的范围,至少有三段yak shaves,但如果真的发生,它很可能会使用mph作为依赖项。

依赖项

~4–14MB
~176K SLoC