mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
feat: if input is empty, close it on backspace command (#630)
This commit is contained in:
parent
19791d8328
commit
fab5bc16cc
4 changed files with 16 additions and 12 deletions
|
|
@ -15,9 +15,12 @@ impl From<bool> for Opt {
|
||||||
|
|
||||||
impl Input {
|
impl Input {
|
||||||
pub fn backspace(&mut self, opt: impl Into<Opt>) {
|
pub fn backspace(&mut self, opt: impl Into<Opt>) {
|
||||||
let opt = opt.into() as Opt;
|
|
||||||
let snap = self.snaps.current_mut();
|
let snap = self.snaps.current_mut();
|
||||||
|
if snap.value.is_empty() {
|
||||||
|
return self.close(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
let opt = opt.into() as Opt;
|
||||||
if !opt.under && snap.cursor < 1 {
|
if !opt.under && snap.cursor < 1 {
|
||||||
return;
|
return;
|
||||||
} else if opt.under && snap.cursor >= snap.value.len() {
|
} else if opt.under && snap.cursor >= snap.value.len() {
|
||||||
|
|
|
||||||
|
|
@ -69,21 +69,21 @@ impl Input {
|
||||||
let opt = opt.into() as Opt;
|
let opt = opt.into() as Opt;
|
||||||
let snap = self.snap_mut();
|
let snap = self.snap_mut();
|
||||||
|
|
||||||
match opt.kind.as_bytes() {
|
match opt.kind.as_str() {
|
||||||
b"bol" => {
|
"bol" => {
|
||||||
let end = snap.idx(snap.cursor).unwrap_or(snap.len());
|
let end = snap.idx(snap.cursor).unwrap_or(snap.len());
|
||||||
self.kill_range(..end)
|
self.kill_range(..end)
|
||||||
}
|
}
|
||||||
b"eol" => {
|
"eol" => {
|
||||||
let start = snap.idx(snap.cursor).unwrap_or(snap.len());
|
let start = snap.idx(snap.cursor).unwrap_or(snap.len());
|
||||||
self.kill_range(start..)
|
self.kill_range(start..)
|
||||||
}
|
}
|
||||||
b"backward" => {
|
"backward" => {
|
||||||
let end = snap.idx(snap.cursor).unwrap_or(snap.len());
|
let end = snap.idx(snap.cursor).unwrap_or(snap.len());
|
||||||
let start = end - Self::find_word_boundary(snap.value[..end].chars().rev());
|
let start = end - Self::find_word_boundary(snap.value[..end].chars().rev());
|
||||||
self.kill_range(start..end)
|
self.kill_range(start..end)
|
||||||
}
|
}
|
||||||
b"forward" => {
|
"forward" => {
|
||||||
let start = snap.idx(snap.cursor).unwrap_or(snap.len());
|
let start = snap.idx(snap.cursor).unwrap_or(snap.len());
|
||||||
let end = start + Self::find_word_boundary(snap.value[start..].chars());
|
let end = start + Self::find_word_boundary(snap.value[start..].chars());
|
||||||
self.kill_range(start..end)
|
self.kill_range(start..end)
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ pub struct Url;
|
||||||
impl Url {
|
impl Url {
|
||||||
pub fn register(lua: &Lua) -> mlua::Result<()> {
|
pub fn register(lua: &Lua) -> mlua::Result<()> {
|
||||||
lua.register_userdata_type::<yazi_shared::fs::Url>(|reg| {
|
lua.register_userdata_type::<yazi_shared::fs::Url>(|reg| {
|
||||||
reg.add_field_method_get("frag", |_, me| Ok(me.frag().map(ToOwned::to_owned)));
|
reg.add_field_method_get("frag", |lua, me| lua.create_string(me.frag()));
|
||||||
reg.add_field_method_get("is_regular", |_, me| Ok(me.is_regular()));
|
reg.add_field_method_get("is_regular", |_, me| Ok(me.is_regular()));
|
||||||
reg.add_field_method_get("is_search", |_, me| Ok(me.is_search()));
|
reg.add_field_method_get("is_search", |_, me| Ok(me.is_search()));
|
||||||
reg.add_field_method_get("is_archive", |_, me| Ok(me.is_archive()));
|
reg.add_field_method_get("is_archive", |_, me| Ok(me.is_archive()));
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ const ENCODE_SET: &AsciiSet = &CONTROLS.add(b'#');
|
||||||
pub struct Url {
|
pub struct Url {
|
||||||
scheme: UrlScheme,
|
scheme: UrlScheme,
|
||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
frag: Option<String>,
|
frag: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
|
#[derive(Clone, Copy, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
|
||||||
|
|
@ -76,7 +76,7 @@ impl From<&str> for Url {
|
||||||
}
|
}
|
||||||
Some((a, b)) => {
|
Some((a, b)) => {
|
||||||
url.path = percent_decode_str(a).decode_utf8_lossy().into_owned().into();
|
url.path = percent_decode_str(a).decode_utf8_lossy().into_owned().into();
|
||||||
url.frag = Some(b.to_string()).filter(|s| !s.is_empty());
|
url.frag = b.to_string();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
url
|
url
|
||||||
|
|
@ -108,7 +108,8 @@ impl ToString for Url {
|
||||||
};
|
};
|
||||||
|
|
||||||
let path = percent_encode(self.path.as_os_str().as_encoded_bytes(), ENCODE_SET);
|
let path = percent_encode(self.path.as_os_str().as_encoded_bytes(), ENCODE_SET);
|
||||||
let frag = self.frag.as_ref().map(|s| format!("#{s}")).unwrap_or_default();
|
let frag =
|
||||||
|
Some(&self.frag).filter(|&s| !s.is_empty()).map(|s| format!("#{s}")).unwrap_or_default();
|
||||||
format!("{scheme}{path}{frag}")
|
format!("{scheme}{path}{frag}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -174,7 +175,7 @@ impl Url {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn into_search(mut self, frag: String) -> Self {
|
pub fn into_search(mut self, frag: String) -> Self {
|
||||||
self.scheme = UrlScheme::Search;
|
self.scheme = UrlScheme::Search;
|
||||||
self.frag = Some(frag);
|
self.frag = frag;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -196,7 +197,7 @@ impl Url {
|
||||||
|
|
||||||
// --- Frag
|
// --- Frag
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn frag(&self) -> Option<&str> { self.frag.as_deref() }
|
pub fn frag(&self) -> &str { &self.frag }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&str> for UrlScheme {
|
impl From<&str> for UrlScheme {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue