mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
..
This commit is contained in:
parent
e62b324be1
commit
0a594302a4
5 changed files with 26 additions and 16 deletions
|
|
@ -4,7 +4,7 @@ use serde::Deserialize;
|
||||||
|
|
||||||
use super::{Exec, Key};
|
use super::{Exec, Key};
|
||||||
|
|
||||||
#[derive(Clone, Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
pub struct Control {
|
pub struct Control {
|
||||||
pub on: Vec<Key>,
|
pub on: Vec<Key>,
|
||||||
#[serde(deserialize_with = "Exec::deserialize")]
|
#[serde(deserialize_with = "Exec::deserialize")]
|
||||||
|
|
@ -13,8 +13,18 @@ pub struct Control {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Control {
|
impl Control {
|
||||||
#[inline]
|
pub fn to_call(&self) -> Vec<Exec> {
|
||||||
pub fn to_call(&self) -> Vec<Exec> { self.exec.clone() }
|
self
|
||||||
|
.exec
|
||||||
|
.iter()
|
||||||
|
.map(|e| Exec {
|
||||||
|
cmd: e.cmd.clone(),
|
||||||
|
args: e.args.clone(),
|
||||||
|
named: e.named.clone(),
|
||||||
|
data: None,
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Control {
|
impl Control {
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,14 @@
|
||||||
use std::{collections::BTreeMap, fmt::{self, Debug, Display}};
|
use std::{any::Any, collections::BTreeMap, fmt::{self, Debug, Display}};
|
||||||
|
|
||||||
use anyhow::bail;
|
use anyhow::bail;
|
||||||
use serde::{de::{self, Visitor}, Deserializer};
|
use serde::{de::{self, Visitor}, Deserializer};
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Debug, Default)]
|
||||||
pub struct Exec {
|
pub struct Exec {
|
||||||
pub cmd: String,
|
pub cmd: String,
|
||||||
pub args: Vec<String>,
|
pub args: Vec<String>,
|
||||||
pub named: BTreeMap<String, String>,
|
pub named: BTreeMap<String, String>,
|
||||||
|
pub data: Option<Box<dyn Any + Send>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<&str> for Exec {
|
impl TryFrom<&str> for Exec {
|
||||||
|
|
@ -19,7 +20,7 @@ impl TryFrom<&str> for Exec {
|
||||||
bail!("`exec` cannot be empty");
|
bail!("`exec` cannot be empty");
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut exec = Self { cmd: s[0].clone(), args: Vec::new(), named: BTreeMap::new() };
|
let mut exec = Self { cmd: s[0].clone(), ..Default::default() };
|
||||||
for arg in s.into_iter().skip(1) {
|
for arg in s.into_iter().skip(1) {
|
||||||
if arg.starts_with("--") {
|
if arg.starts_with("--") {
|
||||||
let mut arg = arg.splitn(2, '=');
|
let mut arg = arg.splitn(2, '=');
|
||||||
|
|
@ -90,12 +91,12 @@ impl Exec {
|
||||||
impl Exec {
|
impl Exec {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn call(cwd: &str, args: Vec<String>) -> Self {
|
pub fn call(cwd: &str, args: Vec<String>) -> Self {
|
||||||
Exec { cmd: cwd.to_owned(), args, named: Default::default() }
|
Exec { cmd: cwd.to_owned(), args, ..Default::default() }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn call_named(cwd: &str, named: BTreeMap<String, String>) -> Self {
|
pub fn call_named(cwd: &str, named: BTreeMap<String, String>) -> Self {
|
||||||
Exec { cmd: cwd.to_owned(), args: Default::default(), named }
|
Exec { cmd: cwd.to_owned(), named, ..Default::default() }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ use crate::input::Input;
|
||||||
pub struct Help {
|
pub struct Help {
|
||||||
pub visible: bool,
|
pub visible: bool,
|
||||||
pub layer: Layer,
|
pub layer: Layer,
|
||||||
pub(super) bindings: Vec<Control>,
|
pub(super) bindings: Vec<&'static Control>,
|
||||||
|
|
||||||
// Filter
|
// Filter
|
||||||
keyword: Option<String>,
|
keyword: Option<String>,
|
||||||
|
|
@ -44,9 +44,9 @@ impl Help {
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(kw) = kw {
|
if let Some(kw) = kw {
|
||||||
self.bindings = KEYMAP.get(self.layer).iter().filter(|&c| c.contains(kw)).cloned().collect();
|
self.bindings = KEYMAP.get(self.layer).iter().filter(|&c| c.contains(kw)).collect();
|
||||||
} else {
|
} else {
|
||||||
self.bindings = KEYMAP.get(self.layer).clone();
|
self.bindings = KEYMAP.get(self.layer).iter().collect();
|
||||||
}
|
}
|
||||||
|
|
||||||
self.keyword = kw.map(|s| s.to_owned());
|
self.keyword = kw.map(|s| s.to_owned());
|
||||||
|
|
@ -89,7 +89,7 @@ impl Help {
|
||||||
|
|
||||||
// --- Bindings
|
// --- Bindings
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn window(&self) -> &[Control] {
|
pub fn window(&self) -> &[&Control] {
|
||||||
let end = (self.offset + Self::limit()).min(self.bindings.len());
|
let end = (self.offset + Self::limit()).min(self.bindings.len());
|
||||||
&self.bindings[self.offset..end]
|
&self.bindings[self.offset..end]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ use crate::emit;
|
||||||
pub struct Which {
|
pub struct Which {
|
||||||
layer: Layer,
|
layer: Layer,
|
||||||
pub times: usize,
|
pub times: usize,
|
||||||
pub cands: Vec<Control>,
|
pub cands: Vec<&'static Control>,
|
||||||
|
|
||||||
pub visible: bool,
|
pub visible: bool,
|
||||||
}
|
}
|
||||||
|
|
@ -23,8 +23,7 @@ impl Which {
|
||||||
pub fn show(&mut self, key: &Key, layer: Layer) -> bool {
|
pub fn show(&mut self, key: &Key, layer: Layer) -> bool {
|
||||||
self.layer = layer;
|
self.layer = layer;
|
||||||
self.times = 1;
|
self.times = 1;
|
||||||
self.cands =
|
self.cands = KEYMAP.get(layer).iter().filter(|s| s.on.len() > 1 && &s.on[0] == key).collect();
|
||||||
KEYMAP.get(layer).iter().filter(|s| s.on.len() > 1 && &s.on[0] == key).cloned().collect();
|
|
||||||
self.visible = true;
|
self.visible = true;
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ impl Widget for Which<'_> {
|
||||||
fn render(self, area: Rect, buf: &mut Buffer) {
|
fn render(self, area: Rect, buf: &mut Buffer) {
|
||||||
let which = &self.cx.which;
|
let which = &self.cx.which;
|
||||||
let mut cands: (Vec<_>, Vec<_>, Vec<_>) = Default::default();
|
let mut cands: (Vec<_>, Vec<_>, Vec<_>) = Default::default();
|
||||||
for (i, c) in which.cands.iter().enumerate() {
|
for (i, &c) in which.cands.iter().enumerate() {
|
||||||
match i % 3 {
|
match i % 3 {
|
||||||
0 => cands.0.push(c),
|
0 => cands.0.push(c),
|
||||||
1 => cands.1.push(c),
|
1 => cands.1.push(c),
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue