Merge branch 'main' into main
This commit is contained in:
commit
65b8986d30
|
@ -32,7 +32,8 @@ pub fn load_actions() -> HashMap<String, Action> {
|
||||||
("page_up", page_up),
|
("page_up", page_up),
|
||||||
("page_down", page_down),
|
("page_down", page_down),
|
||||||
("goto_line_start", goto_line_start),
|
("goto_line_start", goto_line_start),
|
||||||
("goto_line_end_newline", goto_line_end_newline),
|
("goto_line_end", goto_line_end),
|
||||||
|
("goto_first_nonwhitespace", goto_first_nonwhitespace),
|
||||||
("command_mode", command_mode),
|
("command_mode", command_mode),
|
||||||
("normal_mode", normal_mode),
|
("normal_mode", normal_mode),
|
||||||
("visual_mode", visual_mode),
|
("visual_mode", visual_mode),
|
||||||
|
@ -81,11 +82,15 @@ pub fn page_down(state: &mut State) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn goto_line_start(state: &mut State) {
|
pub fn goto_line_start(state: &mut State) {
|
||||||
state.set_error("goto_line_start is unimplemented");
|
state.cursor.column = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn goto_line_end_newline(state: &mut State) {
|
pub fn goto_line_end(state: &mut State) {
|
||||||
state.set_error("goto_line_end_newline is unimplemented");
|
state.cursor = state.buffer.cursor_at_line_end(state.cursor.line);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn goto_first_nonwhitespace(state: &mut State) {
|
||||||
|
state.cursor = state.buffer.cursor_at_first_nonwhitespace(state.cursor.line);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn command_mode(state: &mut State) {
|
pub fn command_mode(state: &mut State) {
|
||||||
|
@ -117,11 +122,13 @@ pub fn append_mode(state: &mut State) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insert_at_line_start(state: &mut State) {
|
pub fn insert_at_line_start(state: &mut State) {
|
||||||
state.set_error("insert_at_line_start is unimplemented");
|
goto_first_nonwhitespace(state);
|
||||||
|
insert_mode(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insert_at_line_end(state: &mut State) {
|
pub fn insert_at_line_end(state: &mut State) {
|
||||||
state.set_error("insert_at_line_end is unimplemented");
|
goto_line_end(state);
|
||||||
|
insert_mode(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn open_below(state: &mut State) {
|
pub fn open_below(state: &mut State) {
|
||||||
|
|
|
@ -21,11 +21,11 @@ use std::io::Write;
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use crossterm::{cursor, ExecutableCommand, QueueableCommand};
|
use crossterm::{cursor, QueueableCommand};
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use ropey::Rope;
|
use ropey::Rope;
|
||||||
use syntect::easy::ScopeRangeIterator;
|
use syntect::easy::ScopeRangeIterator;
|
||||||
use syntect::parsing::{BasicScopeStackOp, ParseState, Scope, ScopeStack, SyntaxSet};
|
use syntect::parsing::{BasicScopeStackOp, ParseState, ScopeStack, SyntaxSet};
|
||||||
|
|
||||||
use crate::theme::{Style, StyleStore};
|
use crate::theme::{Style, StyleStore};
|
||||||
use crate::{Cursor, Direction};
|
use crate::{Cursor, Direction};
|
||||||
|
@ -270,6 +270,34 @@ impl Buffer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn cursor_at_first_nonwhitespace(&self, line: usize) -> Cursor {
|
||||||
|
if let Some(line_slice) = self.text.get_line(line) {
|
||||||
|
let mut column = 0;
|
||||||
|
for c in line_slice.chars() {
|
||||||
|
if !c.is_whitespace() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
column += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Cursor { line, column }
|
||||||
|
} else {
|
||||||
|
Cursor { line, column: 0 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn cursor_at_line_end(&self, line: usize) -> Cursor {
|
||||||
|
Cursor {
|
||||||
|
line,
|
||||||
|
column: self
|
||||||
|
.text
|
||||||
|
.get_line(line)
|
||||||
|
.map(|line| line.len_chars().saturating_sub(1))
|
||||||
|
.unwrap_or(0),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
@ -47,12 +47,13 @@ impl Default for Keybinds {
|
||||||
(PageUp, page_up),
|
(PageUp, page_up),
|
||||||
(PageDown, page_down),
|
(PageDown, page_down),
|
||||||
(Home, goto_line_start),
|
(Home, goto_line_start),
|
||||||
(End, goto_line_end_newline),
|
(End, goto_line_end),
|
||||||
];
|
];
|
||||||
|
|
||||||
let goto_keys = &[
|
let goto_keys = &[
|
||||||
(Char('h'), goto_line_start as Action),
|
(Char('h'), goto_line_start as Action),
|
||||||
(Char('l'), goto_line_end_newline),
|
(Char('l'), goto_line_end),
|
||||||
|
(Char('s'), goto_first_nonwhitespace),
|
||||||
];
|
];
|
||||||
|
|
||||||
let normalish_keys = [
|
let normalish_keys = [
|
||||||
|
|
Loading…
Reference in New Issue