editor_events.rs

 1use editor::{EditorBlurred, EditorCreated, EditorFocused, EditorMode, EditorReleased};
 2use gpui::MutableAppContext;
 3
 4use crate::{state::Mode, Vim};
 5
 6pub fn init(cx: &mut MutableAppContext) {
 7    cx.subscribe_global(editor_created).detach();
 8    cx.subscribe_global(editor_focused).detach();
 9    cx.subscribe_global(editor_blurred).detach();
10    cx.subscribe_global(editor_released).detach();
11}
12
13fn editor_created(EditorCreated(editor): &EditorCreated, cx: &mut MutableAppContext) {
14    cx.update_default_global(|vim: &mut Vim, cx| {
15        vim.editors.insert(editor.id(), editor.downgrade());
16        vim.sync_vim_settings(cx);
17    })
18}
19
20fn editor_focused(EditorFocused(editor): &EditorFocused, cx: &mut MutableAppContext) {
21    Vim::update(cx, |vim, cx| {
22        vim.active_editor = Some(editor.downgrade());
23        vim.selection_subscription = Some(cx.subscribe(editor, |editor, event, cx| {
24            if editor.read(cx).leader_replica_id().is_none() {
25                if let editor::Event::SelectionsChanged { local: true } = event {
26                    let newest_empty = editor.read(cx).selections.newest::<usize>(cx).is_empty();
27                    editor_local_selections_changed(newest_empty, cx);
28                }
29            }
30        }));
31
32        if !vim.enabled {
33            return;
34        }
35
36        let editor = editor.read(cx);
37        if editor.selections.newest::<usize>(cx).is_empty() {
38            if editor.mode() != EditorMode::Full {
39                vim.switch_mode(Mode::Insert, cx);
40            }
41        } else {
42            vim.switch_mode(Mode::Visual { line: false }, cx);
43        }
44    });
45}
46
47fn editor_blurred(EditorBlurred(editor): &EditorBlurred, cx: &mut MutableAppContext) {
48    Vim::update(cx, |vim, cx| {
49        if let Some(previous_editor) = vim.active_editor.clone() {
50            if previous_editor == editor.clone() {
51                vim.active_editor = None;
52            }
53        }
54        vim.sync_vim_settings(cx);
55    })
56}
57
58fn editor_released(EditorReleased(editor): &EditorReleased, cx: &mut MutableAppContext) {
59    cx.update_default_global(|vim: &mut Vim, _| {
60        vim.editors.remove(&editor.id());
61        if let Some(previous_editor) = vim.active_editor.clone() {
62            if previous_editor == editor.clone() {
63                vim.active_editor = None;
64            }
65        }
66    });
67}
68
69fn editor_local_selections_changed(newest_empty: bool, cx: &mut MutableAppContext) {
70    Vim::update(cx, |vim, cx| {
71        if vim.enabled && vim.state.mode == Mode::Normal && !newest_empty {
72            vim.switch_mode(Mode::Visual { line: false }, cx)
73        }
74    })
75}