Merge pull request #1543 from zed-industries/terminal-mode-keymaps

Mikayla Maki created

Removed debugs, added keymap contexts to terminal

Change summary

crates/terminal/src/connected_el.rs   |  1 
crates/terminal/src/connected_view.rs | 79 ++++++++++++++++++++++++++++
crates/terminal/src/mappings/mouse.rs |  1 
crates/terminal/src/terminal.rs       |  1 
4 files changed, 77 insertions(+), 5 deletions(-)

Detailed changes

crates/terminal/src/connected_el.rs 🔗

@@ -505,7 +505,6 @@ impl TerminalEl {
             //This cannot be done conditionally for unknown reasons. Pending drag and drop rework.
             //This also does not fire on right-mouse-down-move events wild.
             .on_move(move |event, cx| {
-                dbg!(event);
                 if cx.is_parent_view_focused() {
                     if let Some(conn_handle) = connection.upgrade(cx.app) {
                         conn_handle.update(cx.app, |terminal, cx| {

crates/terminal/src/connected_view.rs 🔗

@@ -39,7 +39,7 @@ actions!(
         Clear,
         Copy,
         Paste,
-        ShowCharacterPalette
+        ShowCharacterPalette,
     ]
 );
 impl_internal_actions!(project_panel, [DeployContextMenu]);
@@ -364,11 +364,86 @@ impl View for ConnectedView {
         });
     }
 
-    fn keymap_context(&self, _: &gpui::AppContext) -> gpui::keymap::Context {
+    fn keymap_context(&self, cx: &gpui::AppContext) -> gpui::keymap::Context {
         let mut context = Self::default_keymap_context();
         if self.modal {
             context.set.insert("ModalTerminal".into());
         }
+        let mode = self.terminal.read(cx).last_mode;
+        context.map.insert(
+            "screen".to_string(),
+            (if mode.contains(TermMode::ALT_SCREEN) {
+                "alt"
+            } else {
+                "normal"
+            })
+            .to_string(),
+        );
+
+        if mode.contains(TermMode::APP_CURSOR) {
+            context.set.insert("DECCKM".to_string());
+        }
+        if mode.contains(TermMode::APP_KEYPAD) {
+            context.set.insert("DECPAM".to_string());
+        }
+        //Note the ! here
+        if !mode.contains(TermMode::APP_KEYPAD) {
+            context.set.insert("DECPNM".to_string());
+        }
+        if mode.contains(TermMode::SHOW_CURSOR) {
+            context.set.insert("DECTCEM".to_string());
+        }
+        if mode.contains(TermMode::LINE_WRAP) {
+            context.set.insert("DECAWM".to_string());
+        }
+        if mode.contains(TermMode::ORIGIN) {
+            context.set.insert("DECOM".to_string());
+        }
+        if mode.contains(TermMode::INSERT) {
+            context.set.insert("IRM".to_string());
+        }
+        //LNM is apparently the name for this. https://vt100.net/docs/vt510-rm/LNM.html
+        if mode.contains(TermMode::LINE_FEED_NEW_LINE) {
+            context.set.insert("LNM".to_string());
+        }
+        if mode.contains(TermMode::FOCUS_IN_OUT) {
+            context.set.insert("report_focus".to_string());
+        }
+        if mode.contains(TermMode::ALTERNATE_SCROLL) {
+            context.set.insert("alternate_scroll".to_string());
+        }
+        if mode.contains(TermMode::BRACKETED_PASTE) {
+            context.set.insert("bracketed_paste".to_string());
+        }
+        if mode.intersects(TermMode::MOUSE_MODE) {
+            context.set.insert("any_mouse_reporting".to_string());
+        }
+        {
+            let mouse_reporting = if mode.contains(TermMode::MOUSE_REPORT_CLICK) {
+                "click"
+            } else if mode.contains(TermMode::MOUSE_DRAG) {
+                "drag"
+            } else if mode.contains(TermMode::MOUSE_MOTION) {
+                "motion"
+            } else {
+                "off"
+            };
+            context
+                .map
+                .insert("mouse_reporting".to_string(), mouse_reporting.to_string());
+        }
+        {
+            let format = if mode.contains(TermMode::SGR_MOUSE) {
+                "sgr"
+            } else if mode.contains(TermMode::UTF8_MOUSE) {
+                "utf8"
+            } else {
+                "normal"
+            };
+            context
+                .map
+                .insert("mouse_format".to_string(), format.to_string());
+        }
         context
     }
 }

crates/terminal/src/mappings/mouse.rs 🔗

@@ -166,7 +166,6 @@ pub fn mouse_button_report(
 
 pub fn mouse_moved_report(point: Point, e: &MouseMovedEvent, mode: TermMode) -> Option<Vec<u8>> {
     let button = MouseButton::from_move(e);
-    dbg!(&button);
 
     if !button.is_other() && mode.intersects(TermMode::MOUSE_MOTION | TermMode::MOUSE_DRAG) {
         //Only drags are reported in drag mode, so block NoneMove.

crates/terminal/src/terminal.rs 🔗

@@ -627,7 +627,6 @@ impl Terminal {
     }
 
     pub fn mouse_move(&mut self, e: &MouseMovedEvent, origin: Vector2F) {
-        dbg!("term mouse_move");
         let position = e.position.sub(origin);
 
         let point = mouse_point(position, self.cur_size, self.last_offset);