8个稳定版本
1.2.0 | 2023年9月17日 |
---|---|
1.1.3 | 2023年6月25日 |
1.0.2 | 2023年6月25日 |
1.0.1 | 2023年6月24日 |
在 解析器实现 中排名第2200
每月下载量99次
用于 nu-plugin-bexpand
35KB
795 代码行
bexpand
Rust中的Bash风格括号展开。
功能
- 普通字符串就是普通字符串:
abcd
- 特殊字符需要用前面的
\
转义才能被视为普通字符:ab\{cd
- 在列表外部,特殊字符是
{}\
。 - 在列表内部,特殊字符是
,{}\
。 - 在序列内部,特殊字符是
,.{}\
。
- 在列表外部,特殊字符是
- 任何前面带有
\
的字符都将被当作字面量处理,即使它是多余的。- 例如,
\n
代表n
,而不是换行符。
- 例如,
- 列表是括号包围的逗号分隔的表达式列表:
{a,b,c}
,{a,,c}
,{}
,{,}
- 空列表仍然是列表。
- 列表可以有空的或重复的字段。
- 列表产生其包含表达式的所有值。
- 序列可以是数值序列或字符序列。
- 数值序列的形式为
{<spec><start>..<end>[..<stride>]}
<spec>
是一组可能的空格式说明符字符。=
表示将每个项扩展到与<start>
和<end>
最长字符宽度相同的宽度。
<start>
和<end>
是有符号的 64 位整数。如果<end>
小于<start>
,则序列将向下计数。<stride>
是一个可选的非负增量数,用于按大于 1 的增量计数。- 默认的
<stride>
是1
。 - 一个零
<stride>
总是规范化为1
以防止无限循环。 - 步长可能导致跳过端点,甚至在不出现错误的情况下达到数字大小限制。
'{9223372036854775806..9223372036854775807..1000}'
只产生9223372036854775806
,而不是错误。
- 默认的
- 字符序列的形式为
{<start>..<end>[..<stride>]}
<start>
和<end>
是用于生成顺序的 Unicode 字符。如果<end>
小于<start>
,则序列将循环向下。如果这个范围最终会生成一个代理代码点,则每个都会给出错误。- 错误不会终止迭代。如果返回错误,随后移出代理范围的迭代仍可能产生有效值。
- 这可能在某个时刻用来允许可选的替换字符,但我认为当前直接抛出错误更有价值。
- 错误不会终止迭代。如果返回错误,随后移出代理范围的迭代仍可能产生有效值。
<stride>
是一个可选的非负增量数,用于按大于 1 的增量计数。- 默认的
<stride>
是1
。 - 一个零
<stride>
总是规范化为1
以防止无限循环。 - 步长可能导致跳过端点,甚至在不出现错误的情况下达到数字大小限制。
'{a..z..1114111}'
只会产生a
,而不是错误
- 默认的
- 表达式包含一系列普通字符串、列表和序列。
- 表达式产生所有项的笛卡尔积:
{a,b}c{d,e}f{g..i}
产生["acdfg","acdfh","acdfi","acefg","acefh","acefi","bcdfg","bcdfh","bcdfi","bcefg","bcefh","bcefi"]
- 表达式的顺序按字典顺序产生,以每个子表达式的索引为键。
- 表达式产生所有项的笛卡尔积:
- 表达式和列表可以任意嵌套。
'{a,{b,,c{\,..\.}}{f..d..2}}'
产生["a","bf","bd","f","d","c,f","c,d","c-f","c-d","c.f","c.d"]
与 Bash 的差异
以下方式不符合 Bash 的风格
- 存在一些被认为是不规范的模式,在 bexpand 中会抛出错误。如果发现错误模式,它不会尝试继续进行。
- 花括号是特殊字符,如果没有正确形成或转义,则不允许使用。在 Bash 中
a{b,c}d}e
展开为abd}e acd}e
,而a{b{c,d}e
展开为a{bce a{bde
。在 bexpand 中,这两个都是错误。 - bexpand 将空列表和单元素列表视为可接受的。在 Bash 中,
a{}b
和a{b}c
都会被 shell 简单地重复。在 bexpand 中,这些展开为ab
和abc
。 - bexpand 允许字符序列迭代任何有效的 Unicode 代码点。
{🥰..🥴..2}
是一个有效的字符序列,同样{\{..\.}
和{9..A}
也是有效的。技术上,{0..9}
也是有效的,并且将被视为字符序列,尽管它展开成与相同形式的数字序列完全一样的东西。任何会生成非法 Unicode 代码点的东西都会生成错误。 - 宽度指定符用开括号前的等号来表示,因此,在Bash中,
{001..100}
在bexpand中用{=1..100}
来表示。这样可以允许像{=-5..10}
这样的表达,这在Bash中是不可能的。
许可证
版权所有 2023 Taylor Richberger
根据Mozilla公共许可证第2.0版发布。
依赖项
~1.5MB
~29K SLoC