Skip to content

Commit

Permalink
feat(command): add init command
Browse files Browse the repository at this point in the history
  • Loading branch information
graelo committed Nov 7, 2022
1 parent df661e2 commit 421c74b
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 30 deletions.
21 changes: 19 additions & 2 deletions src/bin/tmux_copyrat.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,30 @@
use clap::Parser;
use copyrat::{
config::extended::{ConfigExt, OutputDestination},
config::extended::{ConfigExt, MainConfig, OutputDestination},
tmux,
ui::Selection,
Result,
};

fn main() -> Result<()> {
let config = ConfigExt::initialize()?;
let main_config = MainConfig::parse();

match main_config {
MainConfig::Init => init(),
MainConfig::Run { config_ext } => {
let config = config_ext.build()?;
run(config)
}
}
}

fn init() -> Result<()> {
let text = std::include_str!("../../tmux-copyrat.tmux");
println!("{text}");
Ok(())
}

fn run(config: ConfigExt) -> Result<()> {
// Identify active pane and capture its content.
let panes: Vec<tmux::Pane> = tmux::available_panes()?;

Expand Down
30 changes: 20 additions & 10 deletions src/config/extended.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,27 @@
use std::collections::HashMap;
use std::fmt;

use clap::{Parser, ValueEnum};
use clap::{Args, Parser, ValueEnum};

use super::basic;
use crate::{textbuf::alphabet, tmux, ui, Error, Result};

#[derive(Parser, Debug)]
#[clap(author, about, version)]
pub enum MainConfig {
/// Run tmux-copyrat.
Run {
#[command(flatten)]
config_ext: ConfigExt,
},
/// Print the tmux plugin config file for initial configuration.
Init,
}

/// Extended configuration for handling Tmux-specific configuration (options
/// and outputs). This is only used by `tmux-copyrat` and parsed from command
/// line.
#[derive(Parser, Debug)]
#[clap(author, about, version)]
#[derive(Args, Debug)]
pub struct ConfigExt {
/// Don't read options from Tmux.
///
Expand Down Expand Up @@ -52,20 +63,19 @@ pub struct ConfigExt {
}

impl ConfigExt {
pub fn initialize() -> Result<ConfigExt> {
let mut config_ext = ConfigExt::parse();

if !config_ext.ignore_tmux_options {
/// Finalize the ConfigExt by merging the tmux options.
pub fn build(mut self) -> Result<ConfigExt> {
if !self.ignore_tmux_options {
let tmux_options: HashMap<String, String> = tmux::get_options("@copyrat-")?;

// Override default values with those coming from tmux.
let inner = &mut config_ext.basic_config;
let inner = &mut self.basic_config;

for (name, value) in &tmux_options {
match name.as_ref() {
"@copyrat-capture-region" => {
let case_insensitive = true;
config_ext.capture_region = CaptureRegion::from_str(value, case_insensitive)
self.capture_region = CaptureRegion::from_str(value, case_insensitive)
.map_err(Error::ExpectedEnumVariant)?
}
"@copyrat-alphabet" => {
Expand Down Expand Up @@ -108,7 +118,7 @@ impl ConfigExt {
}
}

Ok(config_ext)
Ok(self)
}
}

Expand Down
31 changes: 13 additions & 18 deletions copyrat.tmux → tmux-copyrat.tmux
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env zsh
#!/usr/bin/env bash

# This scripts provides a default configuration for tmux-copyrat options and
# key bindings. It is run only once at tmux launch.
Expand Down Expand Up @@ -28,18 +28,19 @@
# You can also entirely ignore this file (not even source it) and define all
# options and bindings in your `tmux.conf`.

CURRENT_DIR="$( cd "$( dirname "$0" )" && pwd )"
BINARY=${CURRENT_DIR}/tmux-copyrat
BINARY=$(which tmux-copyrat)
# CURRENT_DIR="$( cd "$( dirname "$0" )" && pwd )"
# BINARY=${CURRENT_DIR}/tmux-copyrat


#
# Top-level options
#

setup_option() {
local opt_name=$1
local default_value=$2
local current_value=$(tmux show-option -gqv @copyrat-${opt_name})
setup_option () {
opt_name=$1
default_value=$2
current_value=$(tmux show-option -gqv @copyrat-${opt_name})
value=${current_value:-${default_value}}
tmux set-option -g @copyrat-${opt_name} ${value}
}
Expand Down Expand Up @@ -70,12 +71,12 @@ tmux bind-key ${keyswitch} switch-client -T ${keytable}
# Pattern bindings
#

setup_pattern_binding() {
local key=$1
local pattern_arg="$2"
setup_pattern_binding () {
key=$1
pattern_arg="$2"
# The default window name `[copyrat]` has to be single quoted because it is
# interpreted by the shell when launched by tmux.
tmux bind-key -T ${keytable} ${key} new-window -d -n ${window_name} "${BINARY} --window-name '"${window_name}"' --reverse --unique-hint ${pattern_arg}"
tmux bind-key -T ${keytable} ${key} new-window -d -n ${window_name} "${BINARY} run --window-name '"${window_name}"' --reverse --unique-hint ${pattern_arg}"
}

# prefix + t + c searches for hex colors #aa00f5
Expand Down Expand Up @@ -112,10 +113,4 @@ setup_pattern_binding "6" "--pattern-name ipv6"
setup_pattern_binding "space" "--all-patterns"

# prefix + t + / prompts for a pattern and search for it
tmux bind-key -T ${keytable} "/" command-prompt -p "search:" "new-window -d -n '${window_name}' \"${BINARY}\" --window-name '${window_name}' --reverse --unique-hint --custom-pattern %%"


# Auto-install is currently disabled as it requires the user to have cargo installed.
# if [ ! -f "$BINARY" ]; then
# cd "${CURRENT_DIR}" && cargo build --release
# fi
tmux bind-key -T ${keytable} "/" command-prompt -p "search:" "new-window -d -n '${window_name}' \"${BINARY}\" run --window-name '${window_name}' --reverse --unique-hint --custom-pattern %%"

0 comments on commit 421c74b

Please sign in to comment.