mirror of https://github.com/helix-editor/helix
Compare commits
7 Commits
6c0057020e
...
101c031e42
Author | SHA1 | Date |
---|---|---|
|
101c031e42 | |
|
362e97e927 | |
|
ba54b6afe4 | |
|
837627dd8a | |
|
1246549afd | |
|
ada8004ea5 | |
|
f519947014 |
|
@ -2810,9 +2810,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
|
|||
|
||||
[[package]]
|
||||
name = "tree-house"
|
||||
version = "0.2.0"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "679e3296e503901cd9f6e116be5a43a9270222215bf6c78b4b1f4af5c3dcc62d"
|
||||
checksum = "d00ea55222392f171ae004dd13b62edd09d995633abf0c13406a8df3547fb999"
|
||||
dependencies = [
|
||||
"arc-swap",
|
||||
"hashbrown 0.15.4",
|
||||
|
|
|
@ -37,7 +37,7 @@ package.helix-tui.opt-level = 2
|
|||
package.helix-term.opt-level = 2
|
||||
|
||||
[workspace.dependencies]
|
||||
tree-house = { version = "0.2.0", default-features = false }
|
||||
tree-house = { version = "0.3.0", default-features = false }
|
||||
nucleo = "0.5.0"
|
||||
slotmap = "1.0.7"
|
||||
thiserror = "2.0"
|
||||
|
|
|
@ -6653,11 +6653,30 @@ fn jump_to_label(cx: &mut Context, labels: Vec<Range>, behaviour: Movement) {
|
|||
.iter()
|
||||
.enumerate()
|
||||
.flat_map(|(i, range)| {
|
||||
// Prefer "lower" chars of the given alphabeth.
|
||||
// Use all possible combinations of lower chars before extending
|
||||
// the used subset upwards.
|
||||
// E.g., "abc..." will lead to label sequence
|
||||
// "aa", "ba", "ab", "bb", "ca", "cb", "ac", "bc", "cc", ...
|
||||
// Labels are generated in a square manner as illustrated by the
|
||||
// schematic below.
|
||||
// a b c d
|
||||
// a 0 1 4 9
|
||||
// b 2 3 5 10
|
||||
// c 6 7 8 11
|
||||
// d 12 13 14 15
|
||||
// The column index determines the leading (outer) char,
|
||||
// the row index determines the trailing (inner) char.
|
||||
let base = (i as f64).sqrt() as usize;
|
||||
let offset = i - base * base;
|
||||
|
||||
let outer = if offset < base { base } else { offset - base };
|
||||
let inner = if offset < base { offset } else { base };
|
||||
[
|
||||
Overlay::new(range.from(), alphabet_char(i / alphabet.len())),
|
||||
Overlay::new(range.from(), alphabet_char(outer)),
|
||||
Overlay::new(
|
||||
graphemes::next_grapheme_boundary(text, range.from()),
|
||||
alphabet_char(i % alphabet.len()),
|
||||
alphabet_char(inner),
|
||||
),
|
||||
]
|
||||
})
|
||||
|
@ -6673,7 +6692,7 @@ fn jump_to_label(cx: &mut Context, labels: Vec<Range>, behaviour: Movement) {
|
|||
let doc = doc.id();
|
||||
cx.on_next_key(move |cx, event| {
|
||||
let alphabet = &cx.editor.config().jump_label_alphabet;
|
||||
let Some(i) = event
|
||||
let Some(outer) = event
|
||||
.char()
|
||||
.filter(|_| event.modifiers.is_empty())
|
||||
.and_then(|ch| alphabet.iter().position(|&it| it == ch))
|
||||
|
@ -6681,12 +6700,7 @@ fn jump_to_label(cx: &mut Context, labels: Vec<Range>, behaviour: Movement) {
|
|||
doc_mut!(cx.editor, &doc).remove_jump_labels(view);
|
||||
return;
|
||||
};
|
||||
let outer = i * alphabet.len();
|
||||
// Bail if the given character cannot be a jump label.
|
||||
if outer > labels.len() {
|
||||
doc_mut!(cx.editor, &doc).remove_jump_labels(view);
|
||||
return;
|
||||
}
|
||||
|
||||
cx.on_next_key(move |cx, event| {
|
||||
doc_mut!(cx.editor, &doc).remove_jump_labels(view);
|
||||
let alphabet = &cx.editor.config().jump_label_alphabet;
|
||||
|
@ -6697,7 +6711,18 @@ fn jump_to_label(cx: &mut Context, labels: Vec<Range>, behaviour: Movement) {
|
|||
else {
|
||||
return;
|
||||
};
|
||||
if let Some(mut range) = labels.get(outer + inner).copied() {
|
||||
// Mapping back a label to an index requires to distinguish 2 cases
|
||||
// (see label generation above for illustration):
|
||||
// 1. We are in the new column
|
||||
// => size of inner square + pos in column.
|
||||
// 2. We are in the new row (including corner)
|
||||
// => size of extended inner square + pos in row.
|
||||
let index = if outer > inner {
|
||||
outer*outer + inner
|
||||
} else {
|
||||
inner*(inner+1) + outer
|
||||
};
|
||||
if let Some(mut range) = labels.get(index).copied() {
|
||||
range = if behaviour == Movement::Extend {
|
||||
let anchor = if range.anchor < range.head {
|
||||
let from = primary_selection.from();
|
||||
|
|
|
@ -81,6 +81,10 @@ fn request_document_colors(editor: &mut Editor, doc_id: DocumentId) {
|
|||
})
|
||||
.collect();
|
||||
|
||||
if futures.is_empty() {
|
||||
return;
|
||||
}
|
||||
|
||||
tokio::spawn(async move {
|
||||
let mut all_colors = Vec::new();
|
||||
loop {
|
||||
|
|
|
@ -1437,7 +1437,11 @@ impl Editor {
|
|||
log::error!("failed to apply workspace edit: {err:?}")
|
||||
}
|
||||
}
|
||||
|
||||
if old_path.exists() {
|
||||
fs::rename(old_path, &new_path)?;
|
||||
}
|
||||
|
||||
if let Some(doc) = self.document_by_path(old_path) {
|
||||
self.set_doc_path(doc.id(), &new_path);
|
||||
}
|
||||
|
|
|
@ -937,7 +937,7 @@ indent = { tab-width = 2, unit = " " }
|
|||
|
||||
[[grammar]]
|
||||
name = "html"
|
||||
source = { git = "https://github.com/tree-sitter/tree-sitter-html", rev = "29f53d8f4f2335e61bf6418ab8958dac3282077a" }
|
||||
source = { git = "https://github.com/tree-sitter/tree-sitter-html", rev = "cbb91a0ff3621245e890d1c50cc811bffb77a26b" }
|
||||
|
||||
[[language]]
|
||||
name = "python"
|
||||
|
|
|
@ -1,3 +1,48 @@
|
|||
; inherits: html
|
||||
(tag_name) @tag
|
||||
(erroneous_end_tag_name) @error
|
||||
(doctype) @constant
|
||||
(attribute_name) @attribute
|
||||
(comment) @comment
|
||||
|
||||
((attribute
|
||||
(attribute_name) @attribute
|
||||
(quoted_attribute_value (attribute_value) @markup.link.url))
|
||||
(#any-of? @attribute "href" "src"))
|
||||
|
||||
((element
|
||||
(start_tag
|
||||
(tag_name) @tag)
|
||||
(text) @markup.link.label)
|
||||
(#eq? @tag "a"))
|
||||
|
||||
(attribute [(attribute_value) (quoted_attribute_value)] @string)
|
||||
|
||||
((element
|
||||
(start_tag
|
||||
(tag_name) @tag)
|
||||
(text) @markup.bold)
|
||||
(#any-of? @tag "strong" "b"))
|
||||
|
||||
((element
|
||||
(start_tag
|
||||
(tag_name) @tag)
|
||||
(text) @markup.italic)
|
||||
(#any-of? @tag "em" "i"))
|
||||
|
||||
((element
|
||||
(start_tag
|
||||
(tag_name) @tag)
|
||||
(text) @markup.strikethrough)
|
||||
(#any-of? @tag "s" "del"))
|
||||
|
||||
[
|
||||
"<"
|
||||
">"
|
||||
"</"
|
||||
"/>"
|
||||
"<!"
|
||||
] @punctuation.bracket
|
||||
|
||||
"=" @punctuation.delimiter
|
||||
|
||||
["---"] @punctuation.delimiter
|
||||
|
|
|
@ -12,8 +12,6 @@
|
|||
(namespace_definition name: (namespace_identifier) @namespace)
|
||||
(namespace_identifier) @namespace
|
||||
|
||||
(qualified_identifier name: (identifier) @type.enum.variant)
|
||||
|
||||
(auto) @type
|
||||
"decltype" @type
|
||||
|
||||
|
@ -21,12 +19,29 @@
|
|||
(reference_declarator ["&" "&&"] @type.builtin)
|
||||
(abstract_reference_declarator ["&" "&&"] @type.builtin)
|
||||
|
||||
; -------
|
||||
; Functions
|
||||
|
||||
|
||||
; -------
|
||||
; Support up to 4 levels of nesting of qualifiers
|
||||
; i.e. a::b::c::d::func();
|
||||
(call_expression
|
||||
function: (qualified_identifier
|
||||
name: (identifier) @function))
|
||||
(call_expression
|
||||
function: (qualified_identifier
|
||||
name: (qualified_identifier
|
||||
name: (identifier) @function)))
|
||||
(call_expression
|
||||
function: (qualified_identifier
|
||||
name: (qualified_identifier
|
||||
name: (qualified_identifier
|
||||
name: (identifier) @function))))
|
||||
(call_expression
|
||||
function: (qualified_identifier
|
||||
name: (qualified_identifier
|
||||
name: (qualified_identifier
|
||||
name: (qualified_identifier
|
||||
name: (identifier) @function)))))
|
||||
|
||||
(template_function
|
||||
name: (identifier) @function)
|
||||
|
@ -34,26 +49,42 @@
|
|||
(template_method
|
||||
name: (field_identifier) @function)
|
||||
|
||||
; Support up to 3 levels of nesting of qualifiers
|
||||
; i.e. a::b::c::func();
|
||||
; Support up to 4 levels of nesting of qualifiers
|
||||
; i.e. a::b::c::d::func();
|
||||
(function_declarator
|
||||
declarator: (qualified_identifier
|
||||
name: (identifier) @function))
|
||||
|
||||
(function_declarator
|
||||
declarator: (qualified_identifier
|
||||
name: (qualified_identifier
|
||||
name: (identifier) @function)))
|
||||
|
||||
(function_declarator
|
||||
declarator: (qualified_identifier
|
||||
name: (qualified_identifier
|
||||
name: (qualified_identifier
|
||||
name: (identifier) @function))))
|
||||
(function_declarator
|
||||
declarator: (qualified_identifier
|
||||
name: (qualified_identifier
|
||||
name: (qualified_identifier
|
||||
name: (qualified_identifier
|
||||
name: (identifier) @function)))))
|
||||
|
||||
(function_declarator
|
||||
declarator: (field_identifier) @function)
|
||||
|
||||
; Constructors
|
||||
|
||||
(class_specifier
|
||||
(type_identifier) @type
|
||||
(field_declaration_list
|
||||
(function_definition
|
||||
(function_declarator
|
||||
(identifier) @constructor)))
|
||||
(#eq? @type @constructor))
|
||||
(destructor_name "~" @constructor
|
||||
(identifier) @constructor)
|
||||
|
||||
; Parameters
|
||||
|
||||
(parameter_declaration
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
(erroneous_end_tag_name) @error
|
||||
(doctype) @constant
|
||||
(attribute_name) @attribute
|
||||
(entity) @string.special.symbol
|
||||
(comment) @comment
|
||||
|
||||
((attribute
|
||||
|
|
Loading…
Reference in New Issue