使用旧的Rust 2015
1.0.0 |
|
---|
#17 in #readline
190KB
4.5K SLoC
RustyLine
基于Antirez' Linenoise的Rust实现
支持的平台
- Linux
- Windows
- cmd.exe
- Powershell
注意:Powershell ISE不受支持,请查看问题 #56
此分支
此分支仅用于为rustyline crate的重新打包提供一个存储库。
构建
此项目使用Cargo和Rust稳定版
cargo build --release
示例
extern crate wee_rl as rustyline;
use rustyline::error::ReadlineError;
use rustyline::Editor;
fn main() {
// `()` can be used when no completer is required
let mut rl = Editor::<()>::new();
if let Err(_) = rl.load_history("history.txt") {
println!("No previous history.");
}
loop {
let readline = rl.readline(">> ");
match readline {
Ok(line) => {
rl.add_history_entry(&line);
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]
wee-rl = "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) |
Emacs模式(默认模式)
键盘按键 | 动作 |
---|---|
Ctrl-A, Home | 将光标移至行首 |
Ctrl-B, Left | 将光标向左移动一个字符 |
Ctrl-E, End | 将光标移至行尾 |
Ctrl-F, Right | 将光标向右移动一个字符 |
Ctrl-H, BackSpace | 删除光标前的字符 |
Ctrl-I, Tab | 下一个完成 |
Ctrl-K | 从光标删除到行尾 |
Ctrl-L | 清除屏幕 |
Ctrl-N, Down | 从历史记录中获取下一个匹配项 |
Ctrl-P, Up | 从历史记录中获取上一个匹配项 |
Ctrl-Y | 从剪切板粘贴(使用Meta-Y粘贴下一个剪切项) |
Meta-< | 移动到历史记录中的第一个条目 |
Meta-> | 移动到最后一个历史记录条目 |
Meta-B, Alt-左箭头 | 将光标移动到上一个单词 |
Meta-C | 将当前单词转换为大写 |
Meta-D | 删除一个单词 |
Meta-F, Alt-右箭头 | 将光标移动到下一个单词 |
Meta-L | 将下一个单词转换为小写 |
Meta-T | 交换单词 |
Meta-U | 将下一个单词转换为大写 |
Meta-Y | 参见Ctrl-Y |
Meta-退格键 | 从当前单词的开始处删除,或者,如果在单词之间,则删除到上一个单词的开始处 |
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 出现的位置,然后前进一个字符 |
w | 向右移动一个单词或标记 |
W | 向右移动一个非空单词 |
x | 删除光标下的单个字符 |
X | 删除光标前的字符 |
y | 将移动操作复制到缓冲区(复制) |
Vi 插入模式
键盘按键 | 动作 |
---|---|
Ctrl-H, BackSpace | 删除光标前的字符 |
Ctrl-I, Tab | 下一个完成 |
Esc | 切换到命令模式 |
待办事项
- 撤销操作
- 使用超时读取输入以正确处理单个 ESC 键
- 公开一个从 C 可调用的 API
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
类似的项目
- copperline (Rust)
- linefeed (Rust)
- liner (Rust)
- linenoise-ng (C++)
- liner (Go)
- readline (Go)
- haskeline (Haskell)
依赖项
~3MB
~51K SLoC