mirror of
https://github.com/TECHNOFAB11/tmux-copyrat.git
synced 2025-12-12 08:00:08 +01:00
chore: update to clap v4 & termion v2
This commit is contained in:
parent
1f79419934
commit
10013a6c6d
9 changed files with 282 additions and 196 deletions
20
Cargo.toml
20
Cargo.toml
|
|
@ -1,20 +1,26 @@
|
||||||
[package]
|
[package]
|
||||||
name = "copyrat"
|
name = "copyrat"
|
||||||
version = "0.4.1"
|
version = "0.4.1"
|
||||||
authors = ["graelo <graelo@graelo.cc>"]
|
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
description = "A tmux plugin for copy-pasting within tmux panes."
|
description = "A tmux plugin for copy-pasting within tmux panes."
|
||||||
repository = "https://github.com/graelo/tmux-copyrat"
|
readme = "README.md"
|
||||||
keywords = ["rust", "tmux", "tmux-plugin", "tmux-copycat"]
|
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
authors = ["graelo <graelo@graelo.cc>"]
|
||||||
|
repository = "https://github.com/graelo/tmux-copyrat"
|
||||||
|
homepage = "https://github.com/graelo/tmux-copyrat"
|
||||||
|
documentation = "https://docs.rs/tmux-copyrat"
|
||||||
|
|
||||||
|
keywords = ["rust", "tmux", "tmux-plugin", "tmux-copycat"]
|
||||||
|
categories = ["command-line-utilities"]
|
||||||
|
exclude = ["/.github"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
thiserror = "1"
|
thiserror = "1"
|
||||||
|
|
||||||
termion = "1.5"
|
termion = "2"
|
||||||
regex = "1.5"
|
regex = "1.6"
|
||||||
clap = { version = "3.1", features = ["derive", "wrap_help"]}
|
clap = { version = "4.0", features = ["derive", "wrap_help"]}
|
||||||
sequence_trie = "0.3.6"
|
sequence_trie = "0.3.6"
|
||||||
duct = "0.13"
|
duct = "0.13"
|
||||||
|
|
||||||
|
|
|
||||||
2
LICENSE
2
LICENSE
|
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2019 Ferran Basora
|
Copyright (c) 2022 graelo@grael.cc
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
use clap::{ArgEnum, Parser};
|
use std::fmt::Display;
|
||||||
|
|
||||||
|
use clap::{ArgAction, Parser, ValueEnum};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
textbuf::{alphabet, regexes},
|
textbuf::{alphabet, regexes},
|
||||||
|
|
@ -18,58 +20,70 @@ pub struct Config {
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// "qwerty", "dvorak-homerow", "azerty-right-hand".
|
/// "qwerty", "dvorak-homerow", "azerty-right-hand".
|
||||||
#[clap(short = 'k', long, default_value = "dvorak",
|
#[arg(
|
||||||
parse(try_from_str = alphabet::parse_alphabet))]
|
short = 'k',
|
||||||
|
long,
|
||||||
|
default_value = "dvorak",
|
||||||
|
value_parser(alphabet::parse_alphabet)
|
||||||
|
)]
|
||||||
pub alphabet: alphabet::Alphabet,
|
pub alphabet: alphabet::Alphabet,
|
||||||
|
|
||||||
/// Use all available regex patterns.
|
/// Use all available regex patterns.
|
||||||
#[clap(short = 'A', long = "--all-patterns")]
|
#[arg(short = 'A', long = "all-patterns")]
|
||||||
pub use_all_patterns: bool,
|
pub use_all_patterns: bool,
|
||||||
|
|
||||||
/// Pattern names to use ("email", ... see doc).
|
/// Pattern names to use ("email", ... see doc).
|
||||||
#[clap(short = 'x', long = "--pattern-name", parse(try_from_str = regexes::parse_pattern_name))]
|
#[arg(
|
||||||
|
short = 'x',
|
||||||
|
long = "pattern-name",
|
||||||
|
value_parser(regexes::parse_pattern_name)
|
||||||
|
)]
|
||||||
pub named_patterns: Vec<regexes::NamedPattern>,
|
pub named_patterns: Vec<regexes::NamedPattern>,
|
||||||
|
|
||||||
/// Additional regex patterns ("(foo.*)bar", etc). Must have a capture
|
/// Additional regex patterns ("(foo.*)bar", etc). Must have a capture
|
||||||
/// group.
|
/// group.
|
||||||
#[clap(short = 'X', long = "--custom-pattern")]
|
#[arg(short = 'X', long)]
|
||||||
pub custom_patterns: Vec<String>,
|
pub custom_patterns: Vec<String>,
|
||||||
|
|
||||||
/// Assign hints starting from the bottom of the screen.
|
/// Assign hints starting from the bottom of the screen.
|
||||||
#[clap(short, long)]
|
#[arg(short, long, action = ArgAction::SetTrue)]
|
||||||
pub reverse: bool,
|
pub reverse: bool,
|
||||||
|
|
||||||
/// Keep the same hint for identical spans.
|
/// Keep the same hint for identical spans.
|
||||||
#[clap(short, long)]
|
#[arg(short, long, action = ArgAction::SetTrue)]
|
||||||
pub unique_hint: bool,
|
pub unique_hint: bool,
|
||||||
|
|
||||||
/// Move focus back to first/last span.
|
/// Move focus back to first/last span.
|
||||||
#[clap(short = 'w', long)]
|
#[arg(short = 'w', long, action = ArgAction::SetTrue)]
|
||||||
pub focus_wrap_around: bool,
|
pub focus_wrap_around: bool,
|
||||||
|
|
||||||
#[clap(flatten)]
|
#[command(flatten)]
|
||||||
pub colors: ui::colors::UiColors,
|
pub colors: ui::colors::UiColors,
|
||||||
|
|
||||||
/// Align hint with its span.
|
/// Align hint with its span.
|
||||||
#[clap(long, arg_enum, default_value = "leading")]
|
#[arg(long, value_enum, default_value_t = ui::HintAlignment::Leading)]
|
||||||
pub hint_alignment: ui::HintAlignment,
|
pub hint_alignment: ui::HintAlignment,
|
||||||
|
|
||||||
/// Optional hint styling.
|
/// Optional hint styling.
|
||||||
///
|
///
|
||||||
/// Underline or surround the hint for increased visibility.
|
/// Underline or surround the hint for increased visibility.
|
||||||
/// If not provided, only the hint colors will be used.
|
/// If not provided, only the hint colors will be used.
|
||||||
#[clap(short = 's', long = "hint-style", arg_enum, rename_all = "lowercase")]
|
#[arg(short = 's', long = "hint-style", rename_all = "lowercase", value_enum)]
|
||||||
pub hint_style_arg: Option<HintStyleArg>,
|
pub hint_style_arg: Option<HintStyleArg>,
|
||||||
|
|
||||||
/// Chars surrounding each hint, used with `Surround` style.
|
/// Chars surrounding each hint, used with `Surround` style.
|
||||||
#[clap(long, default_value = "{}",
|
#[clap(
|
||||||
parse(try_from_str = try_parse_chars))]
|
long,
|
||||||
pub hint_surroundings: (char, char),
|
// default_value_t = HintSurroundingsArg{open: '{', close: '}'},
|
||||||
|
default_value = "{}",
|
||||||
|
value_parser(try_parse_chars)
|
||||||
|
)]
|
||||||
|
pub hint_surroundings: HintSurroundingsArg,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Type introduced due to parsing limitation,
|
/// Type introduced due to parsing limitation,
|
||||||
/// as we cannot directly parse tuples into ui::HintStyle.
|
/// as we cannot directly parse tuples into ui::HintStyle.
|
||||||
#[derive(Debug, Clone, ArgEnum)]
|
#[derive(Debug, Clone, ValueEnum)]
|
||||||
pub enum HintStyleArg {
|
pub enum HintStyleArg {
|
||||||
Bold,
|
Bold,
|
||||||
Italic,
|
Italic,
|
||||||
|
|
@ -77,14 +91,29 @@ pub enum HintStyleArg {
|
||||||
Surround,
|
Surround,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct HintSurroundingsArg {
|
||||||
|
pub open: char,
|
||||||
|
pub close: char,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for HintSurroundingsArg {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "{}{}", self.open, self.close)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Try to parse a `&str` into a tuple of `char`s.
|
/// Try to parse a `&str` into a tuple of `char`s.
|
||||||
fn try_parse_chars(src: &str) -> Result<(char, char)> {
|
fn try_parse_chars(src: &str) -> Result<HintSurroundingsArg> {
|
||||||
if src.chars().count() != 2 {
|
if src.chars().count() != 2 {
|
||||||
return Err(Error::ExpectedSurroundingPair);
|
return Err(Error::ExpectedSurroundingPair);
|
||||||
}
|
}
|
||||||
|
|
||||||
let chars: Vec<char> = src.chars().collect();
|
let chars: Vec<char> = src.chars().collect();
|
||||||
Ok((chars[0], chars[1]))
|
Ok(HintSurroundingsArg {
|
||||||
|
open: chars[0],
|
||||||
|
close: chars[1],
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
|
|
@ -96,7 +125,7 @@ impl Config {
|
||||||
HintStyleArg::Italic => Some(ui::HintStyle::Italic),
|
HintStyleArg::Italic => Some(ui::HintStyle::Italic),
|
||||||
HintStyleArg::Underline => Some(ui::HintStyle::Underline),
|
HintStyleArg::Underline => Some(ui::HintStyle::Underline),
|
||||||
HintStyleArg::Surround => {
|
HintStyleArg::Surround => {
|
||||||
let (open, close) = self.hint_surroundings;
|
let HintSurroundingsArg { open, close } = self.hint_surroundings;
|
||||||
Some(ui::HintStyle::Surround(open, close))
|
Some(ui::HintStyle::Surround(open, close))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use clap::{ArgEnum, Parser};
|
use clap::{Parser, ValueEnum};
|
||||||
|
|
||||||
use super::basic;
|
use super::basic;
|
||||||
use crate::{textbuf::alphabet, tmux, ui, Error, Result};
|
use crate::{textbuf::alphabet, tmux, ui, Error, Result};
|
||||||
|
|
@ -31,7 +31,7 @@ pub struct ConfigExt {
|
||||||
|
|
||||||
/// Capture visible area or entire pane history.
|
/// Capture visible area or entire pane history.
|
||||||
#[clap(
|
#[clap(
|
||||||
arg_enum,
|
value_enum,
|
||||||
long,
|
long,
|
||||||
rename_all = "kebab-case",
|
rename_all = "kebab-case",
|
||||||
default_value = "visible-area"
|
default_value = "visible-area"
|
||||||
|
|
@ -113,7 +113,7 @@ impl ConfigExt {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Specifies which region of the terminal buffer to capture.
|
/// Specifies which region of the terminal buffer to capture.
|
||||||
#[derive(Debug, Clone, ArgEnum, Parser)]
|
#[derive(Debug, Clone, ValueEnum, Parser)]
|
||||||
pub enum CaptureRegion {
|
pub enum CaptureRegion {
|
||||||
/// The entire history.
|
/// The entire history.
|
||||||
// This will end up sending `-S - -E -` to `tmux capture-pane`.
|
// This will end up sending `-S - -E -` to `tmux capture-pane`.
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ pub fn parse_alphabet(src: &str) -> Result<Alphabet> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Type-safe string alphabet (newtype).
|
/// Type-safe string alphabet (newtype).
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Alphabet(pub String);
|
pub struct Alphabet(pub String);
|
||||||
|
|
||||||
impl Alphabet {
|
impl Alphabet {
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ pub(super) const PATTERNS: [(&str, &str); 20] = [
|
||||||
];
|
];
|
||||||
|
|
||||||
/// Type-safe string Pattern Name (newtype).
|
/// Type-safe string Pattern Name (newtype).
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct NamedPattern(pub String, pub String);
|
pub struct NamedPattern(pub String, pub String);
|
||||||
|
|
||||||
/// Parse a name string into `NamedPattern`, used during CLI parsing.
|
/// Parse a name string into `NamedPattern`, used during CLI parsing.
|
||||||
|
|
|
||||||
157
src/ui/colors.rs
157
src/ui/colors.rs
|
|
@ -1,50 +1,107 @@
|
||||||
use clap::Parser;
|
use std::fmt;
|
||||||
use termion::color;
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use clap::Args;
|
||||||
|
use termion::color as tcolor;
|
||||||
|
|
||||||
use crate::{Error, Result};
|
use crate::{Error, Result};
|
||||||
|
|
||||||
pub fn parse_color(src: &str) -> Result<Box<dyn color::Color>> {
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub struct Color(Option<u8>);
|
||||||
|
|
||||||
|
impl tcolor::Color for Color {
|
||||||
|
#[inline]
|
||||||
|
fn write_fg(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match self.0 {
|
||||||
|
Some(value) => write!(f, "\x1B[38;5;{}m", value),
|
||||||
|
None => write!(f, "\x1B[39m"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn write_bg(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match self.0 {
|
||||||
|
Some(value) => write!(f, "\x1B[48;5;{}m", value),
|
||||||
|
None => write!(f, "\x1B[49m"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) static BLACK: Color = Color(Some(0));
|
||||||
|
pub(crate) static RED: Color = Color(Some(1));
|
||||||
|
pub(crate) static GREEN: Color = Color(Some(2));
|
||||||
|
pub(crate) static YELLOW: Color = Color(Some(3));
|
||||||
|
pub(crate) static BLUE: Color = Color(Some(4));
|
||||||
|
pub(crate) static MAGENTA: Color = Color(Some(5));
|
||||||
|
pub(crate) static CYAN: Color = Color(Some(6));
|
||||||
|
pub(crate) static WHITE: Color = Color(Some(7));
|
||||||
|
pub(crate) static BRIGHTBLACK: Color = Color(Some(8));
|
||||||
|
pub(crate) static BRIGHTRED: Color = Color(Some(9));
|
||||||
|
pub(crate) static BRIGHTGREEN: Color = Color(Some(10));
|
||||||
|
pub(crate) static BRIGHTYELLOW: Color = Color(Some(11));
|
||||||
|
pub(crate) static BRIGHTBLUE: Color = Color(Some(12));
|
||||||
|
pub(crate) static BRIGHTMAGENTA: Color = Color(Some(13));
|
||||||
|
pub(crate) static BRIGHTCYAN: Color = Color(Some(14));
|
||||||
|
pub(crate) static BRIGHTWHITE: Color = Color(Some(15));
|
||||||
|
pub(crate) static RESET: Color = Color(None);
|
||||||
|
|
||||||
|
impl FromStr for Color {
|
||||||
|
type Err = Error;
|
||||||
|
|
||||||
|
fn from_str(src: &str) -> std::result::Result<Self, Self::Err> {
|
||||||
match src {
|
match src {
|
||||||
"black" => Ok(Box::new(color::Black)),
|
"black" => Ok(BLACK),
|
||||||
"red" => Ok(Box::new(color::Red)),
|
"red" => Ok(RED),
|
||||||
"green" => Ok(Box::new(color::Green)),
|
"green" => Ok(GREEN),
|
||||||
"yellow" => Ok(Box::new(color::Yellow)),
|
"yellow" => Ok(YELLOW),
|
||||||
"blue" => Ok(Box::new(color::Blue)),
|
"blue" => Ok(BLUE),
|
||||||
"magenta" => Ok(Box::new(color::Magenta)),
|
"magenta" => Ok(MAGENTA),
|
||||||
"cyan" => Ok(Box::new(color::Cyan)),
|
"cyan" => Ok(CYAN),
|
||||||
"white" => Ok(Box::new(color::White)),
|
"white" => Ok(WHITE),
|
||||||
"bright-black" | "brightblack" => Ok(Box::new(color::LightBlack)),
|
"bright-black" | "brightblack" => Ok(BRIGHTBLACK),
|
||||||
"bright-red" | "brightred" => Ok(Box::new(color::LightRed)),
|
"bright-red" | "brightred" => Ok(BRIGHTRED),
|
||||||
"bright-green" | "brightgreen" => Ok(Box::new(color::LightGreen)),
|
"bright-green" | "brightgreen" => Ok(BRIGHTGREEN),
|
||||||
"bright-yellow" | "brightyellow" => Ok(Box::new(color::LightYellow)),
|
"bright-yellow" | "brightyellow" => Ok(BRIGHTYELLOW),
|
||||||
"bright-blue" | "brightblue" => Ok(Box::new(color::LightBlue)),
|
"bright-blue" | "brightblue" => Ok(BRIGHTBLUE),
|
||||||
"bright-magenta" | "brightmagenta" => Ok(Box::new(color::LightMagenta)),
|
"bright-magenta" | "brightmagenta" => Ok(BRIGHTMAGENTA),
|
||||||
"bright-cyan" | "brightcyan" => Ok(Box::new(color::LightCyan)),
|
"bright-cyan" | "brightcyan" => Ok(BRIGHTCYAN),
|
||||||
"bright-white" | "brightwhite" => Ok(Box::new(color::LightWhite)),
|
"bright-white" | "brightwhite" => Ok(BRIGHTWHITE),
|
||||||
"none" => Ok(Box::new(color::Reset)),
|
"none" => Ok(RESET),
|
||||||
_ => Err(Error::UnknownColor),
|
_ => Err(Error::UnknownColor),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn parse_color(src: &str) -> Result<Color> {
|
||||||
|
Color::from_str(src)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn span_color() {
|
fn span_color_fg() {
|
||||||
let text1 = format!(
|
let actual = format!("{}{}", tcolor::Fg(Color::from_str("green").unwrap()), "foo");
|
||||||
"{}{}",
|
let expected = format!("{}{}", tcolor::Fg(tcolor::Green), "foo");
|
||||||
color::Fg(parse_color("green").unwrap().as_ref()),
|
|
||||||
"foo"
|
|
||||||
);
|
|
||||||
let text2 = format!("{}{}", color::Fg(color::Green), "foo");
|
|
||||||
|
|
||||||
assert_eq!(text1, text2);
|
assert_eq!(actual, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn span_color_bg() {
|
||||||
|
let actual = format!("{}{}", tcolor::Bg(Color::from_str("green").unwrap()), "foo");
|
||||||
|
let expected = format!("{}{}", tcolor::Bg(tcolor::Green), "foo");
|
||||||
|
|
||||||
|
assert_eq!(actual, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn no_span_color() {
|
fn no_span_color() {
|
||||||
assert!(parse_color("wat").is_err(), "this color should not exist");
|
assert!(
|
||||||
|
Color::from_str("wat").is_err(),
|
||||||
|
"this color should not exist"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -53,44 +110,38 @@ mod tests {
|
||||||
/// - `focus_*` colors are used to render the currently focused text span.
|
/// - `focus_*` colors are used to render the currently focused text span.
|
||||||
/// - `normal_*` colors are used to render other text spans.
|
/// - `normal_*` colors are used to render other text spans.
|
||||||
/// - `hint_*` colors are used to render the hints.
|
/// - `hint_*` colors are used to render the hints.
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Args, Debug)]
|
||||||
#[clap(about)] // Needed to avoid this doc comment to be used as overall `about`.
|
// #[clap(about)] // Needed to avoid this doc comment to be used as overall `about`.
|
||||||
pub struct UiColors {
|
pub struct UiColors {
|
||||||
/// Foreground color for base text.
|
/// Foreground color for base text.
|
||||||
#[clap(long, default_value = "bright-cyan", parse(try_from_str = parse_color))]
|
#[arg(long, default_value = "bright-cyan", value_parser(parse_color))]
|
||||||
pub text_fg: Box<dyn color::Color>,
|
pub text_fg: Color,
|
||||||
|
|
||||||
/// Background color for base text.
|
/// Background color for base text.
|
||||||
#[clap(long, default_value = "none", parse(try_from_str = parse_color))]
|
#[clap(long, default_value = "none", value_parser(parse_color))]
|
||||||
pub text_bg: Box<dyn color::Color>,
|
pub text_bg: Color,
|
||||||
|
|
||||||
/// Foreground color for spans.
|
/// Foreground color for spans.
|
||||||
#[clap(long, default_value = "blue",
|
#[clap(long, default_value = "blue", value_parser(parse_color))]
|
||||||
parse(try_from_str = parse_color))]
|
pub span_fg: Color,
|
||||||
pub span_fg: Box<dyn color::Color>,
|
|
||||||
|
|
||||||
/// Background color for spans.
|
/// Background color for spans.
|
||||||
#[clap(long, default_value = "none",
|
#[clap(long, default_value = "none", value_parser(parse_color))]
|
||||||
parse(try_from_str = parse_color))]
|
pub span_bg: Color,
|
||||||
pub span_bg: Box<dyn color::Color>,
|
|
||||||
|
|
||||||
/// Foreground color for the focused span.
|
/// Foreground color for the focused span.
|
||||||
#[clap(long, default_value = "magenta",
|
#[clap(long, default_value = "magenta", value_parser(parse_color))]
|
||||||
parse(try_from_str = parse_color))]
|
pub focused_fg: Color,
|
||||||
pub focused_fg: Box<dyn color::Color>,
|
|
||||||
|
|
||||||
/// Background color for the focused span.
|
/// Background color for the focused span.
|
||||||
#[clap(long, default_value = "none",
|
#[clap(long, default_value = "none", value_parser(parse_color))]
|
||||||
parse(try_from_str = parse_color))]
|
pub focused_bg: Color,
|
||||||
pub focused_bg: Box<dyn color::Color>,
|
|
||||||
|
|
||||||
/// Foreground color for hints.
|
/// Foreground color for hints.
|
||||||
#[clap(long, default_value = "yellow",
|
#[clap(long, default_value = "yellow", value_parser(parse_color))]
|
||||||
parse(try_from_str = parse_color))]
|
pub hint_fg: Color,
|
||||||
pub hint_fg: Box<dyn color::Color>,
|
|
||||||
|
|
||||||
/// Background color for hints.
|
/// Background color for hints.
|
||||||
#[clap(long, default_value = "none",
|
#[clap(long, default_value = "none", value_parser(parse_color))]
|
||||||
parse(try_from_str = parse_color))]
|
pub hint_bg: Color,
|
||||||
pub hint_bg: Box<dyn color::Color>,
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
use clap::{ArgEnum, Parser};
|
use clap::{Parser, ValueEnum};
|
||||||
|
|
||||||
/// Describes if, during rendering, a hint should aligned to the leading edge of
|
/// Describes if, during rendering, a hint should aligned to the leading edge of
|
||||||
/// the matched text, or to its trailing edge.
|
/// the matched text, or to its trailing edge.
|
||||||
#[derive(Debug, Clone, ArgEnum, Parser)]
|
#[derive(Debug, Clone, ValueEnum, Parser)]
|
||||||
pub enum HintAlignment {
|
pub enum HintAlignment {
|
||||||
Leading,
|
Leading,
|
||||||
Trailing,
|
Trailing,
|
||||||
|
|
|
||||||
212
src/ui/vc.rs
212
src/ui/vc.rs
|
|
@ -1,8 +1,9 @@
|
||||||
use std::char;
|
use std::char;
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::io;
|
use std::io;
|
||||||
|
use std::io::Write;
|
||||||
|
|
||||||
use termion::{self, color, cursor, event, style};
|
use termion::{self, color, cursor, event, screen::IntoAlternateScreen, style};
|
||||||
|
|
||||||
use super::colors::UiColors;
|
use super::colors::UiColors;
|
||||||
use super::Selection;
|
use super::Selection;
|
||||||
|
|
@ -63,7 +64,7 @@ impl<'a> ViewController<'a> {
|
||||||
};
|
};
|
||||||
|
|
||||||
let (term_width, _) = termion::terminal_size().unwrap_or((80u16, 30u16)); // .expect("Cannot read the terminal size.");
|
let (term_width, _) = termion::terminal_size().unwrap_or((80u16, 30u16)); // .expect("Cannot read the terminal size.");
|
||||||
let wrapped_lines = compute_wrapped_lines(&model.lines, term_width);
|
let wrapped_lines = compute_wrapped_lines(model.lines, term_width);
|
||||||
|
|
||||||
ViewController {
|
ViewController {
|
||||||
model,
|
model,
|
||||||
|
|
@ -177,8 +178,8 @@ impl<'a> ViewController<'a> {
|
||||||
write!(
|
write!(
|
||||||
stdout,
|
stdout,
|
||||||
"{bg_color}{fg_color}",
|
"{bg_color}{fg_color}",
|
||||||
fg_color = color::Fg(colors.text_fg.as_ref()),
|
fg_color = color::Fg(colors.text_fg),
|
||||||
bg_color = color::Bg(colors.text_bg.as_ref()),
|
bg_color = color::Bg(colors.text_bg),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
|
@ -233,8 +234,8 @@ impl<'a> ViewController<'a> {
|
||||||
stdout,
|
stdout,
|
||||||
"{goto}{bg_color}{fg_color}{text}{fg_reset}{bg_reset}",
|
"{goto}{bg_color}{fg_color}{text}{fg_reset}{bg_reset}",
|
||||||
goto = cursor::Goto(pos.0 as u16 + 1, pos.1 as u16 + 1),
|
goto = cursor::Goto(pos.0 as u16 + 1, pos.1 as u16 + 1),
|
||||||
fg_color = color::Fg(fg_color.as_ref()),
|
fg_color = color::Fg(*fg_color),
|
||||||
bg_color = color::Bg(bg_color.as_ref()),
|
bg_color = color::Bg(*bg_color),
|
||||||
fg_reset = color::Fg(color::Reset),
|
fg_reset = color::Fg(color::Reset),
|
||||||
bg_reset = color::Bg(color::Reset),
|
bg_reset = color::Bg(color::Reset),
|
||||||
text = &text,
|
text = &text,
|
||||||
|
|
@ -260,8 +261,8 @@ impl<'a> ViewController<'a> {
|
||||||
colors: &UiColors,
|
colors: &UiColors,
|
||||||
hint_style: &Option<HintStyle>,
|
hint_style: &Option<HintStyle>,
|
||||||
) {
|
) {
|
||||||
let fg_color = color::Fg(colors.hint_fg.as_ref());
|
let fg_color = color::Fg(colors.hint_fg);
|
||||||
let bg_color = color::Bg(colors.hint_bg.as_ref());
|
let bg_color = color::Bg(colors.hint_bg);
|
||||||
let fg_reset = color::Fg(color::Reset);
|
let fg_reset = color::Fg(color::Reset);
|
||||||
let bg_reset = color::Bg(color::Reset);
|
let bg_reset = color::Bg(color::Reset);
|
||||||
let goto = cursor::Goto(pos.0 as u16 + 1, pos.1 as u16 + 1);
|
let goto = cursor::Goto(pos.0 as u16 + 1, pos.1 as u16 + 1);
|
||||||
|
|
@ -358,7 +359,7 @@ impl<'a> ViewController<'a> {
|
||||||
text,
|
text,
|
||||||
focused,
|
focused,
|
||||||
(pos_x, pos_y),
|
(pos_x, pos_y),
|
||||||
&self.rendering_colors,
|
self.rendering_colors,
|
||||||
);
|
);
|
||||||
|
|
||||||
if !focused {
|
if !focused {
|
||||||
|
|
@ -374,7 +375,7 @@ impl<'a> ViewController<'a> {
|
||||||
stdout,
|
stdout,
|
||||||
&span.hint,
|
&span.hint,
|
||||||
(pos_x + offset, pos_y),
|
(pos_x + offset, pos_y),
|
||||||
&self.rendering_colors,
|
self.rendering_colors,
|
||||||
&self.hint_style,
|
&self.hint_style,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -399,9 +400,9 @@ impl<'a> ViewController<'a> {
|
||||||
// 1. Trim all lines and render non-empty ones.
|
// 1. Trim all lines and render non-empty ones.
|
||||||
ViewController::render_base_text(
|
ViewController::render_base_text(
|
||||||
stdout,
|
stdout,
|
||||||
&self.model.lines,
|
self.model.lines,
|
||||||
&self.wrapped_lines,
|
&self.wrapped_lines,
|
||||||
&self.rendering_colors,
|
self.rendering_colors,
|
||||||
);
|
);
|
||||||
|
|
||||||
for (index, span) in self.model.spans.iter().enumerate() {
|
for (index, span) in self.model.spans.iter().enumerate() {
|
||||||
|
|
@ -598,17 +599,16 @@ impl<'a> ViewController<'a> {
|
||||||
/// - Setup steps: switch to alternate screen, switch to raw mode, hide the cursor.
|
/// - Setup steps: switch to alternate screen, switch to raw mode, hide the cursor.
|
||||||
/// - Teardown steps: show cursor, back to main screen.
|
/// - Teardown steps: show cursor, back to main screen.
|
||||||
pub fn present(&mut self) -> Option<Selection> {
|
pub fn present(&mut self) -> Option<Selection> {
|
||||||
use std::io::Write;
|
|
||||||
use termion::raw::IntoRawMode;
|
use termion::raw::IntoRawMode;
|
||||||
use termion::screen::AlternateScreen;
|
|
||||||
|
|
||||||
let mut stdin = termion::async_stdin();
|
let mut stdin = termion::async_stdin();
|
||||||
let mut stdout = AlternateScreen::from(
|
let mut stdout = io::stdout()
|
||||||
io::stdout()
|
.into_alternate_screen()
|
||||||
|
.expect("Cannot access alternate screen.")
|
||||||
.into_raw_mode()
|
.into_raw_mode()
|
||||||
.expect("Cannot access alternate screen."),
|
.expect("Cannot access alternate screen.");
|
||||||
);
|
|
||||||
|
|
||||||
|
// stdout.write(cursor::Hide.into()).unwrap();
|
||||||
write!(stdout, "{}", cursor::Hide).unwrap();
|
write!(stdout, "{}", cursor::Hide).unwrap();
|
||||||
|
|
||||||
let selection = match self.listen(&mut stdin, &mut stdout) {
|
let selection = match self.listen(&mut stdin, &mut stdout) {
|
||||||
|
|
@ -663,7 +663,7 @@ enum Event {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::textbuf::alphabet;
|
use crate::{textbuf::alphabet, ui::colors};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_render_all_lines() {
|
fn test_render_all_lines() {
|
||||||
|
|
@ -684,14 +684,14 @@ path: /usr/local/bin/cargo";
|
||||||
];
|
];
|
||||||
|
|
||||||
let colors = UiColors {
|
let colors = UiColors {
|
||||||
text_fg: Box::new(color::Black),
|
text_fg: colors::BLACK,
|
||||||
text_bg: Box::new(color::White),
|
text_bg: colors::WHITE,
|
||||||
focused_fg: Box::new(color::Red),
|
focused_fg: colors::RED,
|
||||||
focused_bg: Box::new(color::Blue),
|
focused_bg: colors::BLUE,
|
||||||
span_fg: Box::new(color::Green),
|
span_fg: colors::GREEN,
|
||||||
span_bg: Box::new(color::Magenta),
|
span_bg: colors::MAGENTA,
|
||||||
hint_fg: Box::new(color::Yellow),
|
hint_fg: colors::YELLOW,
|
||||||
hint_bg: Box::new(color::Cyan),
|
hint_bg: colors::CYAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut writer = vec![];
|
let mut writer = vec![];
|
||||||
|
|
@ -706,8 +706,8 @@ path: /usr/local/bin/cargo";
|
||||||
format!(
|
format!(
|
||||||
"{bg}{fg}{g1}some text{g2}* e006b06 - (12 days ago) swapper: Make quotes{g3}path: /usr/local/bin/git{g6}path: /usr/local/bin/cargo{fg_reset}{bg_reset}",
|
"{bg}{fg}{g1}some text{g2}* e006b06 - (12 days ago) swapper: Make quotes{g3}path: /usr/local/bin/git{g6}path: /usr/local/bin/cargo{fg_reset}{bg_reset}",
|
||||||
g1 = goto1, g2 = goto2, g3 = goto3, g6 = goto6,
|
g1 = goto1, g2 = goto2, g3 = goto3, g6 = goto6,
|
||||||
fg = color::Fg(colors.text_fg.as_ref()),
|
fg = color::Fg(colors.text_fg),
|
||||||
bg = color::Bg(colors.text_bg.as_ref()),
|
bg = color::Bg(colors.text_bg),
|
||||||
fg_reset = color::Fg(color::Reset),
|
fg_reset = color::Fg(color::Reset),
|
||||||
bg_reset = color::Bg(color::Reset),
|
bg_reset = color::Bg(color::Reset),
|
||||||
)
|
)
|
||||||
|
|
@ -722,14 +722,14 @@ path: /usr/local/bin/cargo";
|
||||||
let focused = true;
|
let focused = true;
|
||||||
let position: (usize, usize) = (3, 1);
|
let position: (usize, usize) = (3, 1);
|
||||||
let colors = UiColors {
|
let colors = UiColors {
|
||||||
text_fg: Box::new(color::Black),
|
text_fg: colors::BLACK,
|
||||||
text_bg: Box::new(color::White),
|
text_bg: colors::WHITE,
|
||||||
focused_fg: Box::new(color::Red),
|
focused_fg: colors::RED,
|
||||||
focused_bg: Box::new(color::Blue),
|
focused_bg: colors::BLUE,
|
||||||
span_fg: Box::new(color::Green),
|
span_fg: colors::GREEN,
|
||||||
span_bg: Box::new(color::Magenta),
|
span_bg: colors::MAGENTA,
|
||||||
hint_fg: Box::new(color::Yellow),
|
hint_fg: colors::YELLOW,
|
||||||
hint_bg: Box::new(color::Cyan),
|
hint_bg: colors::CYAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
ViewController::render_span_text(&mut writer, text, focused, position, &colors);
|
ViewController::render_span_text(&mut writer, text, focused, position, &colors);
|
||||||
|
|
@ -739,8 +739,8 @@ path: /usr/local/bin/cargo";
|
||||||
format!(
|
format!(
|
||||||
"{goto}{bg}{fg}{text}{fg_reset}{bg_reset}",
|
"{goto}{bg}{fg}{text}{fg_reset}{bg_reset}",
|
||||||
goto = cursor::Goto(4, 2),
|
goto = cursor::Goto(4, 2),
|
||||||
fg = color::Fg(colors.focused_fg.as_ref()),
|
fg = color::Fg(colors.focused_fg),
|
||||||
bg = color::Bg(colors.focused_bg.as_ref()),
|
bg = color::Bg(colors.focused_bg),
|
||||||
fg_reset = color::Fg(color::Reset),
|
fg_reset = color::Fg(color::Reset),
|
||||||
bg_reset = color::Bg(color::Reset),
|
bg_reset = color::Bg(color::Reset),
|
||||||
text = &text,
|
text = &text,
|
||||||
|
|
@ -756,14 +756,14 @@ path: /usr/local/bin/cargo";
|
||||||
let focused = false;
|
let focused = false;
|
||||||
let position: (usize, usize) = (3, 1);
|
let position: (usize, usize) = (3, 1);
|
||||||
let colors = UiColors {
|
let colors = UiColors {
|
||||||
text_fg: Box::new(color::Black),
|
text_fg: colors::BLACK,
|
||||||
text_bg: Box::new(color::White),
|
text_bg: colors::WHITE,
|
||||||
focused_fg: Box::new(color::Red),
|
focused_fg: colors::RED,
|
||||||
focused_bg: Box::new(color::Blue),
|
focused_bg: colors::BLUE,
|
||||||
span_fg: Box::new(color::Green),
|
span_fg: colors::GREEN,
|
||||||
span_bg: Box::new(color::Magenta),
|
span_bg: colors::MAGENTA,
|
||||||
hint_fg: Box::new(color::Yellow),
|
hint_fg: colors::YELLOW,
|
||||||
hint_bg: Box::new(color::Cyan),
|
hint_bg: colors::CYAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
ViewController::render_span_text(&mut writer, text, focused, position, &colors);
|
ViewController::render_span_text(&mut writer, text, focused, position, &colors);
|
||||||
|
|
@ -773,8 +773,8 @@ path: /usr/local/bin/cargo";
|
||||||
format!(
|
format!(
|
||||||
"{goto}{bg}{fg}{text}{fg_reset}{bg_reset}",
|
"{goto}{bg}{fg}{text}{fg_reset}{bg_reset}",
|
||||||
goto = cursor::Goto(4, 2),
|
goto = cursor::Goto(4, 2),
|
||||||
fg = color::Fg(colors.span_fg.as_ref()),
|
fg = color::Fg(colors.span_fg),
|
||||||
bg = color::Bg(colors.span_bg.as_ref()),
|
bg = color::Bg(colors.span_bg),
|
||||||
fg_reset = color::Fg(color::Reset),
|
fg_reset = color::Fg(color::Reset),
|
||||||
bg_reset = color::Bg(color::Reset),
|
bg_reset = color::Bg(color::Reset),
|
||||||
text = &text,
|
text = &text,
|
||||||
|
|
@ -789,14 +789,14 @@ path: /usr/local/bin/cargo";
|
||||||
let hint_text = "eo";
|
let hint_text = "eo";
|
||||||
let position: (usize, usize) = (3, 1);
|
let position: (usize, usize) = (3, 1);
|
||||||
let colors = UiColors {
|
let colors = UiColors {
|
||||||
text_fg: Box::new(color::Black),
|
text_fg: colors::BLACK,
|
||||||
text_bg: Box::new(color::White),
|
text_bg: colors::WHITE,
|
||||||
focused_fg: Box::new(color::Red),
|
focused_fg: colors::RED,
|
||||||
focused_bg: Box::new(color::Blue),
|
focused_bg: colors::BLUE,
|
||||||
span_fg: Box::new(color::Green),
|
span_fg: colors::GREEN,
|
||||||
span_bg: Box::new(color::Magenta),
|
span_bg: colors::MAGENTA,
|
||||||
hint_fg: Box::new(color::Yellow),
|
hint_fg: colors::YELLOW,
|
||||||
hint_bg: Box::new(color::Cyan),
|
hint_bg: colors::CYAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
let offset = 0;
|
let offset = 0;
|
||||||
|
|
@ -815,8 +815,8 @@ path: /usr/local/bin/cargo";
|
||||||
format!(
|
format!(
|
||||||
"{goto}{bg}{fg}{text}{fg_reset}{bg_reset}",
|
"{goto}{bg}{fg}{text}{fg_reset}{bg_reset}",
|
||||||
goto = cursor::Goto(4, 2),
|
goto = cursor::Goto(4, 2),
|
||||||
fg = color::Fg(colors.hint_fg.as_ref()),
|
fg = color::Fg(colors.hint_fg),
|
||||||
bg = color::Bg(colors.hint_bg.as_ref()),
|
bg = color::Bg(colors.hint_bg),
|
||||||
fg_reset = color::Fg(color::Reset),
|
fg_reset = color::Fg(color::Reset),
|
||||||
bg_reset = color::Bg(color::Reset),
|
bg_reset = color::Bg(color::Reset),
|
||||||
text = "eo",
|
text = "eo",
|
||||||
|
|
@ -831,14 +831,14 @@ path: /usr/local/bin/cargo";
|
||||||
let hint_text = "eo";
|
let hint_text = "eo";
|
||||||
let position: (usize, usize) = (3, 1);
|
let position: (usize, usize) = (3, 1);
|
||||||
let colors = UiColors {
|
let colors = UiColors {
|
||||||
text_fg: Box::new(color::Black),
|
text_fg: colors::BLACK,
|
||||||
text_bg: Box::new(color::White),
|
text_bg: colors::WHITE,
|
||||||
focused_fg: Box::new(color::Red),
|
focused_fg: colors::RED,
|
||||||
focused_bg: Box::new(color::Blue),
|
focused_bg: colors::BLUE,
|
||||||
span_fg: Box::new(color::Green),
|
span_fg: colors::GREEN,
|
||||||
span_bg: Box::new(color::Magenta),
|
span_bg: colors::MAGENTA,
|
||||||
hint_fg: Box::new(color::Yellow),
|
hint_fg: colors::YELLOW,
|
||||||
hint_bg: Box::new(color::Cyan),
|
hint_bg: colors::CYAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
let offset = 0;
|
let offset = 0;
|
||||||
|
|
@ -857,8 +857,8 @@ path: /usr/local/bin/cargo";
|
||||||
format!(
|
format!(
|
||||||
"{goto}{bg}{fg}{sty}{text}{sty_reset}{fg_reset}{bg_reset}",
|
"{goto}{bg}{fg}{sty}{text}{sty_reset}{fg_reset}{bg_reset}",
|
||||||
goto = cursor::Goto(4, 2),
|
goto = cursor::Goto(4, 2),
|
||||||
fg = color::Fg(colors.hint_fg.as_ref()),
|
fg = color::Fg(colors.hint_fg),
|
||||||
bg = color::Bg(colors.hint_bg.as_ref()),
|
bg = color::Bg(colors.hint_bg),
|
||||||
fg_reset = color::Fg(color::Reset),
|
fg_reset = color::Fg(color::Reset),
|
||||||
bg_reset = color::Bg(color::Reset),
|
bg_reset = color::Bg(color::Reset),
|
||||||
sty = style::Underline,
|
sty = style::Underline,
|
||||||
|
|
@ -875,14 +875,14 @@ path: /usr/local/bin/cargo";
|
||||||
let hint_text = "eo";
|
let hint_text = "eo";
|
||||||
let position: (usize, usize) = (3, 1);
|
let position: (usize, usize) = (3, 1);
|
||||||
let colors = UiColors {
|
let colors = UiColors {
|
||||||
text_fg: Box::new(color::Black),
|
text_fg: colors::BLACK,
|
||||||
text_bg: Box::new(color::White),
|
text_bg: colors::WHITE,
|
||||||
focused_fg: Box::new(color::Red),
|
focused_fg: colors::RED,
|
||||||
focused_bg: Box::new(color::Blue),
|
focused_bg: colors::BLUE,
|
||||||
span_fg: Box::new(color::Green),
|
span_fg: colors::GREEN,
|
||||||
span_bg: Box::new(color::Magenta),
|
span_bg: colors::MAGENTA,
|
||||||
hint_fg: Box::new(color::Yellow),
|
hint_fg: colors::YELLOW,
|
||||||
hint_bg: Box::new(color::Cyan),
|
hint_bg: colors::CYAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
let offset = 0;
|
let offset = 0;
|
||||||
|
|
@ -901,8 +901,8 @@ path: /usr/local/bin/cargo";
|
||||||
format!(
|
format!(
|
||||||
"{goto}{bg}{fg}{bra}{text}{bra_close}{fg_reset}{bg_reset}",
|
"{goto}{bg}{fg}{bra}{text}{bra_close}{fg_reset}{bg_reset}",
|
||||||
goto = cursor::Goto(4, 2),
|
goto = cursor::Goto(4, 2),
|
||||||
fg = color::Fg(colors.hint_fg.as_ref()),
|
fg = color::Fg(colors.hint_fg),
|
||||||
bg = color::Bg(colors.hint_bg.as_ref()),
|
bg = color::Bg(colors.hint_bg),
|
||||||
fg_reset = color::Fg(color::Reset),
|
fg_reset = color::Fg(color::Reset),
|
||||||
bg_reset = color::Bg(color::Reset),
|
bg_reset = color::Bg(color::Reset),
|
||||||
bra = '{',
|
bra = '{',
|
||||||
|
|
@ -937,16 +937,16 @@ Barcelona https://en.wikipedia.org/wiki/Barcelona - ";
|
||||||
unique_hint,
|
unique_hint,
|
||||||
);
|
);
|
||||||
let term_width: u16 = 80;
|
let term_width: u16 = 80;
|
||||||
let wrapped_lines = compute_wrapped_lines(&model.lines, term_width);
|
let wrapped_lines = compute_wrapped_lines(model.lines, term_width);
|
||||||
let rendering_colors = UiColors {
|
let rendering_colors = UiColors {
|
||||||
text_fg: Box::new(color::Black),
|
text_fg: colors::BLACK,
|
||||||
text_bg: Box::new(color::White),
|
text_bg: colors::WHITE,
|
||||||
focused_fg: Box::new(color::Red),
|
focused_fg: colors::RED,
|
||||||
focused_bg: Box::new(color::Blue),
|
focused_bg: colors::BLUE,
|
||||||
span_fg: Box::new(color::Green),
|
span_fg: colors::GREEN,
|
||||||
span_bg: Box::new(color::Magenta),
|
span_bg: colors::MAGENTA,
|
||||||
hint_fg: Box::new(color::Yellow),
|
hint_fg: colors::YELLOW,
|
||||||
hint_bg: Box::new(color::Cyan),
|
hint_bg: colors::CYAN,
|
||||||
};
|
};
|
||||||
let hint_alignment = HintAlignment::Leading;
|
let hint_alignment = HintAlignment::Leading;
|
||||||
|
|
||||||
|
|
@ -974,8 +974,8 @@ Barcelona https://en.wikipedia.org/wiki/Barcelona - ";
|
||||||
{goto3}Barcelona https://en.wikipedia.org/wiki/Barcelona -{fg_reset}{bg_reset}",
|
{goto3}Barcelona https://en.wikipedia.org/wiki/Barcelona -{fg_reset}{bg_reset}",
|
||||||
goto1 = goto1,
|
goto1 = goto1,
|
||||||
goto3 = goto3,
|
goto3 = goto3,
|
||||||
fg = color::Fg(rendering_colors.text_fg.as_ref()),
|
fg = color::Fg(rendering_colors.text_fg),
|
||||||
bg = color::Bg(rendering_colors.text_bg.as_ref()),
|
bg = color::Bg(rendering_colors.text_bg),
|
||||||
fg_reset = color::Fg(color::Reset),
|
fg_reset = color::Fg(color::Reset),
|
||||||
bg_reset = color::Bg(color::Reset),
|
bg_reset = color::Bg(color::Reset),
|
||||||
);
|
);
|
||||||
|
|
@ -1013,14 +1013,14 @@ Barcelona https://en.wikipedia.org/wiki/Barcelona - ";
|
||||||
let default_output_destination = OutputDestination::Tmux;
|
let default_output_destination = OutputDestination::Tmux;
|
||||||
|
|
||||||
let rendering_colors = UiColors {
|
let rendering_colors = UiColors {
|
||||||
text_fg: Box::new(color::Black),
|
text_fg: colors::BLACK,
|
||||||
text_bg: Box::new(color::White),
|
text_bg: colors::WHITE,
|
||||||
focused_fg: Box::new(color::Red),
|
focused_fg: colors::RED,
|
||||||
focused_bg: Box::new(color::Blue),
|
focused_bg: colors::BLUE,
|
||||||
span_fg: Box::new(color::Green),
|
span_fg: colors::GREEN,
|
||||||
span_bg: Box::new(color::Magenta),
|
span_bg: colors::MAGENTA,
|
||||||
hint_fg: Box::new(color::Yellow),
|
hint_fg: colors::YELLOW,
|
||||||
hint_bg: Box::new(color::Cyan),
|
hint_bg: colors::CYAN,
|
||||||
};
|
};
|
||||||
let hint_alignment = HintAlignment::Leading;
|
let hint_alignment = HintAlignment::Leading;
|
||||||
let hint_style = None;
|
let hint_style = None;
|
||||||
|
|
@ -1046,8 +1046,8 @@ Barcelona https://en.wikipedia.org/wiki/Barcelona - ";
|
||||||
{goto3}Barcelona https://en.wikipedia.org/wiki/Barcelona -{fg_reset}{bg_reset}",
|
{goto3}Barcelona https://en.wikipedia.org/wiki/Barcelona -{fg_reset}{bg_reset}",
|
||||||
goto1 = goto1,
|
goto1 = goto1,
|
||||||
goto3 = goto3,
|
goto3 = goto3,
|
||||||
fg = color::Fg(rendering_colors.text_fg.as_ref()),
|
fg = color::Fg(rendering_colors.text_fg),
|
||||||
bg = color::Bg(rendering_colors.text_bg.as_ref()),
|
bg = color::Bg(rendering_colors.text_bg),
|
||||||
fg_reset = color::Fg(color::Reset),
|
fg_reset = color::Fg(color::Reset),
|
||||||
bg_reset = color::Bg(color::Reset)
|
bg_reset = color::Bg(color::Reset)
|
||||||
)
|
)
|
||||||
|
|
@ -1058,8 +1058,8 @@ Barcelona https://en.wikipedia.org/wiki/Barcelona - ";
|
||||||
format!(
|
format!(
|
||||||
"{goto7_1}{span_bg}{span_fg}127.0.0.1{fg_reset}{bg_reset}",
|
"{goto7_1}{span_bg}{span_fg}127.0.0.1{fg_reset}{bg_reset}",
|
||||||
goto7_1 = goto7_1,
|
goto7_1 = goto7_1,
|
||||||
span_fg = color::Fg(rendering_colors.span_fg.as_ref()),
|
span_fg = color::Fg(rendering_colors.span_fg),
|
||||||
span_bg = color::Bg(rendering_colors.span_bg.as_ref()),
|
span_bg = color::Bg(rendering_colors.span_bg),
|
||||||
fg_reset = color::Fg(color::Reset),
|
fg_reset = color::Fg(color::Reset),
|
||||||
bg_reset = color::Bg(color::Reset)
|
bg_reset = color::Bg(color::Reset)
|
||||||
)
|
)
|
||||||
|
|
@ -1071,8 +1071,8 @@ Barcelona https://en.wikipedia.org/wiki/Barcelona - ";
|
||||||
format!(
|
format!(
|
||||||
"{goto7_1}{hint_bg}{hint_fg}b{fg_reset}{bg_reset}",
|
"{goto7_1}{hint_bg}{hint_fg}b{fg_reset}{bg_reset}",
|
||||||
goto7_1 = goto7_1,
|
goto7_1 = goto7_1,
|
||||||
hint_fg = color::Fg(rendering_colors.hint_fg.as_ref()),
|
hint_fg = color::Fg(rendering_colors.hint_fg),
|
||||||
hint_bg = color::Bg(rendering_colors.hint_bg.as_ref()),
|
hint_bg = color::Bg(rendering_colors.hint_bg),
|
||||||
fg_reset = color::Fg(color::Reset),
|
fg_reset = color::Fg(color::Reset),
|
||||||
bg_reset = color::Bg(color::Reset)
|
bg_reset = color::Bg(color::Reset)
|
||||||
)
|
)
|
||||||
|
|
@ -1083,8 +1083,8 @@ Barcelona https://en.wikipedia.org/wiki/Barcelona - ";
|
||||||
format!(
|
format!(
|
||||||
"{goto11_3}{focus_bg}{focus_fg}https://en.wikipedia.org/wiki/Barcelona{fg_reset}{bg_reset}",
|
"{goto11_3}{focus_bg}{focus_fg}https://en.wikipedia.org/wiki/Barcelona{fg_reset}{bg_reset}",
|
||||||
goto11_3 = goto11_3,
|
goto11_3 = goto11_3,
|
||||||
focus_fg = color::Fg(rendering_colors.focused_fg.as_ref()),
|
focus_fg = color::Fg(rendering_colors.focused_fg),
|
||||||
focus_bg = color::Bg(rendering_colors.focused_bg.as_ref()),
|
focus_bg = color::Bg(rendering_colors.focused_bg),
|
||||||
fg_reset = color::Fg(color::Reset),
|
fg_reset = color::Fg(color::Reset),
|
||||||
bg_reset = color::Bg(color::Reset)
|
bg_reset = color::Bg(color::Reset)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue