From d0a3ae8a90ce44c6036112b38a8f84217885b6c8 Mon Sep 17 00:00:00 2001 From: Nikita Revenco <154856872+nikitarevenco@users.noreply.github.com> Date: Sat, 9 Nov 2024 16:32:22 +0000 Subject: [PATCH] feat: add commands for working with different cases --- Cargo.lock | 1 + helix-term/Cargo.toml | 1 + helix-term/src/commands.rs | 30 ++++++++++++++++++++++++++++-- helix-term/src/keymap/default.rs | 13 ++++++++++--- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 68ad11249..586fb4ba7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1469,6 +1469,7 @@ dependencies = [ "futures-util", "grep-regex", "grep-searcher", + "heck", "helix-core", "helix-dap", "helix-event", diff --git a/helix-term/Cargo.toml b/helix-term/Cargo.toml index bbad37f07..1f959e48c 100644 --- a/helix-term/Cargo.toml +++ b/helix-term/Cargo.toml @@ -53,6 +53,7 @@ helix-loader = { path = "../helix-loader" } anyhow = "1" once_cell = "1.20" +heck = "0.5" tokio = { version = "1", features = ["rt", "rt-multi-thread", "io-util", "io-std", "time", "process", "macros", "fs", "parking_lot"] } tui = { path = "../helix-tui", package = "helix-tui", default-features = false, features = ["crossterm"] } crossterm = { version = "0.28", features = ["event-stream"] } diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index a197792ef..9b3013c8d 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -54,6 +54,7 @@ use helix_view::{ }; use anyhow::{anyhow, bail, ensure, Context as _}; +use heck::{ToKebabCase, ToLowerCamelCase, ToSnakeCase, ToTitleCase, ToUpperCamelCase}; use insert::*; use movement::Movement; @@ -352,9 +353,14 @@ impl MappableCommand { extend_prev_char, "Extend to previous occurrence of char", repeat_last_motion, "Repeat last motion", replace, "Replace with new char", - switch_case, "Switch (toggle) case", - switch_to_uppercase, "Switch to uppercase", + switch_to_alternate_case, "Switch to aLTERNATE cASE", + switch_to_uppercase, "Switch to UPPERCASE", switch_to_lowercase, "Switch to lowercase", + switch_to_pascal_case, "Switch to PascalCase", + switch_to_camel_case, "Switch to camelCase", + switch_to_title_case, "Switch to Title Case", + switch_to_snake_case, "Switch to snake_case", + switch_to_kebab_case, "Switch to kebab-case", page_up, "Move page up", page_down, "Move page down", half_page_up, "Move half page up", @@ -1773,6 +1779,26 @@ fn switch_case(cx: &mut Context) { }); } +fn switch_to_pascal_case(cx: &mut Context) { + switch_heck_case_impl(cx, |str| str.to_upper_camel_case()) +} + +fn switch_to_camel_case(cx: &mut Context) { + switch_heck_case_impl(cx, |str| str.to_lower_camel_case()) +} + +fn switch_to_title_case(cx: &mut Context) { + switch_heck_case_impl(cx, |str| str.to_title_case()) +} + +fn switch_to_snake_case(cx: &mut Context) { + switch_heck_case_impl(cx, |str| str.to_snake_case()) +} + +fn switch_to_kebab_case(cx: &mut Context) { + switch_heck_case_impl(cx, |str| str.to_kebab_case()) +} + fn switch_to_uppercase(cx: &mut Context) { switch_case_impl(cx, |string| { string.chunks().map(|chunk| chunk.to_uppercase()).collect() diff --git a/helix-term/src/keymap/default.rs b/helix-term/src/keymap/default.rs index e160b2246..af66f364d 100644 --- a/helix-term/src/keymap/default.rs +++ b/helix-term/src/keymap/default.rs @@ -19,9 +19,16 @@ pub fn default() -> HashMap { "R" => replace_with_yanked, "A-." => repeat_last_motion, - "~" => switch_case, - "`" => switch_to_lowercase, - "A-`" => switch_to_uppercase, + "~" => switch_to_alternate_case, + "`" => { "Case" + "l" => switch_to_lowercase, + "u" => switch_to_uppercase, + "p" => switch_to_pascal_case, + "c" => switch_to_camel_case, + "t" => switch_to_title_case, + "s" => switch_to_snake_case, + "k" => switch_to_kebab_case, + }, "home" => goto_line_start, "end" => goto_line_end,