#editor #applications #real-time #text

nightly bin+lib duat

一个高度可定制的文本编辑器,通过Rust包进行配置

4 个版本

0.1.3 2024年7月17日
0.1.2 2024年7月12日
0.1.1 2023年10月31日
0.1.0 2023年10月31日

#62 in 文本编辑器

Download history 102/week @ 2024-07-08 140/week @ 2024-07-15 5/week @ 2024-07-22 33/week @ 2024-07-29

每月 188 下载

AGPL-3.0-or-later

94KB
1.5K SLoC

Duat

Duat是古埃及神话中的阴间,是神俄西里斯的家园,死者在那里接受审判,并可能因为一根羽毛的重量而失去来世的权利。它也是一个文本编辑器。

Duat是一个通过Rust包进行配置的文本编辑器。使用包进行此类目的意味着可扩展性潜力——以及我添加功能的能力——将大大增加。

安装后,Duat将能够自动检测用户配置的变化,并在几秒钟的延迟后实时更改,以反映新的配置。

目前它仍在开发中,许多功能尚未实现(例如LSP插件...)。

如何使用

为了使用它,您必须安装cargo。如果您已安装,请运行

cargoinstall duat

这将安装Duat的默认版本,它使用终端用户界面。它还会在$XDG_CONFIG_HOME/duat/~/.config/duat/中创建一个配置目录。此配置将有一些默认更改,但您可以按需修改它。它还包括一些解释Duat基本功能的文档。

目前,唯一的UI是终端UI,但Duat被构建成这样的方式,以至于创建新的UI是可能的。

目前,它有一个基于Kakoune的基本配置,因此如果您熟悉该文本编辑器,许多命令都将相同。

配置

在配置文件中,应该有一个run!宏。此宏将用于配置Duat。(最终,我希望用进程宏替换它,因为它们似乎更适合由rust-analyzer处理)

以下是一个示例配置文件,它使用了duat-kak

use duat::prelude::*;
// Since duat_kak is a plugin, it must be used explicitely.
use duat_kak::{KeyMap, Mode, OnModeChange};
run! {
use duat::prelude::*;
// Since duat_kak is a plugin, it must be used explicitely.
use duat_kak::{KeyMap, Mode, OnModeChange};
run! {
    // The print module manages the printing of files.
    print::wrap_on_width();

    hooks::remove_group("FileWidgets");
    // This hook lets you push widgets to the files.
    hooks::add::<OnFileOpen>(|builder| {
        // By default, these go on the left.
        builder.push::<VertRule>();
        builder.push::<LineNumbers>();
    });
    hooks::remove_group("WindowWidgets");
    // Same, but on the edges of the window.
    hooks::add::<OnWindowOpen>(|builder| {
        // "[" "]" pairs change the style of text.
        let status_line = status!(
            [File] { File::name } " "
            { KeyMap::mode_fmt } " "
            selections_fmt " " main_fmt
        );
        // As opposed to `builder.push`, this one
        // takes a user defined configuration.
        let (child, _) = builder.push_cfg(status_line);
        let cmd_line = CommandLine::cfg().left_with_percent(30);
        // `push_cfg_to` pushes a widget to another.
        builder.push_cfg_to(cmd_line, child);
    });
    input::set(KeyMap::new());
    // This is a hook provided by duat-kak.
    hooks::add::<OnModeChange>(|(_, new)| match new {
        Mode::Insert => cursor::set_main(CursorShape::SteadyBar),
        _ => cursor::set_main(CursorShape::SteadyBlock),
    });
    // This is a form also provided by duat-kak.
    forms::set("Mode", Form::new().dark_magenta());
}

路线图

这些是已经完成或正在进行的目标

  • 实现基本视觉功能(打印、滚动等);
  • 实现换行;
  • 实现编辑功能;
  • 创建kak模式;
  • 实现多光标的使用;
  • 实现历史系统;
  • 实现颜色功能;
  • 实现小部件和指定区域;
  • 使所有这些功能在公共接口上易于使用;
  • 创建数字线和分隔线;
  • 创建状态行;
  • 文件切换;
  • 创建命令创建界面和命令行;
  • 添加框架区域的能力;
  • 实现隐藏功能;
  • 实现配置的热重载;
  • 创建“正常编辑”模式;
  • 添加创建钩子的能力;
  • 创建一个更通用的插件系统;
  • 添加不与会话布局绑定的浮动小部件;
  • 实现自动完成列表;
  • 创建一个LSP插件;
  • 创建vim模式;
  • 添加正则表达式搜索器(可能是新的regex-streams?!?!);

...

  • 创建EGUI前端;

注意:这些内容并非固定,可能会以不同的顺序完成。

动机

这个项目主要是作为一个有趣的小项目来打发我的时间,同时我对当前的开源文本编辑器的功能也不满意。

为什么叫这个名字

不知道,这是一个听起来很酷的词,我从Spelunky 2中得到的。

依赖项

~3–13MB
~157K SLoC