Add join command
This commit is contained in:
parent
caa3953f2c
commit
8ec3ab3338
@ -57,10 +57,7 @@ where
|
|||||||
/// # Errors
|
/// # Errors
|
||||||
///
|
///
|
||||||
/// Will return `Err` if command fifo could not be opened, read from, or written to
|
/// Will return `Err` if command fifo could not be opened, read from, or written to
|
||||||
pub fn get_selections_desc_unordered<S>(keys: Option<S>) -> Result<Vec<SelectionDesc>, KakError>
|
pub fn get_selections_desc_unordered(keys: Option<&str>) -> Result<Vec<SelectionDesc>, KakError> {
|
||||||
where
|
|
||||||
S: AsRef<str>,
|
|
||||||
{
|
|
||||||
response("%val{selections_desc}", keys.as_ref())?
|
response("%val{selections_desc}", keys.as_ref())?
|
||||||
.iter()
|
.iter()
|
||||||
.map(|sd| SelectionDesc::from_str(sd))
|
.map(|sd| SelectionDesc::from_str(sd))
|
||||||
|
@ -86,6 +86,46 @@ impl SelectionDesc {
|
|||||||
s.right.row - s.left.row + 1
|
s.right.row - s.left.row + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Gets the smallest selection that encompases both selections
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// let sel1 = SelectionDesc {
|
||||||
|
/// left: AnchorPosition { row: 10, col: 16 },
|
||||||
|
/// right: AnchorPosition { row: 1, col: 14 },
|
||||||
|
/// };
|
||||||
|
/// let sel2 = SelectionDesc {
|
||||||
|
/// left: AnchorPosition { row: 64, col: 10 },
|
||||||
|
/// right: AnchorPosition { row: 1, col: 100 },
|
||||||
|
/// };
|
||||||
|
/// let expected_bounding = SelectionDesc {
|
||||||
|
/// left: AnchorPosition { row: 1, col: 14 },
|
||||||
|
/// right: AnchorPosition { row: 64, col: 27 },
|
||||||
|
/// };
|
||||||
|
/// assert_eq!(sel1.rev().bounding_selection(&sel1), sel1.sort());
|
||||||
|
/// assert_eq!(sel2.bounding_selection(&sel1), expected_bounding.sort());
|
||||||
|
/// assert_eq!(sel2.rev().bounding_selection(&sel1.rev()), expected_bounding.sort());
|
||||||
|
/// assert_eq!(sel2.rev().bounding_selection(&sel1), expected_bounding.sort());
|
||||||
|
/// ```
|
||||||
|
pub fn bounding_selection<SD>(&self, other: SD) -> Self
|
||||||
|
where
|
||||||
|
SD: AsRef<Self>,
|
||||||
|
{
|
||||||
|
// So left is the minimum and right is the maximum
|
||||||
|
let (a, b) = (self.sort(), other.as_ref().sort());
|
||||||
|
|
||||||
|
Self {
|
||||||
|
left: min(a.left, b.left),
|
||||||
|
right: max(a.right, b.right),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rev(&self) -> Self {
|
||||||
|
Self {
|
||||||
|
left: self.right,
|
||||||
|
right: self.left,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn sort(&self) -> Self {
|
pub fn sort(&self) -> Self {
|
||||||
if self.left < self.right {
|
if self.left < self.right {
|
||||||
|
14
src/join.rs
Normal file
14
src/join.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
use kakplugin::{get_selections_desc_unordered, set_selections_desc, KakError};
|
||||||
|
|
||||||
|
#[derive(clap::StructOpt, Debug)]
|
||||||
|
pub struct Options;
|
||||||
|
|
||||||
|
pub fn join(_options: &Options) -> Result<String, KakError> {
|
||||||
|
set_selections_desc(
|
||||||
|
get_selections_desc_unordered(None)?
|
||||||
|
.into_iter()
|
||||||
|
.reduce(|acc, sd| acc.bounding_selection(sd)),
|
||||||
|
)?;
|
||||||
|
|
||||||
|
Ok(format!("Joined all selections"))
|
||||||
|
}
|
10
src/main.rs
10
src/main.rs
@ -10,12 +10,13 @@
|
|||||||
#![feature(array_chunks)]
|
#![feature(array_chunks)]
|
||||||
|
|
||||||
mod box_;
|
mod box_;
|
||||||
mod rev;
|
|
||||||
mod errors;
|
mod errors;
|
||||||
mod incr;
|
mod incr;
|
||||||
mod invert;
|
mod invert;
|
||||||
|
mod join;
|
||||||
mod math_eval;
|
mod math_eval;
|
||||||
mod pad;
|
mod pad;
|
||||||
|
mod rev;
|
||||||
mod set;
|
mod set;
|
||||||
mod shuf;
|
mod shuf;
|
||||||
mod sort;
|
mod sort;
|
||||||
@ -70,8 +71,10 @@ enum Commands {
|
|||||||
Decr(incr::Options),
|
Decr(incr::Options),
|
||||||
#[clap(about = "Decrement selections")]
|
#[clap(about = "Decrement selections")]
|
||||||
Incr(incr::Options),
|
Incr(incr::Options),
|
||||||
#[clap(about = "Reverse selectinos")]
|
#[clap(about = "Reverse selections")]
|
||||||
Rev(rev::Options)
|
Rev(rev::Options),
|
||||||
|
#[clap(about = "Join selections")]
|
||||||
|
Join(join::Options),
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
@ -123,5 +126,6 @@ fn run() -> Result<String, KakError> {
|
|||||||
Commands::Incr(o) => incr::incr(o, true),
|
Commands::Incr(o) => incr::incr(o, true),
|
||||||
Commands::Decr(o) => incr::incr(o, false),
|
Commands::Decr(o) => incr::incr(o, false),
|
||||||
Commands::Rev(o) => rev::rev(o),
|
Commands::Rev(o) => rev::rev(o),
|
||||||
|
Commands::Join(o) => join::join(o),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user