feat(editor): start implementing is_word_boundary_left_vim for vim-like word detection
This commit is contained in:
parent
952a75530e
commit
21540af8ef
1 changed files with 63 additions and 1 deletions
|
@ -1939,6 +1939,68 @@ pub const Editor = struct {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_not_word_char_vim(c: []const u8) bool {
|
||||||
|
if (c.len == 0) return true;
|
||||||
|
return switch (c[0]) {
|
||||||
|
'=' => true,
|
||||||
|
'"' => true,
|
||||||
|
'\'' => true,
|
||||||
|
'\t' => true,
|
||||||
|
'\n' => true,
|
||||||
|
'/' => true,
|
||||||
|
'\\' => true,
|
||||||
|
'*' => true,
|
||||||
|
':' => true,
|
||||||
|
'.' => true,
|
||||||
|
',' => true,
|
||||||
|
'(' => true,
|
||||||
|
')' => true,
|
||||||
|
'{' => true,
|
||||||
|
'}' => true,
|
||||||
|
'[' => true,
|
||||||
|
']' => true,
|
||||||
|
';' => true,
|
||||||
|
'|' => true,
|
||||||
|
'!' => true,
|
||||||
|
'?' => true,
|
||||||
|
'&' => true,
|
||||||
|
'-' => true,
|
||||||
|
'<' => true,
|
||||||
|
'>' => true,
|
||||||
|
else => false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_non_word_char_at_cursor_vim(root: Buffer.Root, cursor: *const Cursor, metrics: Buffer.Metrics) bool {
|
||||||
|
return cursor.test_at(root, is_not_word_char_vim, metrics);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_white_space(c: []const u8) bool {
|
||||||
|
if (c.len == 0) return true;
|
||||||
|
return switch (c[0]) {
|
||||||
|
' ' => true,
|
||||||
|
else => false
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_white_space_at_cursor(root: Buffer.Root, cursor: *const Cursor, metrics: Buffer.Metrics) bool {
|
||||||
|
return cursor.test_at(root, is_white_space, metrics);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_word_boundary_left_vim(root: Buffer.Root, cursor: *const Cursor, metrics: Buffer.Metrics) bool {
|
||||||
|
if(is_white_space_at_cursor(root, cursor, metrics)) return false;
|
||||||
|
var next = cursor.*;
|
||||||
|
next.move_left(root, metrics) catch return true;
|
||||||
|
|
||||||
|
// right now this doesn't work
|
||||||
|
// ["enter_vim_mode"], abc
|
||||||
|
// jumping from the last " forward once using this command goes to the end of the line
|
||||||
|
// it should go to the start of abc
|
||||||
|
const curr_is_non_word = is_non_word_char_at_cursor_vim(root, cursor, metrics);
|
||||||
|
const prev_is_non_word = is_non_word_char_at_cursor_vim(root, &next, metrics);
|
||||||
|
return curr_is_non_word != prev_is_non_word;
|
||||||
|
}
|
||||||
|
|
||||||
fn is_non_word_boundary_left(root: Buffer.Root, cursor: *const Cursor, metrics: Buffer.Metrics) bool {
|
fn is_non_word_boundary_left(root: Buffer.Root, cursor: *const Cursor, metrics: Buffer.Metrics) bool {
|
||||||
if (cursor.col == 0)
|
if (cursor.col == 0)
|
||||||
return true;
|
return true;
|
||||||
|
@ -2575,7 +2637,7 @@ pub const Editor = struct {
|
||||||
|
|
||||||
pub fn move_cursor_word_right_vim(root: Buffer.Root, cursor: *Cursor, metrics: Buffer.Metrics) error{Stop}!void {
|
pub fn move_cursor_word_right_vim(root: Buffer.Root, cursor: *Cursor, metrics: Buffer.Metrics) error{Stop}!void {
|
||||||
try move_cursor_right(root, cursor, metrics);
|
try move_cursor_right(root, cursor, metrics);
|
||||||
move_cursor_right_until(root, cursor, is_word_boundary_left, metrics);
|
move_cursor_right_until(root, cursor, is_word_boundary_left_vim, metrics);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn move_cursor_word_right_space(root: Buffer.Root, cursor: *Cursor, metrics: Buffer.Metrics) error{Stop}!void {
|
pub fn move_cursor_word_right_space(root: Buffer.Root, cursor: *Cursor, metrics: Buffer.Metrics) error{Stop}!void {
|
||||||
|
|
Loading…
Add table
Reference in a new issue