@@ -28,7 +28,7 @@ use insert::*;
2828use movement::Movement;
2929
3030use crate::{
31− compositor::{Callback, Component, Compositor},
31+ compositor::{self, Callback, Component, Compositor},
3232 ui::{self, Completion, Picker, Popup, Prompt, PromptEvent},
3333};
3434
@@ -1032,30 +1032,32 @@ mod cmd {
10321032 pub alias: Option<&'static str>,
10331033 pub doc: &'static str,
10341034 // params, flags, helper, completer
1035− pub fun: fn(&mut Editor, &[&str], PromptEvent),
1035+ pub fun: fn(&mut compositor::Context, &[&str], PromptEvent),
10361036 pub completer: Option<Completer>,
10371037 }
10381038
1039− fn quit(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1039+ fn quit(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
10401040 // last view and we have unsaved changes
1041− if editor.tree.views().count() == 1 && buffers_remaining_impl(editor) {
1041+ if cx.editor.tree.views().count() == 1 && buffers_remaining_impl(cx.editor) {
10421042 return;
10431043 }
1044− editor.close(view!(editor).id, /* close_buffer */ false);
1044+ cx.editor
1045+ .close(view!(cx.editor).id, /* close_buffer */ false);
10451046 }
10461047
1047− fn force_quit(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1048− editor.close(view!(editor).id, /* close_buffer */ false);
1048+ fn force_quit(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
1049+ cx.editor
1050+ .close(view!(cx.editor).id, /* close_buffer */ false);
10491051 }
10501052
1051− fn open(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1053+ fn open(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
10521054 match args.get(0) {
10531055 Some(path) => {
10541056 // TODO: handle error
1055− editor.open(path.into(), Action::Replace);
1057+ cx.editor.open(path.into(), Action::Replace);
10561058 }
10571059 None => {
1058− editor.set_error("wrong argument count".to_string());
1060+ cx.editor.set_error("wrong argument count".to_string());
10591061 }
10601062 };
10611063 }
@@ -1086,30 +1088,30 @@ mod cmd {
10861088 Ok(())
10871089 }
10881090
1089− fn write(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1090− let (view, doc) = current!(editor);
1091+ fn write(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
1092+ let (view, doc) = current!(cx.editor);
10911093 if let Err(e) = write_impl(view, doc, args.first()) {
1092− editor.set_error(e.to_string());
1094+ cx.editor.set_error(e.to_string());
10931095 };
10941096 }
10951097
1096− fn new_file(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1097− editor.new_file(Action::Replace);
1098+ fn new_file(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
1099+ cx.editor.new_file(Action::Replace);
10981100 }
10991101
1100− fn format(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1101− let (view, doc) = current!(editor);
1102+ fn format(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
1103+ let (view, doc) = current!(cx.editor);
11021104
11031105 doc.format(view.id)
11041106 }
11051107
1106− fn set_indent_style(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1108+ fn set_indent_style(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
11071109 use IndentStyle::*;
11081110
11091111 // If no argument, report current indent style.
11101112 if args.is_empty() {
1111− let style = current!(editor).1.indent_style;
1112− editor.set_status(match style {
1113+ let style = current!(cx.editor).1.indent_style;
1114+ cx.editor.set_status(match style {
11131115 Tabs => "tabs".into(),
11141116 Spaces(1) => "1 space".into(),
11151117 Spaces(n) if (2..=8).contains(&n) => format!("{} spaces", n),
@@ -1131,22 +1133,23 @@ mod cmd {
11311133 };
11321134
11331135 if let Some(s) = style {
1134− let doc = doc_mut!(editor);
1136+ let doc = doc_mut!(cx.editor);
11351137 doc.indent_style = s;
11361138 } else {
11371139 // Invalid argument.
1138− editor.set_error(format!("invalid indent style '{}'", args[0],));
1140+ cx.editor
1141+ .set_error(format!("invalid indent style '{}'", args[0],));
11391142 }
11401143 }
11411144
11421145 /// Sets or reports the current document's line ending setting.
1143− fn set_line_ending(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1146+ fn set_line_ending(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
11441147 use LineEnding::*;
11451148
11461149 // If no argument, report current line ending setting.
11471150 if args.is_empty() {
1148− let line_ending = current!(editor).1.line_ending;
1149− editor.set_status(match line_ending {
1151+ let line_ending = current!(cx.editor).1.line_ending;
1152+ cx.editor.set_status(match line_ending {
11501153 Crlf => "crlf".into(),
11511154 LF => "line feed".into(),
11521155 FF => "form feed".into(),
@@ -1171,49 +1174,50 @@ mod cmd {
11711174 };
11721175
11731176 if let Some(le) = line_ending {
1174− doc_mut!(editor).line_ending = le;
1177+ doc_mut!(cx.editor).line_ending = le;
11751178 } else {
11761179 // Invalid argument.
1177− editor.set_error(format!("invalid line ending '{}'", args[0],));
1180+ cx.editor
1181+ .set_error(format!("invalid line ending '{}'", args[0],));
11781182 }
11791183 }
11801184
1181− fn earlier(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1185+ fn earlier(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
11821186 let uk = match args.join(" ").parse::<helix_core::history::UndoKind>() {
11831187 Ok(uk) => uk,
11841188 Err(msg) => {
1185− editor.set_error(msg);
1189+ cx.editor.set_error(msg);
11861190 return;
11871191 }
11881192 };
1189− let (view, doc) = current!(editor);
1193+ let (view, doc) = current!(cx.editor);
11901194 doc.earlier(view.id, uk)
11911195 }
11921196
1193− fn later(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1197+ fn later(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
11941198 let uk = match args.join(" ").parse::<helix_core::history::UndoKind>() {
11951199 Ok(uk) => uk,
11961200 Err(msg) => {
1197− editor.set_error(msg);
1201+ cx.editor.set_error(msg);
11981202 return;
11991203 }
12001204 };
1201− let (view, doc) = current!(editor);
1205+ let (view, doc) = current!(cx.editor);
12021206 doc.later(view.id, uk)
12031207 }
12041208
1205− fn write_quit(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1206− let (view, doc) = current!(editor);
1209+ fn write_quit(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
1210+ let (view, doc) = current!(cx.editor);
12071211 if let Err(e) = write_impl(view, doc, args.first()) {
1208− editor.set_error(e.to_string());
1212+ cx.editor.set_error(e.to_string());
12091213 return;
12101214 };
1211− quit(editor, &[], event)
1215+ quit(cx, &[], event)
12121216 }
12131217
1214− fn force_write_quit(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1215− write(editor, args, event);
1216− force_quit(editor, &[], event);
1218+ fn force_write_quit(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
1219+ write(cx, args, event);
1220+ force_quit(cx, &[], event);
12171221 }
12181222
12191223 /// Returns `true` if there are modified buffers remaining and sets editor error,
@@ -1273,16 +1277,16 @@ mod cmd {
12731277 }
12741278 }
12751279
1276− fn write_all(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1277− write_all_impl(editor, args, event, false, false)
1280+ fn write_all(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
1281+ write_all_impl(&mut cx.editor, args, event, false, false)
12781282 }
12791283
1280− fn write_all_quit(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1281− write_all_impl(editor, args, event, true, false)
1284+ fn write_all_quit(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
1285+ write_all_impl(&mut cx.editor, args, event, true, false)
12821286 }
12831287
1284− fn force_write_all_quit(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1285− write_all_impl(editor, args, event, true, true)
1288+ fn force_write_all_quit(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
1289+ write_all_impl(&mut cx.editor, args, event, true, true)
12861290 }
12871291
12881292 fn quit_all_impl(editor: &mut Editor, args: &[&str], event: PromptEvent, force: bool) {
@@ -1297,50 +1301,50 @@ mod cmd {
12971301 }
12981302 }
12991303
1300− fn quit_all(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1301− quit_all_impl(editor, args, event, false)
1304+ fn quit_all(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
1305+ quit_all_impl(&mut cx.editor, args, event, false)
13021306 }
13031307
1304− fn force_quit_all(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1305− quit_all_impl(editor, args, event, true)
1308+ fn force_quit_all(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
1309+ quit_all_impl(&mut cx.editor, args, event, true)
13061310 }
13071311
1308− fn theme(editor: &mut Editor, args: &[&str], event: PromptEvent) {
1312+ fn theme(cx: &mut compositor::Context, args: &[&str], event: PromptEvent) {
13091313 let theme = if let Some(theme) = args.first() {
13101314 theme
13111315 } else {
1312− editor.set_error("theme name not provided".into());
1316+ cx.editor.set_error("theme name not provided".into());
13131317 return;
13141318 };
13151319
1316− editor.set_theme_from_name(theme);
1320+ cx.editor.set_theme_from_name(theme);
13171321 }
13181322
1319− fn yank_main_selection_to_clipboard(editor: &mut Editor, _: &[&str], _: PromptEvent) {
1320− yank_main_selection_to_clipboard_impl(editor);
1323+ fn yank_main_selection_to_clipboard(cx: &mut compositor::Context, _: &[&str], _: PromptEvent) {
1324+ yank_main_selection_to_clipboard_impl(&mut cx.editor);
13211325 }
13221326
1323− fn yank_joined_to_clipboard(editor: &mut Editor, args: &[&str], _: PromptEvent) {
1324− let (_, doc) = current!(editor);
1327+ fn yank_joined_to_clipboard(cx: &mut compositor::Context, args: &[&str], _: PromptEvent) {
1328+ let (_, doc) = current!(cx.editor);
13251329 let separator = args
13261330 .first()
13271331 .copied()
13281332 .unwrap_or_else(|| doc.line_ending.as_str());
1329− yank_joined_to_clipboard_impl(editor, separator);
1333+ yank_joined_to_clipboard_impl(&mut cx.editor, separator);
13301334 }
13311335
1332− fn paste_clipboard_after(editor: &mut Editor, _: &[&str], _: PromptEvent) {
1333− paste_clipboard_impl(editor, Paste::After);
1336+ fn paste_clipboard_after(cx: &mut compositor::Context, _: &[&str], _: PromptEvent) {
1337+ paste_clipboard_impl(&mut cx.editor, Paste::After);
13341338 }
13351339
1336− fn paste_clipboard_before(editor: &mut Editor, _: &[&str], _: PromptEvent) {
1337− paste_clipboard_impl(editor, Paste::After);
1340+ fn paste_clipboard_before(cx: &mut compositor::Context, _: &[&str], _: PromptEvent) {
1341+ paste_clipboard_impl(&mut cx.editor, Paste::After);
13381342 }
13391343
1340− fn replace_selections_with_clipboard(editor: &mut Editor, _: &[&str], _: PromptEvent) {
1341− let (view, doc) = current!(editor);
1344+ fn replace_selections_with_clipboard(cx: &mut compositor::Context, _: &[&str], _: PromptEvent) {
1345+ let (view, doc) = current!(cx.editor);
13421346
1343− match editor.clipboard_provider.get_contents() {
1347+ match cx.editor.clipboard_provider.get_contents() {
13441348 Ok(contents) => {
13451349 let transaction =
13461350 Transaction::change_by_selection(doc.text(), doc.selection(view.id), |range| {
@@ -1356,8 +1360,9 @@ mod cmd {
13561360 }
13571361 }
13581362
1359− fn show_clipboard_provider(editor: &mut Editor, _: &[&str], _: PromptEvent) {
1360− editor.set_status(editor.clipboard_provider.name().into());
1363+ fn show_clipboard_provider(cx: &mut compositor::Context, _: &[&str], _: PromptEvent) {
1364+ cx.editor
1365+ .set_status(cx.editor.clipboard_provider.name().into());
13611366 }
13621367
13631368 fn change_current_directory(editor: &mut Editor, args: &[&str], _: PromptEvent) {
@@ -1633,7 +1638,7 @@ fn command_mode(cx: &mut Context) {
16331638 }
16341639 }
16351640 }, // completion
1636− move |editor: &mut Editor, input: &str, event: PromptEvent| {
1641+ move |cx: &mut compositor::Context, input: &str, event: PromptEvent| {
16371642 use helix_view::editor::Action;
16381643
16391644 if event != PromptEvent::Validate {
@@ -1646,9 +1651,10 @@ fn command_mode(cx: &mut Context) {
16461651 }
16471652
16481653 if let Some(cmd) = cmd::COMMANDS.get(parts[0]) {
1649− (cmd.fun)(editor, &parts[1..], event);
1654+ (cmd.fun)(cx, &parts[1..], event);
16501655 } else {
1651− editor.set_error(format!("no such command: '{}'", parts[0]));
1656+ cx.editor
1657+ .set_error(format!("no such command: '{}'", parts[0]));
16521658 };
16531659 },
16541660 );