vim: Add Smart Relative Line Number (#16567)
Closes #16514 Release Notes: - Added Vim: absolute numbering in any mode except `insert` mode --------- Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
This commit is contained in:
parent
26d943287b
commit
9662829810
7 changed files with 96 additions and 6 deletions
|
@ -23,8 +23,8 @@ use editor::{
|
|||
Anchor, Bias, Editor, EditorEvent, EditorMode, ToPoint,
|
||||
};
|
||||
use gpui::{
|
||||
actions, impl_actions, Action, AppContext, EventEmitter, KeyContext, KeystrokeEvent, Render,
|
||||
View, ViewContext, WeakView,
|
||||
actions, impl_actions, Action, AppContext, Entity, EventEmitter, KeyContext, KeystrokeEvent,
|
||||
Render, View, ViewContext, WeakView,
|
||||
};
|
||||
use insert::NormalBefore;
|
||||
use language::{CursorShape, Point, Selection, SelectionGoal, TransactionId};
|
||||
|
@ -228,8 +228,21 @@ impl Vim {
|
|||
}
|
||||
|
||||
let mut was_enabled = Vim::enabled(cx);
|
||||
let mut was_toggle = VimSettings::get_global(cx).toggle_relative_line_numbers;
|
||||
cx.observe_global::<SettingsStore>(move |editor, cx| {
|
||||
let enabled = Vim::enabled(cx);
|
||||
let toggle = VimSettings::get_global(cx).toggle_relative_line_numbers;
|
||||
if enabled && was_enabled && (toggle != was_toggle) {
|
||||
if toggle {
|
||||
let is_relative = editor
|
||||
.addon::<VimAddon>()
|
||||
.map(|vim| vim.view.read(cx).mode != Mode::Insert);
|
||||
editor.set_relative_line_number(is_relative, cx)
|
||||
} else {
|
||||
editor.set_relative_line_number(None, cx)
|
||||
}
|
||||
}
|
||||
was_toggle = VimSettings::get_global(cx).toggle_relative_line_numbers;
|
||||
if was_enabled == enabled {
|
||||
return;
|
||||
}
|
||||
|
@ -296,6 +309,7 @@ impl Vim {
|
|||
editor.set_autoindent(true);
|
||||
editor.selections.line_mode = false;
|
||||
editor.unregister_addon::<VimAddon>();
|
||||
editor.set_relative_line_number(None, cx)
|
||||
}
|
||||
|
||||
/// Register an action on the editor.
|
||||
|
@ -424,6 +438,17 @@ impl Vim {
|
|||
// Sync editor settings like clip mode
|
||||
self.sync_vim_settings(cx);
|
||||
|
||||
if VimSettings::get_global(cx).toggle_relative_line_numbers {
|
||||
if self.mode != self.last_mode {
|
||||
if self.mode == Mode::Insert || self.last_mode == Mode::Insert {
|
||||
self.update_editor(cx, |vim, editor, cx| {
|
||||
let is_relative = vim.mode != Mode::Insert;
|
||||
editor.set_relative_line_number(Some(is_relative), cx)
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if leave_selections {
|
||||
return;
|
||||
}
|
||||
|
@ -616,6 +641,24 @@ impl Vim {
|
|||
|
||||
cx.emit(VimEvent::Focused);
|
||||
self.sync_vim_settings(cx);
|
||||
|
||||
if VimSettings::get_global(cx).toggle_relative_line_numbers {
|
||||
if let Some(old_vim) = Vim::globals(cx).focused_vim() {
|
||||
if old_vim.entity_id() != cx.view().entity_id() {
|
||||
old_vim.update(cx, |vim, cx| {
|
||||
vim.update_editor(cx, |_, editor, cx| {
|
||||
editor.set_relative_line_number(None, cx)
|
||||
});
|
||||
});
|
||||
|
||||
self.update_editor(cx, |vim, editor, cx| {
|
||||
let is_relative = vim.mode != Mode::Insert;
|
||||
editor.set_relative_line_number(Some(is_relative), cx)
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Vim::globals(cx).focused_vim = Some(cx.view().downgrade());
|
||||
}
|
||||
|
||||
fn blurred(&mut self, cx: &mut ViewContext<Self>) {
|
||||
|
@ -1039,6 +1082,7 @@ pub enum UseSystemClipboard {
|
|||
|
||||
#[derive(Deserialize)]
|
||||
struct VimSettings {
|
||||
pub toggle_relative_line_numbers: bool,
|
||||
pub use_system_clipboard: UseSystemClipboard,
|
||||
pub use_multiline_find: bool,
|
||||
pub use_smartcase_find: bool,
|
||||
|
@ -1047,6 +1091,7 @@ struct VimSettings {
|
|||
|
||||
#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
|
||||
struct VimSettingsContent {
|
||||
pub toggle_relative_line_numbers: Option<bool>,
|
||||
pub use_system_clipboard: Option<UseSystemClipboard>,
|
||||
pub use_multiline_find: Option<bool>,
|
||||
pub use_smartcase_find: Option<bool>,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue