#widgets #terminal #iced #alacritty #back-end #scroll #resize

iced_term

由 ICED 框架和 alacritty 终端后端驱动的终端仿真器小部件

4 个版本 (破坏性)

0.4.0 2024年2月22日
0.3.0 2024年2月15日
0.2.1 2024年1月14日
0.2.0 2024年1月14日
0.1.0 2024年1月9日

#201GUI

Download history

115 每月下载次数

MIT 许可证

675KB
2.5K SLoC

iced_term

GitHub License Crates.io Downloads (recent)

由 ICED 框架和 alacritty 终端后端驱动的终端仿真器小部件。

功能

该小部件目前处于开发中,不提供完整的终端功能,请确保小部件覆盖了您想要的所有内容。

  • PTY 内容渲染
  • 多实例支持
  • 基本键盘输入
  • 添加自定义键盘或鼠标绑定
  • 调整大小
  • 滚动
  • 聚焦
  • 选择
  • 更改字体/颜色方案
  • 超链接处理(悬停/打开)

该小部件已在 MacOS 和 Linux 上测试,未在 Windows 上测试。

安装

iced_term = "0.4.0"

概述

与该小部件的交互是通过

命令 - 您可以向小部件发送命令以更改小部件状态。

#[derive(Debug, Clone)]
pub enum Command {
    InitBackend(Sender<alacritty_terminal::event::Event>),
    ChangeTheme(Box<ColorPalette>),
    ChangeFont(FontSettings),
    AddBindings(Vec<(Binding<InputKind>, BindingAction)>),
    ProcessBackendCommand(BackendCommand),
}

事件 - 小部件产生了一些事件,可以在应用程序中处理。每个事件都有一个第一个 u64 参数,是 终端实例 ID

#[derive(Debug, Clone)]
pub enum Event {
    CommandReceived(u64, Command),
}

目前只有一个内部 CommandReceived 事件,用于后端 <-> 视图通信。您还可以处理此事件,解包命令,并根据需要处理命令。

操作 - 小部件的 update(&mut self, cmd: Command) 方法返回 Action,您可以在小部件更新后处理。

#[derive(Debug, Clone, PartialEq)]
pub enum Action {
    Redraw,
    Shutdown,
    ChangeTitle,
    Ignore,
}

为了创建可工作的小部件实例,您需要进行几个步骤

将小部件添加到您的应用程序结构体中

struct App {
    term: iced_term::Term,
}

在应用程序构造函数中创建纯实例

impl Application for App {
    type Executor = executor::Default;
    type Message = Message;
    type Theme = Theme;
    type Flags = ();

    fn new(_flags: ()) -> (Self, Command<Message>) {
        let system_shell = std::env::var("SHELL")
            .expect("SHELL variable is not defined")
            .to_string();
        let term_id = 0;
        let term_settings = iced_term::TermSettings {
            font: iced_term::FontSettings {
                size: 14.0,
                ..iced_term::FontSettings::default()
            },
            theme: iced_term::ColorPalette::default(),
            backend: iced_term::BackendSettings {
                shell: system_shell.to_string(),
            },
        };

        (
            Self {
                term: iced_term::Term::new(term_id, term_settings.clone()),
            },
            Command::none(),
        )
    }
}

将包含小部件事件的信使添加到应用程序消息枚举中

#[derive(Debug, Clone)]
pub enum Message {
    // ... other messages
    IcedTermEvent(iced_term::Event),
}

IcedTermEvent 处理添加到应用程序的 update 方法中

impl Application for App {
    // ... other methods
    fn update(&mut self, message: Self::Message) -> Command<Message> {
        match message {
            Message::IcedTermEvent(iced_term::Event::CommandReceived(
                _,
                cmd,
            )) => match self.term.update(cmd) {
                iced_term::actions::Action::Shutdown => window::close(),
                _ => Command::none(),
            },
        }
    }
}

将视图添加到您的应用程序中

impl Application for App {
    // ... other methods
    fn view(&self) -> Element<Message, iced::Renderer> {
        container(iced_term::term_view(&self.term).map(Message::IcedTermEvent))
            .width(Length::Fill)
            .height(Length::Fill)
            .into()
    }
}

在您的应用程序中激活后端事件订阅

impl Application for App {
    // ... other methods
    fn subscription(&self) -> Subscription<Message> {
        self.term.subscription().map(Message::IcedTermEvent)
    }
}

编写 main 函数

fn main() -> iced::Result {
    App::run(Settings {
        window: window::Settings {
            size: (1280, 720),
            ..window::Settings::default()
        },
        ..Settings::default()
    })
}

运行您的应用程序

cargo run --release

示例

您还可以查看 示例 目录以获取有关小部件使用的更多信息。

  • 全屏 - 终端模拟器的基本示例。
  • 分割视图 - 基于分割视图iced小部件的示例,展示了如何实现多个实例功能。
  • 自定义绑定 - 示例展示了如何向您的终端模拟器应用添加自定义键盘或鼠标绑定。
  • 主题 - 示例展示了如何更改终端配色方案。
  • 字体 - 示例展示了如何在您的终端模拟器应用中更改字体类型或字体大小。

依赖项

依赖项

~36–75MB
~1.5M SLoC