Skip to content

Commit

Permalink
Added to_uppercase and to_lowercase
Browse files Browse the repository at this point in the history
Renamed change_case to switch_case.
  • Loading branch information
Cor committed Jul 14, 2021
1 parent 1223606 commit 6561f6f
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 19 deletions.
71 changes: 53 additions & 18 deletions helix-term/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,9 @@ impl Command {
extend_till_prev_char,
extend_prev_char,
replace,
change_case,
switch_case,
to_uppercase,
to_lowercase,
page_up,
page_down,
half_page_up,
Expand Down Expand Up @@ -781,29 +783,62 @@ fn replace(cx: &mut Context) {
})
}

fn change_case(cx: &mut Context) {
fn switch_case(cx: &mut Context) {
let (view, doc) = current!(cx.editor);
let transaction =
Transaction::change_by_selection(doc.text(), doc.selection(view.id), |range| {
let max_to = rope_end_without_line_ending(&doc.text().slice(..));
let to = std::cmp::min(max_to, range.to() + 1);
let text: String = RopeGraphemes::new(doc.text().slice(range.from()..to))
.map(|g| {
let mut buffer: String = String::with_capacity(g.len_bytes());
g.chars().for_each(|ch| {
if ch.is_lowercase() {
buffer.extend(ch.to_uppercase());
} else if ch.is_uppercase() {
buffer.extend(ch.to_lowercase());
} else {
buffer.push(ch);
}
});
buffer
let text: Tendril = range
.fragment(doc.text().slice(..))
.chars()
.map(|ch| {
if ch.is_lowercase() {
ch.to_uppercase().collect()
} else if ch.is_uppercase() {
ch.to_lowercase().collect()
} else {
vec![ch]
}
})
.flatten()
.collect();

(range.from(), range.to() + 1, Some(text))
});

doc.apply(&transaction, view.id);
doc.append_changes_to_history(view.id);
}

fn to_uppercase(cx: &mut Context) {
let (view, doc) = current!(cx.editor);
let transaction =
Transaction::change_by_selection(doc.text(), doc.selection(view.id), |range| {
let text: Tendril = range
.fragment(doc.text().slice(..))
.chars()
.map(|ch| ch.to_uppercase())
.flatten()
.collect();

(range.from(), range.to() + 1, Some(text))
});

doc.apply(&transaction, view.id);
doc.append_changes_to_history(view.id);
}

fn to_lowercase(cx: &mut Context) {
let (view, doc) = current!(cx.editor);
let transaction =
Transaction::change_by_selection(doc.text(), doc.selection(view.id), |range| {
let text: Tendril = range
.fragment(doc.text().slice(..))
.chars()
.map(|ch| ch.to_lowercase())
.flatten()
.collect();

(range.from(), to, Some(text.into()))
(range.from(), range.to() + 1, Some(text))
});

doc.apply(&transaction, view.id);
Expand Down
5 changes: 4 additions & 1 deletion helix-term/src/keymap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,12 @@ impl Default for Keymaps {
// and matching set for select mode (extend)
//
key!('r') => Command::replace,
key!('~') => Command::change_case,
key!('R') => Command::replace_with_yanked,

key!('~') => Command::switch_case,
key!('`') => Command::to_uppercase,
alt!('`') => Command::to_lowercase,

key!(Home) => Command::goto_line_start,
key!(End) => Command::goto_line_end,

Expand Down

0 comments on commit 6561f6f

Please sign in to comment.