editor mode in editor.rs
Co-authored-by: Oleksiy Syvokon <oleksiy.syvokon@gmail.com>
This commit is contained in:
parent
854b7e104e
commit
57a0bb327d
10 changed files with 89 additions and 18 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -415,6 +415,7 @@ dependencies = [
|
|||
"urlencoding",
|
||||
"util",
|
||||
"uuid",
|
||||
"vim_mode_setting",
|
||||
"watch",
|
||||
"workspace",
|
||||
"workspace-hack",
|
||||
|
@ -5115,6 +5116,7 @@ dependencies = [
|
|||
"url",
|
||||
"util",
|
||||
"uuid",
|
||||
"vim_mode_setting",
|
||||
"workspace",
|
||||
"workspace-hack",
|
||||
"zed_actions",
|
||||
|
|
|
@ -100,6 +100,7 @@ watch.workspace = true
|
|||
workspace-hack.workspace = true
|
||||
workspace.workspace = true
|
||||
zed_actions.workspace = true
|
||||
vim_mode_setting.workspace = true
|
||||
|
||||
[dev-dependencies]
|
||||
acp_thread = { workspace = true, features = ["test-support"] }
|
||||
|
|
|
@ -114,6 +114,18 @@ pub(crate) fn create_editor(
|
|||
let editor = cx.new(|cx| {
|
||||
let buffer = cx.new(|cx| Buffer::local("", cx).with_language(Arc::new(language), cx));
|
||||
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
|
||||
let settings = agent_settings::AgentSettings::get_global(cx);
|
||||
|
||||
let editor_mode = match settings.editor_mode {
|
||||
agent_settings::AgentEditorMode::Vim => vim_mode_setting::EditorMode::Vim,
|
||||
agent_settings::AgentEditorMode::VimInsert => vim_mode_setting::EditorMode::VimInsert,
|
||||
agent_settings::AgentEditorMode::Helix => vim_mode_setting::EditorMode::Helix,
|
||||
agent_settings::AgentEditorMode::Default => vim_mode_setting::EditorMode::Default,
|
||||
agent_settings::AgentEditorMode::Inherit => {
|
||||
vim_mode_setting::EditorModeSetting::get_global(cx).0
|
||||
}
|
||||
};
|
||||
|
||||
let mut editor = Editor::new(
|
||||
editor::EditorMode::AutoHeight {
|
||||
min_lines,
|
||||
|
@ -128,6 +140,7 @@ pub(crate) fn create_editor(
|
|||
editor.set_show_indent_guides(false, cx);
|
||||
editor.set_soft_wrap();
|
||||
editor.set_use_modal_editing(true);
|
||||
editor.set_default_editor_mode(editor_mode);
|
||||
editor.set_context_menu_options(ContextMenuOptions {
|
||||
min_entries_visible: 12,
|
||||
max_entries_visible: 12,
|
||||
|
|
|
@ -92,6 +92,7 @@ uuid.workspace = true
|
|||
workspace.workspace = true
|
||||
zed_actions.workspace = true
|
||||
workspace-hack.workspace = true
|
||||
vim_mode_setting.workspace = true
|
||||
|
||||
[dev-dependencies]
|
||||
ctor.workspace = true
|
||||
|
|
|
@ -165,6 +165,7 @@ use project::{
|
|||
};
|
||||
use rand::{seq::SliceRandom, thread_rng};
|
||||
use rpc::{ErrorCode, ErrorExt, proto::PeerId};
|
||||
use schemars::JsonSchema;
|
||||
use scroll::{Autoscroll, OngoingScroll, ScrollAnchor, ScrollManager, ScrollbarAutoHide};
|
||||
use selections_collection::{
|
||||
MutableSelectionsCollection, SelectionsCollection, resolve_selections,
|
||||
|
@ -201,6 +202,7 @@ use ui::{
|
|||
IconSize, Indicator, Key, Tooltip, h_flex, prelude::*,
|
||||
};
|
||||
use util::{RangeExt, ResultExt, TryFutureExt, maybe, post_inc};
|
||||
use vim_mode_setting::EditorModeSetting;
|
||||
use workspace::{
|
||||
CollaboratorId, Item as WorkspaceItem, ItemId, ItemNavHistory, OpenInTerminal, OpenTerminal,
|
||||
RestoreOnStartupBehavior, SERIALIZATION_THROTTLE_TIME, SplitDirection, TabBarSettings, Toast,
|
||||
|
@ -1092,7 +1094,6 @@ pub struct Editor {
|
|||
autoindent_mode: Option<AutoindentMode>,
|
||||
workspace: Option<(WeakEntity<Workspace>, Option<WorkspaceId>)>,
|
||||
input_enabled: bool,
|
||||
use_modal_editing: bool,
|
||||
read_only: bool,
|
||||
leader_id: Option<CollaboratorId>,
|
||||
remote_id: Option<ViewId>,
|
||||
|
@ -1180,6 +1181,39 @@ pub struct Editor {
|
|||
next_color_inlay_id: usize,
|
||||
colors: Option<LspColorData>,
|
||||
folding_newlines: Task<()>,
|
||||
default_editor_mode: vim_mode_setting::EditorMode,
|
||||
// editor_mode: EditorMode, <-- while init define which editor,
|
||||
|
||||
// agenty subscribe to agen settings
|
||||
//
|
||||
// editor <- agent
|
||||
//
|
||||
// settings listent to event emitted by editor,
|
||||
//
|
||||
|
||||
// agent will set_editor_mode(AgentPanelSettings::read("editor_mode")) on init
|
||||
// vim.rs will get_editor_mode() on init / activate / register
|
||||
//
|
||||
// match editor_mode {
|
||||
// // which setting to use
|
||||
// }
|
||||
//
|
||||
//
|
||||
|
||||
// editor_mode: EditorMode, <-- while init define which editor,
|
||||
// pros -> jsut set enum
|
||||
// cons -> actual setting check lives in either editor.rs or vim.rs??
|
||||
//
|
||||
// set_edutr();
|
||||
//
|
||||
// Fn () -> weather mode this editor is, and what;s the default value?
|
||||
// pros -> all setting lives in agent, git.
|
||||
// cons -> if someone wants to use agent setting in their editor, they need to copy paste code
|
||||
//
|
||||
// // agent.rs
|
||||
// set_vim_setting_fn(|| {
|
||||
// // edito seting agnet
|
||||
// });
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
|
||||
|
@ -2258,6 +2292,7 @@ impl Editor {
|
|||
mode,
|
||||
selection_drag_state: SelectionDragState::None,
|
||||
folding_newlines: Task::ready(()),
|
||||
default_editor_mode: vim_mode_setting::EditorMode::default(),
|
||||
};
|
||||
|
||||
if is_minimap {
|
||||
|
@ -2994,12 +3029,12 @@ impl Editor {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn set_use_modal_editing(&mut self, to: bool) {
|
||||
self.use_modal_editing = to;
|
||||
pub fn set_default_editor_mode(&mut self, to: vim_mode_setting::EditorMode) {
|
||||
self.default_editor_mode = to;
|
||||
}
|
||||
|
||||
pub fn use_modal_editing(&self) -> bool {
|
||||
self.use_modal_editing
|
||||
pub fn default_editor_mode(&self) -> vim_mode_setting::EditorMode {
|
||||
self.default_editor_mode
|
||||
}
|
||||
|
||||
fn selections_did_change(
|
||||
|
|
|
@ -332,7 +332,10 @@ fn render_base_keymap_section(tab_index: &mut isize, cx: &mut App) -> impl IntoE
|
|||
|
||||
fn render_vim_mode_switch(tab_index: &mut isize, cx: &mut App) -> impl IntoElement {
|
||||
let editor_mode = EditorModeSetting::get_global(cx).0;
|
||||
let toggle_state = if matches!(editor_mode, EditorMode::Vim | EditorMode::Helix) {
|
||||
let toggle_state = if matches!(
|
||||
editor_mode,
|
||||
EditorMode::Vim | EditorMode::Helix | EditorMode::VimInsert
|
||||
) {
|
||||
ui::ToggleState::Selected
|
||||
} else {
|
||||
ui::ToggleState::Unselected
|
||||
|
|
|
@ -454,6 +454,10 @@ impl Vim {
|
|||
return;
|
||||
}
|
||||
|
||||
if editor.default_editor_mode() == EditorMode::Default {
|
||||
return;
|
||||
}
|
||||
|
||||
let mut was_enabled = Vim::enabled(cx);
|
||||
let mut was_toggle = VimSettings::get_global(cx).toggle_relative_line_numbers;
|
||||
cx.observe_global_in::<SettingsStore>(window, move |editor, window, cx| {
|
||||
|
@ -489,7 +493,9 @@ impl Vim {
|
|||
fn activate(editor: &mut Editor, window: &mut Window, cx: &mut Context<Editor>) {
|
||||
let vim = Vim::new(window, cx);
|
||||
|
||||
if !editor.mode().is_full() {
|
||||
let default_editor_mode = editor.default_editor_mode();
|
||||
|
||||
if default_editor_mode == EditorMode::VimInsert {
|
||||
vim.update(cx, |vim, _| {
|
||||
vim.mode = Mode::Insert;
|
||||
});
|
||||
|
@ -499,14 +505,18 @@ impl Vim {
|
|||
entity: vim.clone(),
|
||||
});
|
||||
|
||||
vim.update(cx, |_, cx| {
|
||||
Vim::action(editor, cx, |vim, _: &SwitchToNormalMode, window, cx| {
|
||||
if matches!(EditorModeSetting::get_global(cx).0, EditorMode::Helix) {
|
||||
vim.switch_mode(Mode::HelixNormal, false, window, cx)
|
||||
} else {
|
||||
vim.switch_mode(Mode::Normal, false, window, cx)
|
||||
}
|
||||
});
|
||||
vim.update(cx, move |_, cx| {
|
||||
Vim::action(
|
||||
editor,
|
||||
cx,
|
||||
move |vim, _: &SwitchToNormalMode, window, cx| {
|
||||
if matches!(default_editor_mode, EditorMode::Helix) {
|
||||
vim.switch_mode(Mode::HelixNormal, false, window, cx)
|
||||
} else {
|
||||
vim.switch_mode(Mode::Normal, false, window, cx)
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
Vim::action(editor, cx, |vim, _: &SwitchToInsertMode, window, cx| {
|
||||
vim.switch_mode(Mode::Insert, false, window, cx)
|
||||
|
@ -827,8 +837,10 @@ impl Vim {
|
|||
if EditorModeSetting::get_global(cx).0 == EditorMode::Default {
|
||||
return false;
|
||||
}
|
||||
|
||||
// check for agent.editor_mode
|
||||
//
|
||||
return true;
|
||||
// VimModeSetting::get_global(cx).0 || HelixModeSetting::get_global(cx).0
|
||||
}
|
||||
|
||||
/// Called whenever an keystroke is typed so vim can observe all actions
|
||||
|
|
|
@ -23,6 +23,7 @@ pub struct EditorModeSetting(pub EditorMode);
|
|||
#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Default)]
|
||||
pub enum EditorMode {
|
||||
Vim,
|
||||
VimInsert,
|
||||
Helix,
|
||||
#[default]
|
||||
Default,
|
||||
|
|
|
@ -1495,7 +1495,7 @@ pub fn load_default_keymap(cx: &mut App) {
|
|||
|
||||
if matches!(
|
||||
EditorModeSetting::get_global(cx).0,
|
||||
EditorMode::Vim | EditorMode::Helix
|
||||
EditorMode::Vim | EditorMode::Helix | EditorMode::VimInsert
|
||||
) {
|
||||
cx.bind_keys(
|
||||
KeymapFile::load_asset(VIM_KEYMAP_PATH, Some(KeybindSource::Vim), cx).unwrap(),
|
||||
|
|
|
@ -302,7 +302,10 @@ impl Render for QuickActionBar {
|
|||
let editor = editor.downgrade();
|
||||
let editor_settings_dropdown = {
|
||||
let editor_mode = EditorModeSetting::get_global(cx).0;
|
||||
let vim_mode_enabled = matches!(editor_mode, EditorMode::Vim | EditorMode::Helix);
|
||||
let vim_mode_enabled = matches!(
|
||||
editor_mode,
|
||||
EditorMode::Vim | EditorMode::Helix | EditorMode::VimInsert
|
||||
);
|
||||
|
||||
PopoverMenu::new("editor-settings")
|
||||
.trigger_with_tooltip(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue