1个版本 (0个不稳定版本)
使用旧的Rust 2015
| 2.0.0-alpha-20180628 | 2018年6月29日 |
|---|
#525 in 命令行界面
280KB
7.5K SLoC
RustyLine
基于 Antirez' Linenoise 的Rust实现的Readline
支持的平台
- Unix (已在FreeBSD、Linux和macOS上测试)
- Windows
- cmd.exe
- Powershell
注意:
- Powershell ISE不受支持,请查看 问题 #56
- Mintty (Cygwin/Mingw) 不受支持
示例
extern crate rustyline;
use rustyline::error::ReadlineError;
use rustyline::Editor;
fn main() {
// `()` can be used when no completer is required
let mut rl = Editor::<()>::new();
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_ref());
println!("Line: {}", line);
},
Err(ReadlineError::Interrupted) => {
println!("CTRL-C");
break
},
Err(ReadlineError::Eof) => {
println!("CTRL-D");
break
},
Err(err) => {
println!("Error: {:?}", err);
break
}
}
}
rl.save_history("history.txt").unwrap();
}
crates.io
您可以通过在您的 Cargo.toml 中添加以下内容来将此包用于您的项目
[dependencies]
rustyline = "1.0.0"
特性
- Unicode (UTF-8) (linenoise仅支持ASCII)
- 单词完成(linenoise仅支持行完成)
- 文件名完成
- 历史搜索(在历史中搜索命令)
- 杀环(删除命令)
- 多行模式(换行)
- 单词命令
- 提示
操作
对所有模式
| 按键 | 操作 |
|---|---|
| Home | 将光标移到行的开头 |
| End | 将光标移到行的末尾 |
| Left | 将光标向左移动一个字符 |
| Right | 将光标向右移动一个字符 |
| Ctrl-C | 中断/取消编辑 |
| Ctrl-D, Del | (如果行不为空) 删除光标下的字符 |
| Ctrl-D | (如果行为空) 文件结束 |
| 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, Left | 将光标向左移动一个字符 |
| 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
类似项目
| 库 | 语言 | 操作系统 | 终端 | Unicode | 历史记录 | 完成 | 按键映射 | 剪切环 | 撤销 | 颜色 | 提示/自动建议 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Haskeline | Haskell | 用户界面/Win | 任意 | 是 | 是 | 任何 | Emacs/Vi/conf | 是 | 是 | ? | ? |
| Linenoise | C | 用户界面 | ANSI | 否 | 是 | 仅行 | Emacs | 否 | 否 | 用户界面 | 是 |
| Linenoise-ng | C | 用户界面/Win | ANSI | 是 | 是 | 仅行 | Emacs | 是 | 否 | ? | ? |
| 换行符 | Rust | 用户界面/Win | 任意 | 是 | 任何 | Emacs/conf | 是 | 否 | ? | 否 | |
| 行器 | Rust | 用户界面 | ANSI | 无包含搜索 | 仅单词 | Emacs/Vi/prog | 否 | 是 | 用户界面 | 基于历史 | |
| Prompt-toolkit | Python | 用户界面/Win | ANSI | 是 | 是 | 任何 | Emacs/Vi/conf | 是 | 是 | 用户界面/Win | 是 |
| Rb-readline | Ruby | 用户界面/Win | ANSI | 是 | 是 | 仅单词 | Emacs/Vi/conf | 是 | 是 | ? | 否 |
| Replxx | C/C++ | 用户界面/Win | ANSI | 是 | 是 | 仅行 | Emacs | 是 | 否 | 用户界面/Win | 是 |
| Rustyline | Rust | 用户界面/Win | ANSI | 是 | 是 | 任何 | Emacs/Vi/bind | 是 | 是 | 用户界面/Win 10+ | 是 |
依赖
~2.5MB
~45K SLoC