mirror of
https://github.com/TECHNOFAB11/tmux-copyrat.git
synced 2025-12-12 16:10:07 +01:00
Merge pull request #4 from graelo/refinements
chore(deps): update dependencies
This commit is contained in:
commit
ce4d9e7e1a
4 changed files with 61 additions and 39 deletions
8
Cargo.lock
generated
8
Cargo.lock
generated
|
|
@ -36,9 +36,9 @@ checksum = "581f5dba903aac52ea3feb5ec4810848460ee833876f1f9b0fdeab1f19091574"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.0.19"
|
version = "4.0.20"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8e67816e006b17427c9b4386915109b494fec2d929c63e3bd3561234cbf1bf1e"
|
checksum = "426eed9136e68a14d9de937db20cfd79fcc25c09709872e8005897c618a8365e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atty",
|
"atty",
|
||||||
"bitflags",
|
"bitflags",
|
||||||
|
|
@ -52,9 +52,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_derive"
|
name = "clap_derive"
|
||||||
version = "4.0.18"
|
version = "4.0.20"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "16a1b0f6422af32d5da0c58e2703320f379216ee70198241c84173a8c5ac28f3"
|
checksum = "685fbc59da060ed2cd3d79c86970ee95386b5e5fc69d9cad881912dca0c18807"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heck",
|
"heck",
|
||||||
"proc-macro-error",
|
"proc-macro-error",
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,30 @@
|
||||||
|
use clap::Parser;
|
||||||
use copyrat::{
|
use copyrat::{
|
||||||
config::extended::{ConfigExt, OutputDestination},
|
config::extended::{ConfigExt, MainConfig, OutputDestination},
|
||||||
tmux,
|
tmux,
|
||||||
ui::Selection,
|
ui::Selection,
|
||||||
Result,
|
Result,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() -> 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.
|
// Identify active pane and capture its content.
|
||||||
let panes: Vec<tmux::Pane> = tmux::available_panes()?;
|
let panes: Vec<tmux::Pane> = tmux::available_panes()?;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,27 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use clap::{Parser, ValueEnum};
|
use clap::{Args, Parser, ValueEnum};
|
||||||
|
|
||||||
use super::basic;
|
use super::basic;
|
||||||
use crate::{textbuf::alphabet, tmux, ui, Error, Result};
|
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
|
/// Extended configuration for handling Tmux-specific configuration (options
|
||||||
/// and outputs). This is only used by `tmux-copyrat` and parsed from command
|
/// and outputs). This is only used by `tmux-copyrat` and parsed from command
|
||||||
/// line.
|
/// line.
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Args, Debug)]
|
||||||
#[clap(author, about, version)]
|
|
||||||
pub struct ConfigExt {
|
pub struct ConfigExt {
|
||||||
/// Don't read options from Tmux.
|
/// Don't read options from Tmux.
|
||||||
///
|
///
|
||||||
|
|
@ -18,7 +29,7 @@ pub struct ConfigExt {
|
||||||
/// However, you should consider reading them from the config file (the
|
/// However, you should consider reading them from the config file (the
|
||||||
/// default option) as this saves both a command call (about 10ms) and a
|
/// default option) as this saves both a command call (about 10ms) and a
|
||||||
/// Regex compilation.
|
/// Regex compilation.
|
||||||
#[clap(short = 'n', long)]
|
#[arg(short = 'n', long)]
|
||||||
pub ignore_tmux_options: bool,
|
pub ignore_tmux_options: bool,
|
||||||
|
|
||||||
/// Name of the copyrat temporary Tmux window.
|
/// Name of the copyrat temporary Tmux window.
|
||||||
|
|
@ -26,11 +37,11 @@ pub struct ConfigExt {
|
||||||
/// Copyrat is launched in a temporary window of that name. The only pane
|
/// 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 this temp window gets swapped with the current active one for
|
||||||
/// in-place searching, then swapped back and killed after we exit.
|
/// in-place searching, then swapped back and killed after we exit.
|
||||||
#[clap(short = 'W', long, default_value = "[copyrat]")]
|
#[arg(short = 'W', long, default_value = "[copyrat]")]
|
||||||
pub window_name: String,
|
pub window_name: String,
|
||||||
|
|
||||||
/// Capture visible area or entire pane history.
|
/// Capture visible area or entire pane history.
|
||||||
#[clap(
|
#[arg(
|
||||||
value_enum,
|
value_enum,
|
||||||
long,
|
long,
|
||||||
rename_all = "kebab-case",
|
rename_all = "kebab-case",
|
||||||
|
|
@ -43,29 +54,28 @@ pub struct ConfigExt {
|
||||||
/// If during execution, the output destination is set to be clipboard,
|
/// If during execution, the output destination is set to be clipboard,
|
||||||
/// then copyrat will pipe the selected text to this executable.
|
/// then copyrat will pipe the selected text to this executable.
|
||||||
/// On macOS, this is `pbcopy`, on Linux, this is `xclip`.
|
/// On macOS, this is `pbcopy`, on Linux, this is `xclip`.
|
||||||
#[clap(long, default_value = "pbcopy")]
|
#[arg(long, default_value = "pbcopy")]
|
||||||
pub clipboard_exe: String,
|
pub clipboard_exe: String,
|
||||||
|
|
||||||
// Include fields from the basic config
|
// Include fields from the basic config
|
||||||
#[clap(flatten)]
|
#[command(flatten)]
|
||||||
pub basic_config: basic::Config,
|
pub basic_config: basic::Config,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ConfigExt {
|
impl ConfigExt {
|
||||||
pub fn initialize() -> Result<ConfigExt> {
|
/// Finalize the ConfigExt by merging the tmux options.
|
||||||
let mut config_ext = ConfigExt::parse();
|
pub fn build(mut self) -> Result<ConfigExt> {
|
||||||
|
if !self.ignore_tmux_options {
|
||||||
if !config_ext.ignore_tmux_options {
|
|
||||||
let tmux_options: HashMap<String, String> = tmux::get_options("@copyrat-")?;
|
let tmux_options: HashMap<String, String> = tmux::get_options("@copyrat-")?;
|
||||||
|
|
||||||
// Override default values with those coming from tmux.
|
// 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 {
|
for (name, value) in &tmux_options {
|
||||||
match name.as_ref() {
|
match name.as_ref() {
|
||||||
"@copyrat-capture-region" => {
|
"@copyrat-capture-region" => {
|
||||||
let case_insensitive = true;
|
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)?
|
.map_err(Error::ExpectedEnumVariant)?
|
||||||
}
|
}
|
||||||
"@copyrat-alphabet" => {
|
"@copyrat-alphabet" => {
|
||||||
|
|
@ -108,7 +118,7 @@ impl ConfigExt {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(config_ext)
|
Ok(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/env zsh
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# This scripts provides a default configuration for tmux-copyrat options and
|
# This scripts provides a default configuration for tmux-copyrat options and
|
||||||
# key bindings. It is run only once at tmux launch.
|
# key bindings. It is run only once at tmux launch.
|
||||||
|
|
@ -28,18 +28,19 @@
|
||||||
# You can also entirely ignore this file (not even source it) and define all
|
# You can also entirely ignore this file (not even source it) and define all
|
||||||
# options and bindings in your `tmux.conf`.
|
# options and bindings in your `tmux.conf`.
|
||||||
|
|
||||||
CURRENT_DIR="$( cd "$( dirname "$0" )" && pwd )"
|
BINARY=$(which tmux-copyrat)
|
||||||
BINARY=${CURRENT_DIR}/tmux-copyrat
|
# CURRENT_DIR="$( cd "$( dirname "$0" )" && pwd )"
|
||||||
|
# BINARY=${CURRENT_DIR}/tmux-copyrat
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Top-level options
|
# Top-level options
|
||||||
#
|
#
|
||||||
|
|
||||||
setup_option() {
|
setup_option () {
|
||||||
local opt_name=$1
|
opt_name=$1
|
||||||
local default_value=$2
|
default_value=$2
|
||||||
local current_value=$(tmux show-option -gqv @copyrat-${opt_name})
|
current_value=$(tmux show-option -gqv @copyrat-${opt_name})
|
||||||
value=${current_value:-${default_value}}
|
value=${current_value:-${default_value}}
|
||||||
tmux set-option -g @copyrat-${opt_name} ${value}
|
tmux set-option -g @copyrat-${opt_name} ${value}
|
||||||
}
|
}
|
||||||
|
|
@ -70,12 +71,12 @@ tmux bind-key ${keyswitch} switch-client -T ${keytable}
|
||||||
# Pattern bindings
|
# Pattern bindings
|
||||||
#
|
#
|
||||||
|
|
||||||
setup_pattern_binding() {
|
setup_pattern_binding () {
|
||||||
local key=$1
|
key=$1
|
||||||
local pattern_arg="$2"
|
pattern_arg="$2"
|
||||||
# The default window name `[copyrat]` has to be single quoted because it is
|
# The default window name `[copyrat]` has to be single quoted because it is
|
||||||
# interpreted by the shell when launched by tmux.
|
# 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
|
# prefix + t + c searches for hex colors #aa00f5
|
||||||
|
|
@ -112,10 +113,4 @@ setup_pattern_binding "6" "--pattern-name ipv6"
|
||||||
setup_pattern_binding "space" "--all-patterns"
|
setup_pattern_binding "space" "--all-patterns"
|
||||||
|
|
||||||
# prefix + t + / prompts for a pattern and search for it
|
# 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 %%"
|
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 %%"
|
||||||
|
|
||||||
|
|
||||||
# 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
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue