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:
0x2CA 2024-08-27 11:17:21 +08:00 committed by GitHub
parent 26d943287b
commit 9662829810
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 96 additions and 6 deletions

View file

@ -9,7 +9,9 @@ use crate::{UseSystemClipboard, Vim, VimSettings};
use collections::HashMap;
use command_palette_hooks::{CommandPaletteFilter, CommandPaletteInterceptor};
use editor::{Anchor, ClipboardSelection, Editor};
use gpui::{Action, AppContext, BorrowAppContext, ClipboardEntry, ClipboardItem, Global};
use gpui::{
Action, AppContext, BorrowAppContext, ClipboardEntry, ClipboardItem, Global, View, WeakView,
};
use language::Point;
use serde::{Deserialize, Serialize};
use settings::{Settings, SettingsStore};
@ -160,6 +162,8 @@ pub struct VimGlobals {
pub last_yank: Option<SharedString>,
pub registers: HashMap<char, Register>,
pub recordings: HashMap<char, Vec<ReplayableAction>>,
pub focused_vim: Option<WeakView<Vim>>,
}
impl Global for VimGlobals {}
@ -373,6 +377,10 @@ impl VimGlobals {
);
}
}
pub fn focused_vim(&self) -> Option<View<Vim>> {
self.focused_vim.as_ref().and_then(|vim| vim.upgrade())
}
}
impl Vim {

View file

@ -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>,