mirror of https://github.com/helix-editor/helix
Make gutters padding optional (#2996)
If all gutters are removed, there are still an extra one padding, would be nice to remove that to save some space.pull/3097/head
parent
2a8d38c27b
commit
e8214fb1e6
|
@ -38,7 +38,7 @@ hidden = false
|
||||||
| `shell` | Shell to use when running external commands. | Unix: `["sh", "-c"]`<br/>Windows: `["cmd", "/C"]` |
|
| `shell` | Shell to use when running external commands. | Unix: `["sh", "-c"]`<br/>Windows: `["cmd", "/C"]` |
|
||||||
| `line-number` | Line number display: `absolute` simply shows each line's number, while `relative` shows the distance from the current line. When unfocused or in insert mode, `relative` will still show absolute line numbers. | `absolute` |
|
| `line-number` | Line number display: `absolute` simply shows each line's number, while `relative` shows the distance from the current line. When unfocused or in insert mode, `relative` will still show absolute line numbers. | `absolute` |
|
||||||
| `cursorline` | Highlight all lines with a cursor. | `false` |
|
| `cursorline` | Highlight all lines with a cursor. | `false` |
|
||||||
| `gutters` | Gutters to display: Available are `diagnostics` and `line-numbers`, note that `diagnostics` also includes other features like breakpoints | `["diagnostics", "line-numbers"]` |
|
| `gutters` | Gutters to display: Available are `diagnostics` and `line-numbers` and `padding`, note that `diagnostics` also includes other features like breakpoints | `["diagnostics", "line-numbers", "padding"]` |
|
||||||
| `auto-completion` | Enable automatic pop up of auto-completion. | `true` |
|
| `auto-completion` | Enable automatic pop up of auto-completion. | `true` |
|
||||||
| `auto-format` | Enable automatic formatting on save. | `true` |
|
| `auto-format` | Enable automatic formatting on save. | `true` |
|
||||||
| `idle-timeout` | Time in milliseconds since last keypress before idle timers trigger. Used for autocompletion, set to 0 for instant. | `400` |
|
| `idle-timeout` | Time in milliseconds since last keypress before idle timers trigger. Used for autocompletion, set to 0 for instant. | `400` |
|
||||||
|
|
|
@ -615,7 +615,7 @@ impl EditorView {
|
||||||
// avoid lots of small allocations by reusing a text buffer for each line
|
// avoid lots of small allocations by reusing a text buffer for each line
|
||||||
let mut text = String::with_capacity(8);
|
let mut text = String::with_capacity(8);
|
||||||
|
|
||||||
for (constructor, width) in &view.gutters {
|
for (constructor, width) in view.gutters() {
|
||||||
let gutter = constructor(editor, doc, view, theme, is_focused, *width);
|
let gutter = constructor(editor, doc, view, theme, is_focused, *width);
|
||||||
text.reserve(*width); // ensure there's enough space for the gutter
|
text.reserve(*width); // ensure there's enough space for the gutter
|
||||||
for (i, line) in (view.offset.row..(last_line + 1)).enumerate() {
|
for (i, line) in (view.offset.row..(last_line + 1)).enumerate() {
|
||||||
|
|
|
@ -314,6 +314,8 @@ pub enum GutterType {
|
||||||
Diagnostics,
|
Diagnostics,
|
||||||
/// Show line numbers
|
/// Show line numbers
|
||||||
LineNumbers,
|
LineNumbers,
|
||||||
|
/// Show one blank space
|
||||||
|
Padding,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::str::FromStr for GutterType {
|
impl std::str::FromStr for GutterType {
|
||||||
|
@ -450,7 +452,11 @@ impl Default for Config {
|
||||||
},
|
},
|
||||||
line_number: LineNumber::Absolute,
|
line_number: LineNumber::Absolute,
|
||||||
cursorline: false,
|
cursorline: false,
|
||||||
gutters: vec![GutterType::Diagnostics, GutterType::LineNumbers],
|
gutters: vec![
|
||||||
|
GutterType::Diagnostics,
|
||||||
|
GutterType::LineNumbers,
|
||||||
|
GutterType::Padding,
|
||||||
|
],
|
||||||
middle_click_paste: true,
|
middle_click_paste: true,
|
||||||
auto_pairs: AutoPairConfig::default(),
|
auto_pairs: AutoPairConfig::default(),
|
||||||
auto_completion: true,
|
auto_completion: true,
|
||||||
|
|
|
@ -102,6 +102,17 @@ pub fn line_numbers<'doc>(
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn padding<'doc>(
|
||||||
|
_editor: &'doc Editor,
|
||||||
|
_doc: &'doc Document,
|
||||||
|
_view: &View,
|
||||||
|
_theme: &Theme,
|
||||||
|
_is_focused: bool,
|
||||||
|
_width: usize,
|
||||||
|
) -> GutterFn<'doc> {
|
||||||
|
Box::new(|_line: usize, _selected: bool, _out: &mut String| None)
|
||||||
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
const fn abs_diff(a: usize, b: usize) -> usize {
|
const fn abs_diff(a: usize, b: usize) -> usize {
|
||||||
if a > b {
|
if a > b {
|
||||||
|
|
|
@ -75,7 +75,11 @@ pub struct View {
|
||||||
pub last_modified_docs: [Option<DocumentId>; 2],
|
pub last_modified_docs: [Option<DocumentId>; 2],
|
||||||
/// used to store previous selections of tree-sitter objects
|
/// used to store previous selections of tree-sitter objects
|
||||||
pub object_selections: Vec<Selection>,
|
pub object_selections: Vec<Selection>,
|
||||||
pub gutters: Vec<(Gutter, usize)>,
|
/// Gutter (constructor) and width of gutter, used to calculate
|
||||||
|
/// `gutter_offset`
|
||||||
|
gutters: Vec<(Gutter, usize)>,
|
||||||
|
/// cached total width of gutter
|
||||||
|
gutter_offset: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Debug for View {
|
impl fmt::Debug for View {
|
||||||
|
@ -91,12 +95,23 @@ impl fmt::Debug for View {
|
||||||
impl View {
|
impl View {
|
||||||
pub fn new(doc: DocumentId, gutter_types: Vec<crate::editor::GutterType>) -> Self {
|
pub fn new(doc: DocumentId, gutter_types: Vec<crate::editor::GutterType>) -> Self {
|
||||||
let mut gutters: Vec<(Gutter, usize)> = vec![];
|
let mut gutters: Vec<(Gutter, usize)> = vec![];
|
||||||
|
let mut gutter_offset = 0;
|
||||||
use crate::editor::GutterType;
|
use crate::editor::GutterType;
|
||||||
for gutter_type in &gutter_types {
|
for gutter_type in &gutter_types {
|
||||||
match gutter_type {
|
let width = match gutter_type {
|
||||||
GutterType::Diagnostics => gutters.push((gutter::diagnostics_or_breakpoints, 1)),
|
GutterType::Diagnostics => 1,
|
||||||
GutterType::LineNumbers => gutters.push((gutter::line_numbers, 5)),
|
GutterType::LineNumbers => 5,
|
||||||
}
|
GutterType::Padding => 1,
|
||||||
|
};
|
||||||
|
gutter_offset += width;
|
||||||
|
gutters.push((
|
||||||
|
match gutter_type {
|
||||||
|
GutterType::Diagnostics => gutter::diagnostics_or_breakpoints,
|
||||||
|
GutterType::LineNumbers => gutter::line_numbers,
|
||||||
|
GutterType::Padding => gutter::padding,
|
||||||
|
},
|
||||||
|
width as usize,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
Self {
|
Self {
|
||||||
id: ViewId::default(),
|
id: ViewId::default(),
|
||||||
|
@ -108,6 +123,7 @@ impl View {
|
||||||
last_modified_docs: [None, None],
|
last_modified_docs: [None, None],
|
||||||
object_selections: Vec::new(),
|
object_selections: Vec::new(),
|
||||||
gutters,
|
gutters,
|
||||||
|
gutter_offset,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,14 +135,12 @@ impl View {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn inner_area(&self) -> Rect {
|
pub fn inner_area(&self) -> Rect {
|
||||||
// TODO: cache this
|
// TODO add abilty to not use cached offset for runtime configurable gutter
|
||||||
let offset = self
|
self.area.clip_left(self.gutter_offset).clip_bottom(1) // -1 for statusline
|
||||||
.gutters
|
}
|
||||||
.iter()
|
|
||||||
.map(|(_, width)| *width as u16)
|
pub fn gutters(&self) -> &[(Gutter, usize)] {
|
||||||
.sum::<u16>()
|
&self.gutters
|
||||||
+ 1; // +1 for some space between gutters and line
|
|
||||||
self.area.clip_left(offset).clip_bottom(1) // -1 for statusline
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -327,7 +341,11 @@ mod tests {
|
||||||
fn test_text_pos_at_screen_coords() {
|
fn test_text_pos_at_screen_coords() {
|
||||||
let mut view = View::new(
|
let mut view = View::new(
|
||||||
DocumentId::default(),
|
DocumentId::default(),
|
||||||
vec![GutterType::Diagnostics, GutterType::LineNumbers],
|
vec![
|
||||||
|
GutterType::Diagnostics,
|
||||||
|
GutterType::LineNumbers,
|
||||||
|
GutterType::Padding,
|
||||||
|
],
|
||||||
);
|
);
|
||||||
view.area = Rect::new(40, 40, 40, 40);
|
view.area = Rect::new(40, 40, 40, 40);
|
||||||
let rope = Rope::from_str("abc\n\tdef");
|
let rope = Rope::from_str("abc\n\tdef");
|
||||||
|
@ -374,7 +392,10 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_text_pos_at_screen_coords_without_line_numbers_gutter() {
|
fn test_text_pos_at_screen_coords_without_line_numbers_gutter() {
|
||||||
let mut view = View::new(DocumentId::default(), vec![GutterType::Diagnostics]);
|
let mut view = View::new(
|
||||||
|
DocumentId::default(),
|
||||||
|
vec![GutterType::Diagnostics, GutterType::Padding],
|
||||||
|
);
|
||||||
view.area = Rect::new(40, 40, 40, 40);
|
view.area = Rect::new(40, 40, 40, 40);
|
||||||
let rope = Rope::from_str("abc\n\tdef");
|
let rope = Rope::from_str("abc\n\tdef");
|
||||||
let text = rope.slice(..);
|
let text = rope.slice(..);
|
||||||
|
@ -400,7 +421,11 @@ mod tests {
|
||||||
fn test_text_pos_at_screen_coords_cjk() {
|
fn test_text_pos_at_screen_coords_cjk() {
|
||||||
let mut view = View::new(
|
let mut view = View::new(
|
||||||
DocumentId::default(),
|
DocumentId::default(),
|
||||||
vec![GutterType::Diagnostics, GutterType::LineNumbers],
|
vec![
|
||||||
|
GutterType::Diagnostics,
|
||||||
|
GutterType::LineNumbers,
|
||||||
|
GutterType::Padding,
|
||||||
|
],
|
||||||
);
|
);
|
||||||
view.area = Rect::new(40, 40, 40, 40);
|
view.area = Rect::new(40, 40, 40, 40);
|
||||||
let rope = Rope::from_str("Hi! こんにちは皆さん");
|
let rope = Rope::from_str("Hi! こんにちは皆さん");
|
||||||
|
@ -440,7 +465,11 @@ mod tests {
|
||||||
fn test_text_pos_at_screen_coords_graphemes() {
|
fn test_text_pos_at_screen_coords_graphemes() {
|
||||||
let mut view = View::new(
|
let mut view = View::new(
|
||||||
DocumentId::default(),
|
DocumentId::default(),
|
||||||
vec![GutterType::Diagnostics, GutterType::LineNumbers],
|
vec![
|
||||||
|
GutterType::Diagnostics,
|
||||||
|
GutterType::LineNumbers,
|
||||||
|
GutterType::Padding,
|
||||||
|
],
|
||||||
);
|
);
|
||||||
view.area = Rect::new(40, 40, 40, 40);
|
view.area = Rect::new(40, 40, 40, 40);
|
||||||
let rope = Rope::from_str("Hèl̀l̀ò world!");
|
let rope = Rope::from_str("Hèl̀l̀ò world!");
|
||||||
|
|
Loading…
Reference in New Issue