Add primitive auto indent

This commit is contained in:
Jeremy Soller 2023-11-16 08:59:43 -07:00
parent 1207fd6d80
commit 7d21045b2f
No known key found for this signature in database
GPG key ID: DCFCA852D3906975
4 changed files with 50 additions and 1 deletions

View file

@ -23,6 +23,7 @@ pub struct Editor {
cursor_x_opt: Option<i32>,
select_opt: Option<Cursor>,
cursor_moved: bool,
auto_indent: bool,
tab_width: u16,
change: Option<Change>,
}
@ -36,6 +37,7 @@ impl Editor {
cursor_x_opt: None,
select_opt: None,
cursor_moved: false,
auto_indent: false,
tab_width: 4,
change: None,
}
@ -258,6 +260,14 @@ impl Edit for Editor {
}
}
fn auto_indent(&self) -> bool {
self.auto_indent
}
fn set_auto_indent(&mut self, auto_indent: bool) {
self.auto_indent = auto_indent;
}
fn tab_width(&self) -> u16 {
self.tab_width
}
@ -596,7 +606,24 @@ impl Edit for Editor {
}
}
Action::Enter => {
self.insert_string("\n", None);
//TODO: what about indenting more after opening brackets or parentheses?
if self.auto_indent {
let mut string = String::from("\n");
{
let line = &self.buffer.lines[self.cursor.line];
let text = line.text();
for c in text.chars() {
if c.is_whitespace() {
string.push(c);
} else {
break;
}
}
}
self.insert_string(&string, None);
} else {
self.insert_string("\n", None);
}
// Ensure line is properly shaped and laid out (for potential immediate commands)
self.buffer.line_layout(font_system, self.cursor.line);

View file

@ -164,6 +164,12 @@ pub trait Edit {
/// Set the current selection position
fn set_select_opt(&mut self, select_opt: Option<Cursor>);
/// Get the current automatic indentation setting
fn auto_indent(&self) -> bool;
/// Enable or disable automatic indentation
fn set_auto_indent(&mut self, auto_indent: bool);
/// Get the current tab width
fn tab_width(&self) -> u16;

View file

@ -166,6 +166,14 @@ impl<'a> Edit for SyntaxEditor<'a> {
self.editor.set_select_opt(select_opt);
}
fn auto_indent(&self) -> bool {
self.editor.auto_indent()
}
fn set_auto_indent(&mut self, auto_indent: bool) {
self.editor.set_auto_indent(auto_indent);
}
fn tab_width(&self) -> u16 {
self.editor.tab_width()
}

View file

@ -272,6 +272,14 @@ impl<'a> Edit for ViEditor<'a> {
self.editor.set_select_opt(select_opt);
}
fn auto_indent(&self) -> bool {
self.editor.auto_indent()
}
fn set_auto_indent(&mut self, auto_indent: bool) {
self.editor.set_auto_indent(auto_indent);
}
fn tab_width(&self) -> u16 {
self.editor.tab_width()
}