feat: if input is empty, close it on backspace command (#630)

This commit is contained in:
Rolv Apneseth 2024-02-06 14:51:34 +00:00 committed by GitHub
parent 19791d8328
commit fab5bc16cc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 16 additions and 12 deletions

View file

@ -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() {

View file

@ -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)

View file

@ -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()));

View file

@ -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 {