tmux-copyrat/src/config/tmux_bridge.rs

138 lines
4.8 KiB
Rust
Raw Normal View History

use clap::Clap;
use std::collections::HashMap;
use std::str::FromStr;
2021-03-21 08:51:45 +01:00
use super::basic;
2021-03-21 11:32:57 +01:00
use crate::{
comm::tmux,
error,
textbuf::{alphabet, regexes},
ui,
};
/// Main configuration, parsed from command line.
#[derive(Clap, Debug)]
#[clap(author, about, version)]
2021-03-21 08:51:45 +01:00
pub struct Config {
/// Don't read options from Tmux.
///
/// By default, options formatted like `copyrat-*` are read from tmux.
/// However, you should consider reading them from the config file (the
/// default option) as this saves both a command call (about 10ms) and a
/// Regex compilation.
2021-03-21 11:32:57 +01:00
#[clap(short = 'n', long)]
pub ignore_tmux_options: bool,
2021-03-21 11:32:57 +01:00
/// Name of the copyrat temporary Tmux window.
///
/// Copyrat is launched in a temporary window of that name. The only pane
/// in this temp window gets swapped with the current active one for
/// in-place searching, then swapped back and killed after we exit.
2021-03-21 11:32:57 +01:00
#[clap(short = 'W', long, default_value = "[copyrat]")]
pub window_name: String,
/// Capture visible area or entire pane history.
#[clap(long, arg_enum, default_value = "visible-area")]
pub capture_region: CaptureRegion,
/// Name of the copy-to-clipboard executable.
///
/// If during execution, the output destination is set to be clipboard,
/// then copyrat will pipe the selected text to this executable.
#[clap(long, default_value = "pbcopy")]
pub clipboard_exe: String,
2021-03-21 09:03:22 +01:00
// Include fields from the basic config
#[clap(flatten)]
2021-03-21 09:03:22 +01:00
pub basic_config: basic::Config,
}
2021-03-21 08:51:45 +01:00
impl Config {
2021-03-21 09:03:22 +01:00
pub fn initialize() -> Result<Config, error::ParseError> {
let mut config = Config::parse();
2021-03-21 11:32:57 +01:00
if !config.ignore_tmux_options {
2021-03-21 09:03:22 +01:00
let tmux_options: HashMap<String, String> = tmux::get_options("@copyrat-")?;
// Override default values with those coming from tmux.
2021-03-21 11:32:57 +01:00
let wrapped = &mut config.basic_config;
2021-03-21 09:03:22 +01:00
2021-03-21 11:32:57 +01:00
for (name, value) in &tmux_options {
match name.as_ref() {
"@copyrat-capture" => config.capture_region = CaptureRegion::from_str(&value)?,
"@copyrat-alphabet" => {
wrapped.alphabet = alphabet::parse_alphabet(value)?;
}
"@copyrat-pattern-name" => {
wrapped.named_patterns = vec![regexes::parse_pattern_name(value)?]
}
"@copyrat-custom-pattern" => {
wrapped.custom_patterns = vec![String::from(value)]
}
"@copyrat-reverse" => {
wrapped.reverse = value.parse::<bool>()?;
}
"@copyrat-unique-hint" => {
wrapped.unique_hint = value.parse::<bool>()?;
}
"@copyrat-match-fg" => {
wrapped.colors.match_fg = ui::colors::parse_color(value)?
}
"@copyrat-match-bg" => {
wrapped.colors.match_bg = ui::colors::parse_color(value)?
}
"@copyrat-focused-fg" => {
wrapped.colors.focused_fg = ui::colors::parse_color(value)?
}
"@copyrat-focused-bg" => {
wrapped.colors.focused_bg = ui::colors::parse_color(value)?
}
"@copyrat-hint-fg" => wrapped.colors.hint_fg = ui::colors::parse_color(value)?,
"@copyrat-hint-bg" => wrapped.colors.hint_bg = ui::colors::parse_color(value)?,
"@copyrat-hint-alignment" => {
wrapped.hint_alignment = ui::HintAlignment::from_str(&value)?
}
"@copyrat-hint-style" => {
wrapped.hint_style = Some(basic::HintStyleArg::from_str(&value)?)
}
// Ignore unknown options.
_ => (),
}
}
}
2021-03-21 11:32:57 +01:00
Ok(config)
}
}
#[derive(Clap, Debug)]
pub enum CaptureRegion {
/// The entire history.
///
/// This will end up sending `-S - -E -` to `tmux capture-pane`.
EntireHistory,
/// The visible area.
VisibleArea,
///// Region from start line to end line
/////
///// This works as defined in tmux's docs (order does not matter).
//Region(i32, i32),
}
impl FromStr for CaptureRegion {
type Err = error::ParseError;
fn from_str(s: &str) -> Result<Self, error::ParseError> {
match s {
"leading" => Ok(CaptureRegion::EntireHistory),
"trailing" => Ok(CaptureRegion::VisibleArea),
_ => Err(error::ParseError::ExpectedString(String::from(
"entire-history or visible-area",
))),
}
}
}