10 个版本

0.1.9 2023年10月16日
0.1.8 2022年1月3日
0.1.7 2021年10月18日
0.1.3 2021年9月27日
0.1.0 2019年9月9日

#156 in 编程语言

Apache-2.0GPL-3.0-only

1MB
5K SLoC

dune

沙滩上的壳!

注意:点击上面的图片查看视频演示。

关于作者

我是一名大学生,正在忙于项目以打发时间。如果你喜欢我的工作,请考虑通过购买咖啡来支持我!

Buy Me A Coffee

为什么再写一个壳?

我认为 bash 在很多方面都很棒,但它并不完全让人感觉舒适:它缺少一种个人化的触摸,而且它也缺少快速简单的可定制性。在我的上一个壳中,Atom,我实现了一些 bash 缺失的舒适感,但我也引入了很多语法和类型系统中的严重错误。

然而,Dune 的设计完全不同于 Atom(尽管你可能会注意到它们的部件系统有相似之处)。解释器本身是独立的,并且几乎不包含你看到的 Dune 默认发行版中的功能。如果你愿意,你可以编写一个自定义前端,制作你自己的独特的 Dune 壳!

这个前端实现将舒适度调到11。只需查看壳的默认启动脚本!

我投入了大量精力使 Dune 变得易于使用。它就像一个小巧的操作系统本身!

Dune 还试图成为一个可用的脚本语言,并提供一些诸如引用(借鉴自 Lisp)、操作符重载和宏等利基元编程特性!

总的来说,我写 Dune 是为了拥有一个完全属于自己的壳:一个快速、有用且漂亮的壳。

(写壳也很有趣)

用法

Dune 有许多可自定义的组件。以下是如何更改它们并使你的壳属于你自己的方法!

序言

在进入交互模式之前,Dune 执行 序言。序言只是存储在你用户主目录中的启动文件 .dune-prelude。如果你不提供自己的序言文件,Dune 将执行其自己的默认序言,并介绍壳。

你可以在这里查看我的示例个人序言。

REPL

Dune 的 REPL 可以通过重载以下函数进行完全自定义

名称 用途 默认实现
提示 此函数用于生成提示用户输入的文本。它接收当前工作目录,并返回一个字符串。
let prompt = cwd -> fmt@bold ((fmt@dark@blue "(dune) ") +
(fmt@bold (fmt@dark@green cwd)) +
(fmt@bold (fmt@dark@blue "$ ")))
不完整提示 当用户输入不完整表达式时,此函数用于生成提示用户输入的文本。它接收当前工作目录,并返回一个字符串。
let incomplete_prompt = cwd -> ((len cwd) +
(len "(dune) ")) * " " +
(fmt@bold (fmt@dark@yellow "> "));
报告 在评估后,此函数用于将值打印到控制台。 默认实现是一个内置函数(用Rust实现),但您仍然可以用任何可调用值重载它。

强烈建议在实现自己的自定义提示时使用 fmt 模块!

别名

Dune使用 Symbol 类型(变量名和路径的类型)来实现调用程序。在交互模式下,每当类型为 Symbol 的表达式作为命令评估时,它会被调用为一个程序。

因此,您可以通过将变量赋给程序名称来定义别名!

如果您已定义了一个变量,它遮蔽了程序名称(如别名),您可以 引用 程序名称来运行它。

Overshadowed

要编写修改您的shell环境并像命令或程序本身一样行动的函数,请使用宏!

Macros

当没有参数传递给宏时,它们会传递当前工作目录。当调用时,它们假定调用者的环境:如果您执行一个宏,它将像您使用参数作为传递的参数执行宏的内容一样执行。

管道和重定向

管道和重定向使用 |>> 操作符。以下是一些示例用法!

Piping and Redirection

如果将值管道传输到一个可调用对象,如函数或宏,它将作为应用程序执行;否则,表达式将像对程序的常规调用一样处理。

标准库

Dune提供了一个广泛的标准库,并且还提供了一个漂亮的界面来查看每个模块中可用的所有函数!

Dune提供了以下内置库

名称 描述
rand 一个随机数库
time 包含日期和时间函数的库
math 用于数学和三角功能的模块
fs 用于与文件系统交互的模块
fn 一个函数式编程库
fmt 用于控制台文本格式化的库(颜色、样式、超链接、文本换行等)
os 包含宿主操作系统信息的模块
widget 用于创建文本小部件的模块
shell 包含有关Dune shell信息的模块
console 用于操作控制台的库

有关每个库的更多信息,只需运行 echo library-name

安装

要安装,您必须从这里下载Rust。如果您已经安装了Rust,您可能需要更新。Dune使用了大量最近稳定的特性。

开发版本

# Install directly from git with cargo
cargo install --git https://github.com/adam-mcdaniel/dune

# Or, alternatively, the repo and install from source
git clone https://github.com/adam-mcdaniel/dune
cd dune
cargo install -f --path .

发布版本

要获取当前发布版本,请从crates.io安装。

# Also works for updating dune
cargo install -f dune

目前,由于Dune处于开发初期,我建议不要使用发布版本。在发布之间添加了许多错误修复和新功能。

安装后

# Just run the dune executable!
dunesh

依赖项

~10–21MB
~274K SLoC