36个稳定版本 (14个主要版本)
14.0.0 | 2024年3月6日 |
---|---|
13.0.0 | 2023年12月5日 |
12.0.0 | 2023年6月24日 |
11.0.0 | 2023年2月19日 |
0.1.0 | 2015年9月5日 |
#7 in 命令行界面
每月下载量351,771
用于 584 个crate(477个直接使用)
495KB
12K SLoC
RustyLine
基于Antirez的Linenoise的Rust语言readline实现
支持的平台
- Unix(在FreeBSD、Linux和macOS上进行了测试)
- Windows
- cmd.exe
- Powershell
注意:
- Powershell ISE不受支持,请参阅问题#56
- Mintty(Cygwin/MinGW)不受支持
- 在Windows < Windows 10上不支持高亮/颜色,除非使用ConEmu和
ColorMode::Forced
。
示例
use rustyline::error::ReadlineError;
use rustyline::{DefaultEditor, Result};
fn main() -> Result<()> {
// `()` can be used when no completer is required
let mut rl = DefaultEditor::new()?;
#[cfg(feature = "with-file-history")]
if rl.load_history("history.txt").is_err() {
println!("No previous history.");
}
loop {
let readline = rl.readline(">> ");
match readline {
Ok(line) => {
rl.add_history_entry(line.as_str());
println!("Line: {}", line);
},
Err(ReadlineError::Interrupted) => {
println!("CTRL-C");
break
},
Err(ReadlineError::Eof) => {
println!("CTRL-D");
break
},
Err(err) => {
println!("Error: {:?}", err);
break
}
}
}
#[cfg(feature = "with-file-history")]
rl.save_history("history.txt");
Ok(())
}
crates.io
您可以通过将以下内容添加到您的Cargo.toml
来在项目中使用此包
[dependencies]
rustyline = "14.0.0"
功能
- Unicode(UTF-8)(linenoise仅支持ASCII)
- 单词完成(linenoise仅支持行完成)
- 文件名完成
- 历史搜索(《在历史中搜索命令》)
- 杀环(《删除命令》)
- 多行支持(换行)
- 单词命令
- 提示
动作
对所有模式
按键 | 动作 |
---|---|
Home | 将光标移动到行的开头 |
End | 将光标移动到行的末尾 |
Left | 将光标向左移动一个字符 |
Right | 将光标向右移动一个字符 |
Ctrl-C | 中断/取消编辑 |
Ctrl-D, Del | (if line is not empty) Delete character under cursor |
Ctrl-D | (if line is empty) End of File |
Ctrl-J, Ctrl-M, Enter | 完成行输入 |
Ctrl-R | 反向搜索历史(Ctrl-S向前,Ctrl-G取消) |
Ctrl-T | 交换前一个字符和当前字符 |
Ctrl-U | 从行首删除到光标处 |
Ctrl-V | 插入任何特殊字符而不执行其相关动作(#65) |
Ctrl-W | 删除光标前的单词(使用空白作为单词边界) |
Ctrl-Y | 从剪切板粘贴 |
Ctrl-Z | 挂起(仅限Unix) |
Ctrl-_ | 撤销 |
Emacs模式(默认模式)
按键 | 动作 |
---|---|
Ctrl-A, Home | 将光标移动到行的开头 |
Ctrl-B, 左 | 将光标向左移动一个字符 |
Ctrl-E, End | 将光标移动到行的末尾 |
Ctrl-F, 右 | 将光标向右移动一个字符 |
Ctrl-H, Backspace | 删除光标前的字符 |
Ctrl-I, Tab | 下一个完成项 |
Ctrl-K | 从光标删除到行尾 |
Ctrl-L | 清除屏幕 |
Ctrl-N, 下 | 从历史记录中下一个匹配项 |
Ctrl-P, 上 | 从历史记录中上一个匹配项 |
Ctrl-X Ctrl-U | 撤销 |
Ctrl-Y | 从剪切板粘贴(使用Meta-Y粘贴下一个剪切内容) |
Meta-< | 移动到历史记录中的第一个条目 |
Meta-> | 移动到历史记录中的最后一个条目 |
Meta-B, Alt-Left | 移动光标到上一个单词 |
Meta-C | 将当前单词大写 |
Meta-D | 删除一个单词 |
Meta-F, Alt-Right | 移动光标到下一个单词 |
Meta-L | 将下一个单词转换为小写 |
Meta-T | 交换单词 |
Meta-U | 将下一个单词转换为大写 |
Meta-Y | 参见Ctrl-Y |
Meta-Backspace | 从当前单词的开始删除,如果位于单词之间,则到前一个单词的开始 |
Meta-0, 1, ..., - | 指定参数的数字。 – 开始一个负参数。 |
vi命令模式
按键 | 动作 |
---|---|
$, End | 将光标移动到行的末尾 |
. | 重做最后的文本修改 |
; | 重做最后的字符查找命令 |
, | 重做最后的字符查找命令(相反方向) |
0, Home | 将光标移动到行的开头 |
^ | 移动到行的第一个非空白字符 |
a | 在光标后插入 |
A | 在行尾插入 |
b | 向左移动一个单词或标记 |
B | 向左移动一个非空白单词 |
c | 更改移动命令的文本 |
C | 更改文本到行尾(等同于c$) |
d | 删除移动命令的文本 |
D, Ctrl-K | 删除到行尾 |
e | 移动到当前单词的末尾 |
E | 移动到当前非空白单词的末尾 |
f | 移动到下一个char 的下一个出现处 |
F | 移动到上一个char 的出现处 |
h, Ctrl-H, Backspace | 向左移动一个字符 |
l, Space | 向右移动一个字符 |
Ctrl-L | 清除屏幕 |
i | 在光标前插入 |
I | 在行首插入 |
+, j, Ctrl-N | 向前移动一个历史命令 |
-, k, Ctrl-P | 向后移动一个历史命令 |
p | 在光标处插入剪切文本(粘贴) |
P | 在光标前插入剪切文本 |
r | 替换光标下的单个字符(不离开命令模式) |
s | 删除光标下的单个字符并进入输入模式 |
S | 更改当前行(等同于0c$) |
t | 向右移动到下一个char 的出现处,然后后退一个字符 |
T | 向左移动到上一个char 的出现处,然后前进一个字符 |
u | 撤销 |
w | 将一个单词或标记向右移动 |
W | 将一个非空格单词向右移动 |
x | 删除光标下的单个字符 |
X | 删除光标前的字符 |
y | 将移动操作放入缓冲区(复制) |
vi 插入模式
按键 | 动作 |
---|---|
Ctrl-H, Backspace | 删除光标前的字符 |
Ctrl-I, Tab | 下一个完成项 |
Esc | 切换到命令模式 |
Wine
$ cargo run --example example --target 'x86_64-pc-windows-gnu'
...
Error: Io(Error { repr: Os { code: 6, message: "Invalid handle." } })
$ wineconsole --backend=curses target/x86_64-pc-windows-gnu/debug/examples/example.exe
...
终端检查
$ # current settings of all terminal attributes:
$ stty -a
$ # key bindings:
$ bind -p
$ # print out a terminfo description:
$ infocmp
类似的项目
库 | 语言 | 操作系统 | 终端 | Unicode | 历史记录 | 完成 | 快捷键映射 | 删除环 | 撤销 | 颜色 | 提示/自动建议 |
---|---|---|---|---|---|---|---|---|---|---|---|
go-prompt | Go | 用户界面/Windows | ANSI | 是 | 是 | 任何 | Emacs/程序 | 否 | 否 | 是 | 是 |
Haskeline | Haskell | 用户界面/Windows | 任何 | 是 | 是 | 任何 | Emacs/vi/配置 | 是 | 是 | ? | ? |
isocline | C | 用户界面/Windows | ANSI | 是 | 是 | 任何 | Emacs | 否 | 是 | 是 | 是 |
换行符 | Rust | 用户界面/Windows | 任何 | 是 | 任何 | Emacs/配置 | 是 | 否 | ? | 否 | |
linenoise | C | 用户界面 | ANSI | 否 | 是 | 仅一行 | Emacs | 否 | 否 | 用户界面 | 是 |
Liner | Rust | 用户界面 | ANSI | 不进行增量搜索 | 仅单词 | Emacs/vi/程序 | 否 | 是 | 用户界面 | 基于历史记录 | |
prompt_toolkit | Python | 用户界面/Windows | ANSI | 是 | 是 | 任何 | Emacs/vi/配置 | 是 | 是 | 用户界面/Windows | 是 |
reedline | Rust | 用户界面/Windows | ANSI | 是 | 是 | 任何 | Emacs/vi/绑定 | 否 | 是 | 用户界面/Windows | 是 |
replxx | C/C++ | 用户界面/Windows | ANSI | 是 | 是 | 仅一行 | Emacs | 是 | 否 | 用户界面/Windows | 是 |
Rustyline | Rust | 用户界面/Windows | ANSI | 是 | 是 | 任何 | Emacs/vi/绑定 | 是 | 是 | 用户界面/Windows 10+ | 是 |
termwiz | Rust | 用户界面/Windows | 任何 | ? | 是 | 任何 | Emacs | 否 | 否 | 用户界面/Windows | 否 |
多行支持
这是一个非常简单的功能,它将超过当前终端宽度的行显示在下一视觉行上,而不是在输入更多字符时水平滚动。目前,此功能始终启用,没有配置选项可以禁用它。
此功能不允许最终用户按特殊键序列进入一个模式,在该模式下按回车键将在输入缓冲区中添加一个实际的换行符。
实现多行编辑的方法是实现 Validator
特性。
依赖项
~2–18MB
~233K SLoC