diff --git a/helix-core/src/comment.rs b/helix-core/src/comment.rs index 05e0e5b60..ad0ae616d 100644 --- a/helix-core/src/comment.rs +++ b/helix-core/src/comment.rs @@ -37,18 +37,24 @@ pub fn get_comment_token<'a, S: AsRef>( /// - Column of existing tokens, if the lines are commented; column to place tokens at otherwise. /// - The margin to the right of the comment tokens /// - Defaults to `1`. If any existing comment token is not followed by a space, changes to `0`. -fn find_line_comment( - token: &str, +fn find_line_comment<'a>( text: RopeSlice, - lines: impl IntoIterator, + lines: impl IntoIterator< + Item = ( + // line number + usize, + // token for this line + &'a str, + ), + >, ) -> (bool, Vec, usize, usize) { let mut commented = true; let mut to_change = Vec::new(); let mut min = usize::MAX; // minimum col for first_non_whitespace_char let mut margin = 1; - let token_len = token.chars().count(); - for line in lines { + for (line, token) in lines { + let token_len = token.chars().count(); let line_slice = text.line(line); if let Some(pos) = line_slice.first_non_whitespace_char() { let len = line_slice.len_chars(); @@ -79,11 +85,8 @@ fn find_line_comment( } // for a given range and syntax, determine if there are additional tokens to consider -pub type InjectedTokens = fn( - range: Range, - syntax: Option<&crate::Syntax>, - rope: RopeSlice, -) -> (Option>, Option>); +pub type InjectedTokens = + Box (Option>, Option>)>; #[must_use] pub fn toggle_line_comments( @@ -97,7 +100,7 @@ pub fn toggle_line_comments( let token = token.unwrap_or(DEFAULT_COMMENT_TOKEN); let comment = Tendril::from(format!("{} ", token)); - let mut lines: Vec = Vec::with_capacity(selection.len()); + let mut lines: Vec<(usize, &str)> = Vec::with_capacity(selection.len()); let mut min_next_line = 0; for selection in selection { @@ -105,6 +108,9 @@ pub fn toggle_line_comments( let start = start.clamp(min_next_line, text.len_lines()); let end = (end + 1).min(text.len_lines()); + let start_byte = text.line_to_byte(start); + let end_byte = text.line_to_byte(start); + lines.extend(start..end); min_next_line = end; } diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index ec36d2e19..45e8dc335 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -504,7 +504,6 @@ impl MappableCommand { hover, "Show docs for item under cursor", toggle_comments, "Comment/uncomment selections", toggle_line_comments, "Line comment/uncomment selections", - testing1234, "a", toggle_block_comments, "Block comment/uncomment selections", rotate_selections_forward, "Rotate selections forward", rotate_selections_backward, "Rotate selections backward", @@ -5089,17 +5088,14 @@ pub fn completion(cx: &mut Context) { .trigger_completions(cursor, doc.id(), view.id); } -// for a given range and syntax, determine if there are additional tokens to consider -pub type InjectedTokens = - Box (Option>, Option>)>; - // comments type CommentTransactionFn = Box< dyn FnMut( Option<&str>, Option<&[BlockCommentToken]>, + &Rope, &Selection, - InjectedTokens, + comment::InjectedTokens, ) -> Transaction, >; @@ -5121,6 +5117,7 @@ fn toggle_comments_impl(cx: &mut Context, mut comment_transaction: CommentTransa let transaction = comment_transaction( line_token, block_tokens, + doc.text(), doc.selection(view.id), Box::new(|range: Range| { let mut best_fit = None; @@ -5163,104 +5160,93 @@ fn toggle_comments_impl(cx: &mut Context, mut comment_transaction: CommentTransa /// 4. all lines not commented and block tokens -> comment uncommented lines /// 5. no comment tokens and not block commented -> line comment fn toggle_comments(cx: &mut Context) { - toggle_comments_impl(cx, |line_token, block_tokens, selection, lol_fn| { - // only have line comment tokens - if line_token.is_some() && block_tokens.is_none() { - return comment::toggle_line_comments(doc, selection, line_token, lol_fn); - } + toggle_comments_impl( + cx, + Box::new(|line_token, block_tokens, doc, selection, lol_fn| { + let text = doc.slice(..); - let split_lines = comment::split_lines_of_selection(text, selection); + // only have line comment tokens + if line_token.is_some() && block_tokens.is_none() { + return comment::toggle_line_comments(doc, selection, line_token, lol_fn); + } - let default_block_tokens = &[BlockCommentToken::default()]; - let block_comment_tokens = block_tokens.unwrap_or(default_block_tokens); + let split_lines = comment::split_lines_of_selection(text, selection); - let (line_commented, line_comment_changes) = - comment::find_block_comments(block_comment_tokens, text, &split_lines); + let default_block_tokens = &[BlockCommentToken::default()]; + let block_comment_tokens = block_tokens.unwrap_or(default_block_tokens); - // block commented by line would also be block commented so check this first - if line_commented { - return comment::create_block_comment_transaction( - doc, - &split_lines, - line_commented, - line_comment_changes, - ) - .0; - } + let (line_commented, line_comment_changes) = + comment::find_block_comments(block_comment_tokens, text, &split_lines); - let (block_commented, comment_changes) = - comment::find_block_comments(block_comment_tokens, text, selection); + // block commented by line would also be block commented so check this first + if line_commented { + return comment::create_block_comment_transaction( + doc, + &split_lines, + line_commented, + line_comment_changes, + ) + .0; + } - // check if selection has block comments - if block_commented { - return comment::create_block_comment_transaction( - doc, - selection, - block_commented, - comment_changes, - ) - .0; - } + let (block_commented, comment_changes) = + comment::find_block_comments(block_comment_tokens, text, selection); - // not commented and only have block comment tokens - if line_token.is_none() && block_tokens.is_some() { - return comment::create_block_comment_transaction( - doc, - &split_lines, - line_commented, - line_comment_changes, - ) - .0; - } + // check if selection has block comments + if block_commented { + return comment::create_block_comment_transaction( + doc, + selection, + block_commented, + comment_changes, + ) + .0; + } - // not block commented at all and don't have any tokens - comment::toggle_line_comments(doc, selection, line_token) - }) -} + // not commented and only have block comment tokens + if line_token.is_none() && block_tokens.is_some() { + return comment::create_block_comment_transaction( + doc, + &split_lines, + line_commented, + line_comment_changes, + ) + .0; + } -fn testing1234(cx: &mut Context) { - let doc = doc!(cx.editor); - let syntax = doc.syntax().unwrap(); - - // let a = syntax.layers.keys().next().unwrap(); - let b = syntax - .layers - .values() - .map(|value| value.ranges.clone()) - .collect::>(); - - // b.depth - - // let config = syntax.layer_config(a); - - log::error!("{:#?}", b); + // not block commented at all and don't have any tokens + comment::toggle_line_comments(doc, selection, line_token, lol_fn) + }), + ) } fn toggle_line_comments(cx: &mut Context) { toggle_comments_impl(cx, |line_token, block_tokens, doc, selection| { - if line_token.is_none() && block_tokens.is_some() { - let default_block_tokens = &[BlockCommentToken::default()]; - let block_comment_tokens = block_tokens.unwrap_or(default_block_tokens); - comment::toggle_block_comments( - doc, - &comment::split_lines_of_selection(doc.slice(..), selection), - block_comment_tokens, - ) - } else { - comment::toggle_line_comments(doc, selection, line_token) - } + todo!(); + // if line_token.is_none() && block_tokens.is_some() { + // let default_block_tokens = &[BlockCommentToken::default()]; + // let block_comment_tokens = block_tokens.unwrap_or(default_block_tokens); + // comment::toggle_block_comments( + // doc, + // &comment::split_lines_of_selection(doc.slice(..), selection), + // block_comment_tokens, + // ) + // } else { + // comment::toggle_line_comments(doc, selection, line_token) + // } }); } fn toggle_block_comments(cx: &mut Context) { toggle_comments_impl(cx, |line_token, block_tokens, doc, selection| { - if line_token.is_some() && block_tokens.is_none() { - comment::toggle_line_comments(doc, selection, line_token) - } else { - let default_block_tokens = &[BlockCommentToken::default()]; - let block_comment_tokens = block_tokens.unwrap_or(default_block_tokens); - comment::toggle_block_comments(doc, selection, block_comment_tokens) - } + todo!(); + // if line_token.is_some() && block_tokens.is_none() { + // comment::toggle_line_comments(doc, selection, line_token) + // } else { + // let default_block_tokens = &[BlockCommentToken::default()]; + // let block_comment_tokens = block_tokens.unwrap_or(default_block_tokens); + // comment::toggle_block_comments(doc, selection, block_comment_tokens) + // } }); } diff --git a/helix-term/src/keymap/default.rs b/helix-term/src/keymap/default.rs index cf6f52035..e160b2246 100644 --- a/helix-term/src/keymap/default.rs +++ b/helix-term/src/keymap/default.rs @@ -6,7 +6,6 @@ use helix_core::hashmap; pub fn default() -> HashMap { let normal = keymap!({ "Normal mode" - "M" => testing1234, "h" | "left" => move_char_left, "j" | "down" => move_visual_line_down, "k" | "up" => move_visual_line_up,