Disable autoindent in visual block insert mode

This commit is contained in:
Conrad Irwin 2023-08-16 10:44:59 -06:00
parent 1b4dd49b1d
commit 7f06191c9f
6 changed files with 24 additions and 7 deletions

View file

@ -575,6 +575,7 @@ pub struct Editor {
searchable: bool, searchable: bool,
cursor_shape: CursorShape, cursor_shape: CursorShape,
collapse_matches: bool, collapse_matches: bool,
autoindent_mode: Option<AutoindentMode>,
workspace: Option<(WeakViewHandle<Workspace>, i64)>, workspace: Option<(WeakViewHandle<Workspace>, i64)>,
keymap_context_layers: BTreeMap<TypeId, KeymapContext>, keymap_context_layers: BTreeMap<TypeId, KeymapContext>,
input_enabled: bool, input_enabled: bool,
@ -1409,6 +1410,7 @@ impl Editor {
searchable: true, searchable: true,
override_text_style: None, override_text_style: None,
cursor_shape: Default::default(), cursor_shape: Default::default(),
autoindent_mode: Some(AutoindentMode::EachLine),
collapse_matches: false, collapse_matches: false,
workspace: None, workspace: None,
keymap_context_layers: Default::default(), keymap_context_layers: Default::default(),
@ -1587,6 +1589,14 @@ impl Editor {
self.input_enabled = input_enabled; self.input_enabled = input_enabled;
} }
pub fn set_autoindent(&mut self, autoindent: bool) {
if autoindent {
self.autoindent_mode = Some(AutoindentMode::EachLine);
} else {
self.autoindent_mode = None;
}
}
pub fn set_read_only(&mut self, read_only: bool) { pub fn set_read_only(&mut self, read_only: bool) {
self.read_only = read_only; self.read_only = read_only;
} }
@ -1719,7 +1729,7 @@ impl Editor {
} }
self.buffer.update(cx, |buffer, cx| { self.buffer.update(cx, |buffer, cx| {
buffer.edit(edits, Some(AutoindentMode::EachLine), cx) buffer.edit(edits, self.autoindent_mode.clone(), cx)
}); });
} }
@ -2194,7 +2204,7 @@ impl Editor {
drop(snapshot); drop(snapshot);
self.transact(cx, |this, cx| { self.transact(cx, |this, cx| {
this.buffer.update(cx, |buffer, cx| { this.buffer.update(cx, |buffer, cx| {
buffer.edit(edits, Some(AutoindentMode::EachLine), cx); buffer.edit(edits, this.autoindent_mode.clone(), cx);
}); });
let new_anchor_selections = new_selections.iter().map(|e| &e.0); let new_anchor_selections = new_selections.iter().map(|e| &e.0);
@ -2504,6 +2514,7 @@ impl Editor {
} }
pub fn insert(&mut self, text: &str, cx: &mut ViewContext<Self>) { pub fn insert(&mut self, text: &str, cx: &mut ViewContext<Self>) {
dbg!("insert!");
self.insert_with_autoindent_mode( self.insert_with_autoindent_mode(
text, text,
Some(AutoindentMode::Block { Some(AutoindentMode::Block {
@ -3003,7 +3014,7 @@ impl Editor {
this.buffer.update(cx, |buffer, cx| { this.buffer.update(cx, |buffer, cx| {
buffer.edit( buffer.edit(
ranges.iter().map(|range| (range.clone(), text)), ranges.iter().map(|range| (range.clone(), text)),
Some(AutoindentMode::EachLine), this.autoindent_mode.clone(),
cx, cx,
); );
}); });

View file

@ -364,6 +364,7 @@ impl MultiBuffer {
S: ToOffset, S: ToOffset,
T: Into<Arc<str>>, T: Into<Arc<str>>,
{ {
dbg!("edit", &autoindent_mode);
if self.buffers.borrow().is_empty() { if self.buffers.borrow().is_empty() {
return; return;
} }

View file

@ -90,6 +90,10 @@ impl VimState {
) )
} }
pub fn should_autoindent(&self) -> bool {
!(self.mode == Mode::Insert && self.last_mode == Mode::VisualBlock)
}
pub fn clip_at_line_ends(&self) -> bool { pub fn clip_at_line_ends(&self) -> bool {
match self.mode { match self.mode {
Mode::Insert | Mode::Visual | Mode::VisualLine | Mode::VisualBlock => false, Mode::Insert | Mode::Visual | Mode::VisualLine | Mode::VisualBlock => false,

View file

@ -520,6 +520,5 @@ fn encode_ranges(text: &str, point_ranges: &Vec<Range<Point>>) -> String {
byte_range byte_range
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let ret = util::test::generate_marked_text(text, &byte_ranges[..], true); util::test::generate_marked_text(text, &byte_ranges[..], true);
ret
} }

View file

@ -339,6 +339,7 @@ impl Vim {
editor.set_clip_at_line_ends(state.clip_at_line_ends(), cx); editor.set_clip_at_line_ends(state.clip_at_line_ends(), cx);
editor.set_collapse_matches(true); editor.set_collapse_matches(true);
editor.set_input_enabled(!state.vim_controlled()); editor.set_input_enabled(!state.vim_controlled());
editor.set_autoindent(state.should_autoindent());
editor.selections.line_mode = matches!(state.mode, Mode::VisualLine); editor.selections.line_mode = matches!(state.mode, Mode::VisualLine);
let context_layer = state.keymap_context_layer(); let context_layer = state.keymap_context_layer();
editor.set_keymap_context_layer::<Self>(context_layer, cx); editor.set_keymap_context_layer::<Self>(context_layer, cx);
@ -355,6 +356,7 @@ impl Vim {
editor.set_cursor_shape(CursorShape::Bar, cx); editor.set_cursor_shape(CursorShape::Bar, cx);
editor.set_clip_at_line_ends(false, cx); editor.set_clip_at_line_ends(false, cx);
editor.set_input_enabled(true); editor.set_input_enabled(true);
editor.set_autoindent(true);
editor.selections.line_mode = false; editor.selections.line_mode = false;
// we set the VimEnabled context on all editors so that we // we set the VimEnabled context on all editors so that we

View file

@ -192,7 +192,7 @@ pub fn visual_block_motion(
let start = map.clip_point(DisplayPoint::new(row, columns.start), Bias::Left); let start = map.clip_point(DisplayPoint::new(row, columns.start), Bias::Left);
let end = map.clip_point(DisplayPoint::new(row, columns.end), Bias::Left); let end = map.clip_point(DisplayPoint::new(row, columns.end), Bias::Left);
if columns.start <= map.line_len(row) { if columns.start <= map.line_len(row) {
let mut selection = Selection { let selection = Selection {
id: s.new_selection_id(), id: s.new_selection_id(),
start: start.to_point(map), start: start.to_point(map),
end: end.to_point(map), end: end.to_point(map),
@ -392,7 +392,7 @@ pub fn paste(_: &mut Workspace, _: &VisualPaste, cx: &mut ViewContext<Workspace>
linewise = all_selections_were_entire_line; linewise = all_selections_were_entire_line;
} }
let selection = selection.clone(); let mut selection = selection.clone();
if !selection.reversed { if !selection.reversed {
let adjusted = selection.end; let adjusted = selection.end;
// If the selection is empty, move both the start and end forward one // If the selection is empty, move both the start and end forward one