Skip to content

Commit

Permalink
Simplify implementation of add_indent_level.
Browse files Browse the repository at this point in the history
Increase hybrid indent heuristic attempt limit to 4.
Clarify the fallback logic in indent heuristic docs.
  • Loading branch information
Triton171 committed Oct 15, 2023
1 parent 7dfdba8 commit 1808fc5
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 12 deletions.
2 changes: 1 addition & 1 deletion book/src/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ Its settings will be merged with the configuration directory `config.toml` and t
| `workspace-lsp-roots` | Directories relative to the workspace root that are treated as LSP roots. Should only be set in `.helix/config.toml` | `[]` |
| `default-line-ending` | The line ending to use for new documents. Can be `native`, `lf`, `crlf`, `ff`, `cr` or `nel`. `native` uses the platform's native line ending (`crlf` on Windows, otherwise `lf`). | `native` |
| `insert-final-newline` | Whether to automatically insert a trailing line-ending on write if missing | `true` |
| `indent-heuristic` | How the indentation for a newly inserted line is computed: `simple` just copies the indentation level from the previous line, `tree-sitter` computes the indentation based on the syntax tree and `hybrid` combines both approaches | `hybrid`
| `indent-heuristic` | How the indentation for a newly inserted line is computed: `simple` just copies the indentation level from the previous line, `tree-sitter` computes the indentation based on the syntax tree and `hybrid` combines both approaches. If the chosen heuristic is not available, a different one will be used as a fallback (the fallback order being `hybrid` -> `tree-sitter` -> `simple`). | `hybrid`

### `[editor.statusline]` Section

Expand Down
19 changes: 8 additions & 11 deletions helix-core/src/indent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -225,14 +225,11 @@ fn add_indent_level(
// Since the width of a tab depends on its offset, we cannot simply iterate over
// the chars of `base_indent` in reverse until we have the desired indent reduction,
// instead we iterate over them twice in forward direction.
let mut base_indent_width: usize = 0;
for c in base_indent.chars() {
base_indent_width += match c {
'\t' => tab_width_at(base_indent_width, tab_width as u16),
// This is only true since `base_indent` consists only of tabs and spaces
_ => 1,
};
}
let base_indent_rope = RopeSlice::from(base_indent.as_str());
#[allow(deprecated)]
let base_indent_width =
crate::visual_coords_at_pos(base_indent_rope, base_indent_rope.len_chars(), tab_width)
.col;
let target_indent_width = base_indent_width
.saturating_sub((-added_indent_level) as usize * indent_style.indent_width(tab_width));
let mut reduced_indent_width = 0;
Expand All @@ -242,7 +239,7 @@ fn add_indent_level(
return base_indent;
}
reduced_indent_width += match c {
'\t' => tab_width_at(base_indent_width, tab_width as u16),
'\t' => tab_width_at(reduced_indent_width, tab_width as u16),
_ => 1,
};
}
Expand Down Expand Up @@ -955,7 +952,7 @@ pub fn indent_for_newline(
line_before_end_pos,
true,
) {
if let IndentationHeuristic::Hybrid = indent_heuristic {
if *indent_heuristic == IndentationHeuristic::Hybrid {
// We want to compute the indentation not only based on the
// syntax tree but also on the actual indentation of a previous
// line. This makes indentation computation more resilient to
Expand All @@ -965,7 +962,7 @@ pub fn indent_for_newline(
// make sense, e.g. if it has a different alignment than the new line.
// In order to prevent edge cases with long running times, we only try
// a constant number of (non-empty) lines.
const MAX_ATTEMPTS: usize = 2;
const MAX_ATTEMPTS: usize = 4;
let mut num_attempts = 0;
for line_idx in (0..=line_before).rev() {
let line = text.line(line_idx);
Expand Down

0 comments on commit 1808fc5

Please sign in to comment.