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 编程语言
1MB
5K SLoC
dune
沙滩上的壳!
注意:点击上面的图片查看视频演示。
关于作者
我是一名大学生,正在忙于项目以打发时间。如果你喜欢我的工作,请考虑通过购买咖啡来支持我!
为什么再写一个壳?
我认为 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) ") + |
不完整提示 |
当用户输入不完整表达式时,此函数用于生成提示用户输入的文本。它接收当前工作目录,并返回一个字符串。 | let incomplete_prompt = cwd -> ((len cwd) + |
报告 |
在评估后,此函数用于将值打印到控制台。 | 默认实现是一个内置函数(用Rust实现),但您仍然可以用任何可调用值重载它。 |
强烈建议在实现自己的自定义提示时使用 fmt
模块!
别名
Dune使用 Symbol
类型(变量名和路径的类型)来实现调用程序。在交互模式下,每当类型为 Symbol
的表达式作为命令评估时,它会被调用为一个程序。
因此,您可以通过将变量赋给程序名称来定义别名!
如果您已定义了一个变量,它遮蔽了程序名称(如别名),您可以 引用 程序名称来运行它。
宏
要编写修改您的shell环境并像命令或程序本身一样行动的函数,请使用宏!
当没有参数传递给宏时,它们会传递当前工作目录。当调用时,它们假定调用者的环境:如果您执行一个宏,它将像您使用参数作为传递的参数执行宏的内容一样执行。
管道和重定向
管道和重定向使用 |
和 >>
操作符。以下是一些示例用法!
如果将值管道传输到一个可调用对象,如函数或宏,它将作为应用程序执行;否则,表达式将像对程序的常规调用一样处理。
标准库
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