vim: add guu gUU g~~ g/ (#12789)

Conrad Irwin created

Release Notes:

- vim: Add `g/` for project search

Change summary

assets/keymaps/vim.json           | 22 ++++++++++++++++++++++
crates/gpui/src/keymap/context.rs |  4 ++--
docs/src/vim.md                   |  2 ++
3 files changed, 26 insertions(+), 2 deletions(-)

Detailed changes

assets/keymaps/vim.json 🔗

@@ -80,6 +80,7 @@
       "g shift-e": ["vim::PreviousWordEnd", { "ignorePunctuation": true }],
 
       "/": "vim::Search",
+      "g /": "pane::DeploySearch",
       "?": [
         "vim::Search",
         {
@@ -433,6 +434,27 @@
       "d": "vim::CurrentLine"
     }
   },
+  {
+    "context": "Editor && vim_operator == gu",
+    "bindings": {
+      "g u": "vim::CurrentLine",
+      "u": "vim::CurrentLine"
+    }
+  },
+  {
+    "context": "Editor && vim_operator == gU",
+    "bindings": {
+      "g shift-u": "vim::CurrentLine",
+      "shift-u": "vim::CurrentLine"
+    }
+  },
+  {
+    "context": "Editor && vim_operator == g~",
+    "bindings": {
+      "g ~": "vim::CurrentLine",
+      "~": "vim::CurrentLine"
+    }
+  },
   {
     "context": "Editor && vim_mode == normal && vim_operator == d",
     "bindings": {

crates/gpui/src/keymap/context.rs 🔗

@@ -295,7 +295,7 @@ impl KeyBindingContextPredicate {
             }
             _ if is_identifier_char(next) => {
                 let len = source
-                    .find(|c: char| !is_identifier_char(c))
+                    .find(|c: char| !is_identifier_char(c) && !is_vim_operator_char(c))
                     .unwrap_or(source.len());
                 let (identifier, rest) = source.split_at(len);
                 source = skip_whitespace(rest);
@@ -356,7 +356,7 @@ fn is_identifier_char(c: char) -> bool {
 }
 
 fn is_vim_operator_char(c: char) -> bool {
-    c == '>' || c == '<'
+    c == '>' || c == '<' || c == '~'
 }
 
 fn skip_whitespace(source: &str) -> &str {

docs/src/vim.md 🔗

@@ -48,12 +48,14 @@ g <   The same, but backwards
 g a   Add a visual selection for every copy of the current word
 
 # Pane management
+g /        Open a project-wide search
 g <space>  Open the current search excerpt
 <ctrl-w> <space>  Open the current search excerpt in a split
 <ctrl-w> g d      Go to definition in a split
 <ctrl-w> g D      Go to type definition in a split
 
 # Insert mode
+i a / a a      Select the function argument the cursor is in
 ctrl-x ctrl-o  Open the completion menu
 ctrl-x ctrl-c  Request GitHub Copilot suggestion (if configured)
 ctrl-x ctrl-a  Open the inline AI assistant (if configured)