@@ -1,4 +1,4 @@
1−use helix_core::{coords_at_pos, encoding};
1+use helix_core::{coords_at_pos, encoding, Position};
22use helix_view::{
33 document::{Mode, SCRATCH_BUFFER_NAME},
44 graphics::Rect,
@@ -143,6 +143,7 @@ where
143143 helix_view::editor::StatusLineElement::Diagnostics => render_diagnostics,
144144 helix_view::editor::StatusLineElement::Selections => render_selections,
145145 helix_view::editor::StatusLineElement::Position => render_position,
146+ helix_view::editor::StatusLineElement::PositionPercentage => render_position_percentage,
146147 helix_view::editor::StatusLineElement::Spacer => render_spacer,
147148 }
148149}
@@ -251,19 +252,22 @@ where
251252 );
252253}
253254
254−fn render_position<F>(context: &mut RenderContext, write: F)
255−where
256− F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
257−{
258− let position = coords_at_pos(
255+fn get_position(context: &RenderContext) -> Position {
256+ coords_at_pos(
259257 context.doc.text().slice(..),
260258 context
261259 .doc
262260 .selection(context.view.id)
263261 .primary()
264262 .cursor(context.doc.text().slice(..)),
265− );
263+ )
264+}
266265
266+fn render_position<F>(context: &mut RenderContext, write: F)
267+where
268+ F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
269+{
270+ let position = get_position(context);
267271 write(
268272 context,
269273 format!(" {}:{} ", position.row + 1, position.col + 1),
@@ -271,6 +275,19 @@ where
271275 );
272276}
273277
278+fn render_position_percentage<F>(context: &mut RenderContext, write: F)
279+where
280+ F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
281+{
282+ let position = get_position(context);
283+ let maxrows = context.doc.text().len_lines();
284+ write(
285+ context,
286+ format!("{}%", (position.row + 1) * 100 / maxrows),
287+ None,
288+ );
289+}
290+
274291fn render_file_encoding<F>(context: &mut RenderContext, write: F)
275292where
276293 F: Fn(&mut RenderContext, String, Option<Style>) + Copy,