@@ -186,6 +186,9 @@ impl Command {
186186 extend_till_prev_char,
187187 extend_prev_char,
188188 replace,
189+ switch_case,
190+ switch_to_uppercase,
191+ switch_to_lowercase,
189192 page_up,
190193 page_down,
191194 half_page_up,
@@ -780,6 +783,57 @@ fn replace(cx: &mut Context) {
780783 })
781784}
782785
786+fn switch_case(cx: &mut Context) {
787+ let (view, doc) = current!(cx.editor);
788+ let transaction =
789+ Transaction::change_by_selection(doc.text(), doc.selection(view.id), |range| {
790+ let text: Tendril = range
791+ .fragment(doc.text().slice(..))
792+ .chars()
793+ .flat_map(|ch| {
794+ if ch.is_lowercase() {
795+ ch.to_uppercase().collect()
796+ } else if ch.is_uppercase() {
797+ ch.to_lowercase().collect()
798+ } else {
799+ vec![ch]
800+ }
801+ })
802+ .collect();
803+
804+ (range.from(), range.to() + 1, Some(text))
805+ });
806+
807+ doc.apply(&transaction, view.id);
808+ doc.append_changes_to_history(view.id);
809+}
810+
811+fn switch_to_uppercase(cx: &mut Context) {
812+ let (view, doc) = current!(cx.editor);
813+ let transaction =
814+ Transaction::change_by_selection(doc.text(), doc.selection(view.id), |range| {
815+ let text: Tendril = range.fragment(doc.text().slice(..)).to_uppercase().into();
816+
817+ (range.from(), range.to() + 1, Some(text))
818+ });
819+
820+ doc.apply(&transaction, view.id);
821+ doc.append_changes_to_history(view.id);
822+}
823+
824+fn switch_to_lowercase(cx: &mut Context) {
825+ let (view, doc) = current!(cx.editor);
826+ let transaction =
827+ Transaction::change_by_selection(doc.text(), doc.selection(view.id), |range| {
828+ let text: Tendril = range.fragment(doc.text().slice(..)).to_lowercase().into();
829+
830+ (range.from(), range.to() + 1, Some(text))
831+ });
832+
833+ doc.apply(&transaction, view.id);
834+ doc.append_changes_to_history(view.id);
835+}
836+
783837fn scroll(cx: &mut Context, offset: usize, direction: Direction) {
784838 use Direction::*;
785839 let (view, doc) = current!(cx.editor);