Skip to content

Commit 66b418f

Browse files
authored
feat: truncate long items in the file list (#2754)
1 parent cea2628 commit 66b418f

File tree

4 files changed

+38
-12
lines changed

4 files changed

+38
-12
lines changed

yazi-plugin/preset/components/current.lua

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,16 @@ function Current:redraw()
3232
return self:empty()
3333
end
3434

35-
local entities, linemodes = {}, {}
35+
local left, right = {}, {}
3636
for _, f in ipairs(files) do
37-
entities[#entities + 1] = Entity:new(f):redraw()
38-
linemodes[#linemodes + 1] = Linemode:new(f):redraw()
37+
left[#left + 1] = Entity:new(f):redraw()
38+
right[#right + 1] = Linemode:new(f):redraw()
39+
left[#left]:truncate { max = math.max(0, self._area.w - right[#right]:width()) }
3940
end
4041

4142
return {
42-
ui.List(entities):area(self._area),
43-
ui.Text(linemodes):area(self._area):align(ui.Text.RIGHT),
43+
ui.List(left):area(self._area),
44+
ui.Text(right):area(self._area):align(ui.Text.RIGHT),
4445
}
4546
end
4647

yazi-plugin/preset/components/parent.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ function Parent:redraw()
1717
return {}
1818
end
1919

20-
local entities = {}
20+
local items = {}
2121
for _, f in ipairs(self._folder.window) do
22-
entities[#entities + 1] = Entity:new(f):redraw()
22+
items[#items + 1] = Entity:new(f):redraw():truncate { max = self._area.w }
2323
end
2424

2525
return {
26-
ui.List(entities):area(self._area),
26+
ui.List(items):area(self._area),
2727
}
2828
end
2929

yazi-plugin/preset/plugins/folder.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ function M:peek(job)
1919
return ya.preview_widget(job, ui.Line(s):area(job.area):align(ui.Line.CENTER))
2020
end
2121

22-
local entities = {}
22+
local items = {}
2323
for _, f in ipairs(folder.window) do
24-
entities[#entities + 1] = Entity:new(f):redraw()
24+
items[#items + 1] = Entity:new(f):redraw():truncate { max = job.area.w }
2525
end
2626

2727
ya.preview_widget(job, {
28-
ui.List(entities):area(job.area),
28+
ui.List(items):area(job.area),
2929
table.unpack(Marker:new(job.area, folder):redraw()),
3030
})
3131
end

yazi-plugin/src/elements/line.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::mem;
1+
use std::{borrow::Cow, mem};
22

33
use ansi_to_tui::IntoText;
44
use mlua::{AnyUserData, ExternalError, ExternalResult, IntoLua, Lua, MetaMethod, Table, UserData, UserDataMethods, Value};
@@ -131,5 +131,30 @@ impl UserData for Line {
131131
methods.add_method("visible", |_, me, ()| {
132132
Ok(me.inner.iter().flat_map(|s| s.content.chars()).any(|c| c.width().unwrap_or(0) > 0))
133133
});
134+
methods.add_function_mut("truncate", |_, (ud, t): (AnyUserData, Table)| {
135+
let mut me = ud.borrow_mut::<Self>()?;
136+
let max = t.raw_get("max")?;
137+
138+
let mut width = 0;
139+
'outer: for (x, span) in me.inner.iter_mut().enumerate() {
140+
for (y, c) in span.content.char_indices() {
141+
width += c.width().unwrap_or(0);
142+
if width < max {
143+
continue;
144+
} else if width == max && span.content[y..].chars().nth(1).is_none() {
145+
continue;
146+
}
147+
148+
match &mut span.content {
149+
Cow::Borrowed(s) => span.content = Cow::Borrowed(&s[..y]),
150+
Cow::Owned(s) => s.truncate(y),
151+
}
152+
me.inner.spans.truncate(x + 1);
153+
me.inner.spans.push(ratatui::text::Span::raw("…"));
154+
break 'outer;
155+
}
156+
}
157+
Ok(ud)
158+
});
134159
}
135160
}

0 commit comments

Comments
 (0)