diff --git a/book/src/configuration.md b/book/src/configuration.md
index c7334af4..5372b9f0 100644
--- a/book/src/configuration.md
+++ b/book/src/configuration.md
@@ -78,6 +78,7 @@ The following elements can be configured:
 | `diagnostics` | The number of warnings and/or errors |
 | `selections` | The number of active selections |
 | `position` | The cursor position |
+| `position-percentage` | The cursor position as a percentage of the total number of lines |
 | `spacer` | Inserts a space between elements (multiple/contiguous spacers may be specified) |
 
 ### `[editor.lsp]` Section
diff --git a/helix-term/src/ui/statusline.rs b/helix-term/src/ui/statusline.rs
index e9e478bf..df6d4800 100644
--- a/helix-term/src/ui/statusline.rs
+++ b/helix-term/src/ui/statusline.rs
@@ -1,4 +1,4 @@
-use helix_core::{coords_at_pos, encoding};
+use helix_core::{coords_at_pos, encoding, Position};
 use helix_view::{
     document::{Mode, SCRATCH_BUFFER_NAME},
     graphics::Rect,
@@ -143,6 +143,7 @@ where
         helix_view::editor::StatusLineElement::Diagnostics => render_diagnostics,
         helix_view::editor::StatusLineElement::Selections => render_selections,
         helix_view::editor::StatusLineElement::Position => render_position,
+        helix_view::editor::StatusLineElement::PositionPercentage => render_position_percentage,
         helix_view::editor::StatusLineElement::Spacer => render_spacer,
     }
 }
@@ -251,19 +252,22 @@ where
     );
 }
 
-fn render_position<F>(context: &mut RenderContext, write: F)
-where
-    F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
-{
-    let position = coords_at_pos(
+fn get_position(context: &RenderContext) -> Position {
+    coords_at_pos(
         context.doc.text().slice(..),
         context
             .doc
             .selection(context.view.id)
             .primary()
             .cursor(context.doc.text().slice(..)),
-    );
+    )
+}
 
+fn render_position<F>(context: &mut RenderContext, write: F)
+where
+    F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
+{
+    let position = get_position(context);
     write(
         context,
         format!(" {}:{} ", position.row + 1, position.col + 1),
@@ -271,6 +275,19 @@ where
     );
 }
 
+fn render_position_percentage<F>(context: &mut RenderContext, write: F)
+where
+    F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
+{
+    let position = get_position(context);
+    let maxrows = context.doc.text().len_lines();
+    write(
+        context,
+        format!("{}%", (position.row + 1) * 100 / maxrows),
+        None,
+    );
+}
+
 fn render_file_encoding<F>(context: &mut RenderContext, write: F)
 where
     F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index 5d82e0d4..f99924cf 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -247,6 +247,8 @@ pub enum StatusLineElement {
     /// The cursor position
     Position,
 
+    /// The cursor position as a percent of the total file
+    PositionPercentage,
     /// A single space
     Spacer,
 }