@@ -2671,6 +2671,56 @@ pub mod cmd {
2675+ cx: &mut compositor::Context,
2677+ _event: PromptEvent,
2678+ ) -> anyhow::Result<()> {
2679+ sort_impl(cx, args, false)
2683+ cx: &mut compositor::Context,
2685+ _event: PromptEvent,
2686+ ) -> anyhow::Result<()> {
2687+ sort_impl(cx, args, true)
2691+ cx: &mut compositor::Context,
2692+ _args: &[Cow<str>],
2694+ ) -> anyhow::Result<()> {
2695+ let (view, doc) = current!(cx.editor);
2696+ let text = doc.text().slice(..);
2698+ let selection = doc.selection(view.id);
2700+ let mut fragments: Vec<_> = selection
2702+ .map(|fragment| Tendril::from_slice(&fragment))
2705+ fragments.sort_by(match reverse {
2706+ true => |a: &Tendril, b: &Tendril| b.cmp(a),
2707+ false => |a: &Tendril, b: &Tendril| a.cmp(b),
2710+ let transaction = Transaction::change(
2715+ .map(|(s, fragment)| (s.from(), s.to(), Some(fragment))),
2718+ doc.apply(&transaction, view.id);
2719+ doc.append_changes_to_history(view.id);
2674 pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
2724 pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
2675 TypableCommand {
2725 TypableCommand {
2676 name: "quit",
2726 name: "quit",
@@ -2965,7 +3015,21 @@ pub mod cmd {
2965 doc: "Set a config option at runtime",
3015 doc: "Set a config option at runtime",
2966 fun: setting,
3016 fun: setting,
2967 completer: Some(completers::setting),
3017 completer: Some(completers::setting),
3022+ doc: "Sort ranges in selection.",
3029+ doc: "Sort ranges in selection in reverse order.",
2971 pub static TYPABLE_COMMAND_MAP: Lazy<HashMap<&'static str, &'static TypableCommand>> =
3035 pub static TYPABLE_COMMAND_MAP: Lazy<HashMap<&'static str, &'static TypableCommand>> =