mirror of https://github.com/helix-editor/helix
Merge 32013b13e3
into 4281228da3
commit
48ee1be2a2
|
@ -4184,14 +4184,22 @@ pub mod insert {
|
|||
|
||||
pub fn insert_tab(cx: &mut Context) {
|
||||
let (view, doc) = current!(cx.editor);
|
||||
// TODO: round out to nearest indentation level (for example a line with 3 spaces should
|
||||
// indent by one to reach 4 spaces).
|
||||
|
||||
let indent = Tendril::from(doc.indent_style.as_str());
|
||||
let transaction = Transaction::insert(
|
||||
let transaction = Transaction::change(
|
||||
doc.text(),
|
||||
&doc.selection(view.id).clone().cursors(doc.text().slice(..)),
|
||||
indent,
|
||||
doc.selection(view.id).ranges().iter().map(|range| {
|
||||
let indent = if let IndentStyle::Spaces(indent_width) = doc.indent_style {
|
||||
let line = range.cursor_line(doc.text().slice(..));
|
||||
let line_start = doc.text().line_to_char(line);
|
||||
let offset = (range.head - line_start) % indent_width as usize;
|
||||
|
||||
Tendril::from(doc.indent_style.as_str()).split_off(offset)
|
||||
} else {
|
||||
Tendril::from(doc.indent_style.as_str())
|
||||
};
|
||||
|
||||
(range.head, range.head, Some(indent))
|
||||
}),
|
||||
);
|
||||
doc.apply(&transaction, view.id);
|
||||
}
|
||||
|
@ -4877,7 +4885,16 @@ fn indent(cx: &mut Context) {
|
|||
return None;
|
||||
}
|
||||
let pos = doc.text().line_to_char(line);
|
||||
Some((pos, pos, Some(indent.clone())))
|
||||
|
||||
let indent = if let IndentStyle::Spaces(indent_width) = doc.indent_style {
|
||||
let line = doc.text().line(line);
|
||||
let offset = line.first_non_whitespace_char().unwrap_or(0) % indent_width as usize;
|
||||
indent.clone().split_off(offset)
|
||||
} else {
|
||||
indent.clone()
|
||||
};
|
||||
|
||||
Some((pos, pos, Some(indent)))
|
||||
}),
|
||||
);
|
||||
doc.apply(&transaction, view.id);
|
||||
|
|
|
@ -583,3 +583,59 @@ async fn test_jump_undo_redo() -> anyhow::Result<()> {
|
|||
.await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "multi_thread")]
|
||||
async fn test_indent_with_spaces() -> anyhow::Result<()> {
|
||||
let tests = vec![
|
||||
// at start of line
|
||||
(
|
||||
indoc! {"\
|
||||
SELECT *
|
||||
#[|FROM table]#
|
||||
#(|WHERE condition)#
|
||||
"},
|
||||
"i<tab>",
|
||||
indoc! {"\
|
||||
SELECT *
|
||||
#[|FROM table]#
|
||||
#(|WHERE condition)#
|
||||
"},
|
||||
),
|
||||
// in the middle of line
|
||||
(
|
||||
indoc! {"\
|
||||
SELECT #[*|]#
|
||||
FROM #(table|)#
|
||||
WHERE #(condition|)#
|
||||
"},
|
||||
"i<S-tab>",
|
||||
indoc! {"\
|
||||
SELECT #[|*]#
|
||||
FROM #(|table)#
|
||||
WHERE #(|condition)#
|
||||
"},
|
||||
),
|
||||
// indentation in normal mode
|
||||
(
|
||||
indoc! {"\
|
||||
-- comment
|
||||
#[|SELECT *
|
||||
FROM table
|
||||
WHERE condition]#
|
||||
"},
|
||||
"<gt>",
|
||||
indoc! {"\
|
||||
-- comment
|
||||
#[|SELECT *
|
||||
FROM table
|
||||
WHERE condition]#
|
||||
"},
|
||||
),
|
||||
];
|
||||
|
||||
for test in tests {
|
||||
test_with_config(AppBuilder::new().with_file("foo.rs", None), test).await?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -437,7 +437,7 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> {
|
|||
let result = if true {
|
||||
#[|\"yes\"\n]#
|
||||
} else {
|
||||
\"no #(|\"\n)#
|
||||
\"no #(|\"\n)#
|
||||
}
|
||||
}
|
||||
"},
|
||||
|
|
Loading…
Reference in New Issue