#命令行 #读取行 #历史记录 #单词 #完成 #Unix #Powershell

rustyline

Rustyline,基于Antirez的Linenoise的readline实现

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 命令行界面

Download history 91866/week @ 2024-04-22 81704/week @ 2024-04-29 84163/week @ 2024-05-06 96637/week @ 2024-05-13 86934/week @ 2024-05-20 80656/week @ 2024-05-27 84975/week @ 2024-06-03 85459/week @ 2024-06-10 87720/week @ 2024-06-17 82906/week @ 2024-06-24 76473/week @ 2024-07-01 87833/week @ 2024-07-08 86395/week @ 2024-07-15 88959/week @ 2024-07-22 85851/week @ 2024-07-29 84887/week @ 2024-08-05

每月下载量351,771
用于 584 个crate(477个直接使用)

MIT 许可证

495KB
12K SLoC

RustyLine

Build Status dependency status Docs

基于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, ..., - 指定参数的数字。 开始一个负参数。

Readline Emacs编辑模式速查表

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 切换到命令模式

vi 编辑模式快速参考表

终端代码(ANSI/VT100)

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