mirror of
https://github.com/helix-editor/helix.git
synced 2024-11-22 09:26:19 +04:00
Merge 007f6952a8
into b8313da5a8
This commit is contained in:
commit
7b24daf171
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -1214,6 +1214,12 @@ dependencies = [
|
|||||||
"allocator-api2",
|
"allocator-api2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "heck"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "helix-core"
|
name = "helix-core"
|
||||||
version = "24.7.0"
|
version = "24.7.0"
|
||||||
@ -1367,6 +1373,7 @@ dependencies = [
|
|||||||
"futures-util",
|
"futures-util",
|
||||||
"grep-regex",
|
"grep-regex",
|
||||||
"grep-searcher",
|
"grep-searcher",
|
||||||
|
"heck",
|
||||||
"helix-core",
|
"helix-core",
|
||||||
"helix-dap",
|
"helix-dap",
|
||||||
"helix-event",
|
"helix-event",
|
||||||
|
@ -11,6 +11,7 @@ ## Keymap
|
|||||||
- [Goto mode](#goto-mode)
|
- [Goto mode](#goto-mode)
|
||||||
- [Match mode](#match-mode)
|
- [Match mode](#match-mode)
|
||||||
- [Window mode](#window-mode)
|
- [Window mode](#window-mode)
|
||||||
|
- [Case Mode](#case-mode)
|
||||||
- [Space mode](#space-mode)
|
- [Space mode](#space-mode)
|
||||||
- [Popup](#popup)
|
- [Popup](#popup)
|
||||||
- [Completion Menu](#completion-menu)
|
- [Completion Menu](#completion-menu)
|
||||||
@ -70,8 +71,6 @@ ### Changes
|
|||||||
| `r` | Replace with a character | `replace` |
|
| `r` | Replace with a character | `replace` |
|
||||||
| `R` | Replace with yanked text | `replace_with_yanked` |
|
| `R` | Replace with yanked text | `replace_with_yanked` |
|
||||||
| `~` | Switch case of the selected text | `switch_case` |
|
| `~` | Switch case of the selected text | `switch_case` |
|
||||||
| `` ` `` | Set the selected text to lower case | `switch_to_lowercase` |
|
|
||||||
| `` Alt-` `` | Set the selected text to upper case | `switch_to_uppercase` |
|
|
||||||
| `i` | Insert before selection | `insert_mode` |
|
| `i` | Insert before selection | `insert_mode` |
|
||||||
| `a` | Insert after selection (append) | `append_mode` |
|
| `a` | Insert after selection (append) | `append_mode` |
|
||||||
| `I` | Insert at the start of the line | `insert_at_line_start` |
|
| `I` | Insert at the start of the line | `insert_at_line_start` |
|
||||||
@ -170,6 +169,7 @@ ### Minor modes
|
|||||||
| ----- | ----------- | ------- |
|
| ----- | ----------- | ------- |
|
||||||
| `v` | Enter [select (extend) mode](#select--extend-mode) | `select_mode` |
|
| `v` | Enter [select (extend) mode](#select--extend-mode) | `select_mode` |
|
||||||
| `g` | Enter [goto mode](#goto-mode) | N/A |
|
| `g` | Enter [goto mode](#goto-mode) | N/A |
|
||||||
|
| ` ` ` | Enter [case mode](#case-mode) | N/A |
|
||||||
| `m` | Enter [match mode](#match-mode) | N/A |
|
| `m` | Enter [match mode](#match-mode) | N/A |
|
||||||
| `:` | Enter command mode | `command_mode` |
|
| `:` | Enter command mode | `command_mode` |
|
||||||
| `z` | Enter [view mode](#view-mode) | N/A |
|
| `z` | Enter [view mode](#view-mode) | N/A |
|
||||||
@ -233,6 +233,24 @@ #### Goto mode
|
|||||||
| `k` | Move up textual (instead of visual) line | `move_line_up` |
|
| `k` | Move up textual (instead of visual) line | `move_line_up` |
|
||||||
| `w` | Show labels at each word and select the word that belongs to the entered labels | `goto_word` |
|
| `w` | Show labels at each word and select the word that belongs to the entered labels | `goto_word` |
|
||||||
|
|
||||||
|
#### Case mode
|
||||||
|
|
||||||
|
Accessed by typing ` ` ` in [normal mode](#normal-mode).
|
||||||
|
|
||||||
|
Various functions for changing case of text in different ways.
|
||||||
|
|
||||||
|
| Key | Description | Command |
|
||||||
|
| ----- | ----------- | ------- |
|
||||||
|
| `l` | Switch all text to lowercase | `switch_to_lowercase` |
|
||||||
|
| `u` | Switch all text to UPPERCASE | `switch_to_uppercase` |
|
||||||
|
| `p` | Switch text to Pascal Case | `switch_to_pascal_case` |
|
||||||
|
| `c` | Switch text to camelCase | `switch_to_camel_case` |
|
||||||
|
| `t` | Switch text to Title Case | `switch_to_title_case` |
|
||||||
|
| `s` | Switch text to snake_case | `switch_to_snake_case` |
|
||||||
|
| `k` | Switch text to kebab-case | `switch_to_kebab_case` |
|
||||||
|
|
||||||
|
TODO: Mappings for selecting syntax nodes (a superset of `[`).
|
||||||
|
|
||||||
#### Match mode
|
#### Match mode
|
||||||
|
|
||||||
Accessed by typing `m` in [normal mode](#normal-mode).
|
Accessed by typing `m` in [normal mode](#normal-mode).
|
||||||
|
@ -35,6 +35,7 @@ helix-loader = { path = "../helix-loader" }
|
|||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
once_cell = "1.20"
|
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"] }
|
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"] }
|
tui = { path = "../helix-tui", package = "helix-tui", default-features = false, features = ["crossterm"] }
|
||||||
crossterm = { version = "0.28", features = ["event-stream"] }
|
crossterm = { version = "0.28", features = ["event-stream"] }
|
||||||
|
@ -51,6 +51,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
use anyhow::{anyhow, bail, ensure, Context as _};
|
use anyhow::{anyhow, bail, ensure, Context as _};
|
||||||
|
use heck::{ToKebabCase, ToLowerCamelCase, ToSnakeCase, ToTitleCase, ToUpperCamelCase};
|
||||||
use insert::*;
|
use insert::*;
|
||||||
use movement::Movement;
|
use movement::Movement;
|
||||||
|
|
||||||
@ -329,9 +330,14 @@ pub fn doc(&self) -> &str {
|
|||||||
extend_prev_char, "Extend to previous occurrence of char",
|
extend_prev_char, "Extend to previous occurrence of char",
|
||||||
repeat_last_motion, "Repeat last motion",
|
repeat_last_motion, "Repeat last motion",
|
||||||
replace, "Replace with new char",
|
replace, "Replace with new char",
|
||||||
switch_case, "Switch (toggle) case",
|
switch_to_alternate_case, "Switch to aLTERNATE cASE",
|
||||||
switch_to_uppercase, "Switch to uppercase",
|
switch_to_uppercase, "Switch to UPPERCASE",
|
||||||
switch_to_lowercase, "Switch to lowercase",
|
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_up, "Move page up",
|
||||||
page_down, "Move page down",
|
page_down, "Move page down",
|
||||||
half_page_up, "Move half page up",
|
half_page_up, "Move half page up",
|
||||||
@ -1713,7 +1719,15 @@ fn switch_case_impl<F>(cx: &mut Context, change_fn: F)
|
|||||||
exit_select_mode(cx);
|
exit_select_mode(cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn switch_case(cx: &mut Context) {
|
fn switch_heck_case_impl(cx: &mut Context, change_fn: impl Fn(Tendril) -> String) {
|
||||||
|
switch_case_impl(cx, |string| {
|
||||||
|
let stri = Tendril::from_iter(string.chars());
|
||||||
|
let applied = change_fn(stri);
|
||||||
|
Tendril::from_iter(applied.chars())
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn switch_to_alternate_case(cx: &mut Context) {
|
||||||
switch_case_impl(cx, |string| {
|
switch_case_impl(cx, |string| {
|
||||||
string
|
string
|
||||||
.chars()
|
.chars()
|
||||||
@ -1730,6 +1744,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) {
|
fn switch_to_uppercase(cx: &mut Context) {
|
||||||
switch_case_impl(cx, |string| {
|
switch_case_impl(cx, |string| {
|
||||||
string.chunks().map(|chunk| chunk.to_uppercase()).collect()
|
string.chunks().map(|chunk| chunk.to_uppercase()).collect()
|
||||||
|
@ -19,9 +19,16 @@ pub fn default() -> HashMap<Mode, KeyTrie> {
|
|||||||
"R" => replace_with_yanked,
|
"R" => replace_with_yanked,
|
||||||
"A-." => repeat_last_motion,
|
"A-." => repeat_last_motion,
|
||||||
|
|
||||||
"~" => switch_case,
|
"~" => switch_to_alternate_case,
|
||||||
"`" => switch_to_lowercase,
|
"`" => { "Case"
|
||||||
"A-`" => switch_to_uppercase,
|
"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,
|
"home" => goto_line_start,
|
||||||
"end" => goto_line_end,
|
"end" => goto_line_end,
|
||||||
|
Loading…
Reference in New Issue
Block a user