allow configuring smart tab to always trigger completion instead

pull/10537/head
Jesse Luehrs 7 months ago
parent 35b6aef5fb
commit 2cb1462005

@ -3759,7 +3759,7 @@ pub mod insert {
} }
use helix_core::auto_pairs; use helix_core::auto_pairs;
use helix_view::editor::SmartTabConfig; use helix_view::editor::{SmartTabConfig, SmartTabMode};
pub fn insert_char(cx: &mut Context, c: char) { pub fn insert_char(cx: &mut Context, c: char) {
let (view, doc) = current_ref!(cx.editor); let (view, doc) = current_ref!(cx.editor);
@ -3784,10 +3784,10 @@ pub mod insert {
let (view, doc) = current_ref!(cx.editor); let (view, doc) = current_ref!(cx.editor);
let view_id = view.id; let view_id = view.id;
if matches!( if let Some(SmartTabConfig {
cx.editor.config().smart_tab, enable: true, mode, ..
Some(SmartTabConfig { enable: true, .. }) }) = &cx.editor.config().smart_tab
) { {
let cursors_after_whitespace = doc.selection(view_id).ranges().iter().all(|range| { let cursors_after_whitespace = doc.selection(view_id).ranges().iter().all(|range| {
let cursor = range.cursor(doc.text().slice(..)); let cursor = range.cursor(doc.text().slice(..));
let current_line_num = doc.text().char_to_line(cursor); let current_line_num = doc.text().char_to_line(cursor);
@ -3797,7 +3797,10 @@ pub mod insert {
}); });
if !cursors_after_whitespace { if !cursors_after_whitespace {
move_parent_node_end(cx); match mode {
SmartTabMode::MoveParentNodeEnd => move_parent_node_end(cx),
SmartTabMode::Completion => completion(cx),
}
return; return;
} }
} }

@ -13,6 +13,7 @@ use helix_lsp::lsp;
use helix_lsp::util::pos_to_lsp_pos; use helix_lsp::util::pos_to_lsp_pos;
use helix_stdx::rope::RopeSliceExt; use helix_stdx::rope::RopeSliceExt;
use helix_view::document::{Mode, SavePoint}; use helix_view::document::{Mode, SavePoint};
use helix_view::editor::{SmartTabConfig, SmartTabMode};
use helix_view::handlers::lsp::CompletionEvent; use helix_view::handlers::lsp::CompletionEvent;
use helix_view::{DocumentId, Editor, ViewId}; use helix_view::{DocumentId, Editor, ViewId};
use tokio::sync::mpsc::Sender; use tokio::sync::mpsc::Sender;
@ -415,6 +416,20 @@ fn completion_post_command_hook(
name: "delete_char_backward", name: "delete_char_backward",
.. ..
} => update_completions(cx, None), } => update_completions(cx, None),
MappableCommand::Static {
name: "smart_tab", ..
} => {
if !matches!(
cx.editor.config().smart_tab,
Some(SmartTabConfig {
enable: true,
mode: SmartTabMode::Completion,
..
})
) {
clear_completions(cx)
}
}
_ => clear_completions(cx), _ => clear_completions(cx),
} }
} else { } else {
@ -438,6 +453,22 @@ fn completion_post_command_hook(
name: "completion" | "insert_mode" | "append_mode", name: "completion" | "insert_mode" | "append_mode",
.. ..
} => return Ok(()), } => return Ok(()),
MappableCommand::Static {
name: "smart_tab", ..
} => {
if matches!(
cx.editor.config().smart_tab,
Some(SmartTabConfig {
enable: true,
mode: SmartTabMode::Completion,
..
})
) {
return Ok(());
} else {
CompletionEvent::Cancel
}
}
_ => CompletionEvent::Cancel, _ => CompletionEvent::Cancel,
}; };
send_blocking(tx, event); send_blocking(tx, event);

@ -274,6 +274,7 @@ impl<T: Item + 'static> Component for Menu<T> {
Some(SmartTabConfig { Some(SmartTabConfig {
enable: true, enable: true,
supersede_menu: true, supersede_menu: true,
..
}) })
) )
{ {

@ -343,6 +343,7 @@ pub struct Config {
pub struct SmartTabConfig { pub struct SmartTabConfig {
pub enable: bool, pub enable: bool,
pub supersede_menu: bool, pub supersede_menu: bool,
pub mode: SmartTabMode,
} }
impl Default for SmartTabConfig { impl Default for SmartTabConfig {
@ -350,10 +351,18 @@ impl Default for SmartTabConfig {
SmartTabConfig { SmartTabConfig {
enable: true, enable: true,
supersede_menu: false, supersede_menu: false,
mode: SmartTabMode::MoveParentNodeEnd,
} }
} }
} }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Eq, PartialOrd, Ord)]
#[serde(rename_all = "kebab-case")]
pub enum SmartTabMode {
MoveParentNodeEnd,
Completion,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default, rename_all = "kebab-case", deny_unknown_fields)] #[serde(default, rename_all = "kebab-case", deny_unknown_fields)]
pub struct TerminalConfig { pub struct TerminalConfig {

Loading…
Cancel
Save