on master help sign in
enable smart case regex search by default (#761)
4a00378kraem
TODO.md−2
@@ -22,8 +22,6 @@ as you type completion!
22
22
23- [ ] lsp: signature help
23- [ ] lsp: signature help
24
24
25−- [ ] search: smart case by default: insensitive unless upper detected
26−
272
252
28- [ ] macro recording
26- [ ] macro recording
29- [ ] extend selection (treesitter select parent node) (replaces viw, vi(, va( etc )
27- [ ] extend selection (treesitter select parent node) (replaces viw, vi(, va( etc )
book/src/configuration.md+1
@@ -17,6 +17,7 @@ To override global configuration parameters, create a `config.toml` file located
17| `scroll-lines` | Number of lines to scroll per scroll wheel step. | `3` |
17| `scroll-lines` | Number of lines to scroll per scroll wheel step. | `3` |
18| `shell` | Shell to use when running external commands. | Unix: `["sh", "-c"]`<br/>Windows: `["cmd", "/C"]` |
18| `shell` | Shell to use when running external commands. | Unix: `["sh", "-c"]`<br/>Windows: `["cmd", "/C"]` |
19| `line-number` | Line number display (`absolute`, `relative`) | `absolute` |
19| `line-number` | Line number display (`absolute`, `relative`) | `absolute` |
20+| `smart-case` | Enable smart case regex searching (case insensitive unless pattern contains upper case characters) | `true` |
20
21
21## LSP
22## LSP
22
23
book/src/keymap.md+1−2
@@ -104,8 +104,7 @@
104
104
105### Search
105### Search
106
106
107−> TODO: The search implementation isn't ideal yet -- we don't support searching
107+> TODO: The search implementation isn't ideal yet -- we don't support searching in reverse.
108−in reverse, or searching via smartcase.
109
108
110| Key | Description | Command |
109| Key | Description | Command |
111| ----- | ----------- | ------- |
110| ----- | ----------- | ------- |
helix-term/src/commands.rs+10−2
@@ -5,7 +5,7 @@ use helix_core::{
5 match_brackets,
5 match_brackets,
6 movement::{self, Direction},
6 movement::{self, Direction},
7 object, pos_at_coords,
7 object, pos_at_coords,
8− regex::{self, Regex},
8+ regex::{self, Regex, RegexBuilder},
9 register::Register,
9 register::Register,
10 search, selection, surround, textobject, LineEnding, Position, Range, Rope, RopeGraphemes,
10 search, selection, surround, textobject, LineEnding, Position, Range, Rope, RopeGraphemes,
11 RopeSlice, Selection, SmallVec, Tendril, Transaction,
11 RopeSlice, Selection, SmallVec, Tendril, Transaction,
@@ -1154,7 +1154,15 @@ fn search_next_impl(cx: &mut Context, extend: bool) {
1154 if let Some(query) = registers.read('/') {
1154 if let Some(query) = registers.read('/') {
1155 let query = query.last().unwrap();
1155 let query = query.last().unwrap();
1156 let contents = doc.text().slice(..).to_string();
1156 let contents = doc.text().slice(..).to_string();
1157+ let case_insensitive = if cx.editor.config.smart_case {
1158+ !query.chars().any(char::is_uppercase)
1159+ } else {
1160+ false
1161+ };
1157− if let Ok(regex) = Regex::new(query) {
1162+ if let Ok(regex) = RegexBuilder::new(query)
1163+ .case_insensitive(case_insensitive)
1164+ .build()
1165+ {
1158 search_impl(doc, view, &contents, &regex, extend);
1166 search_impl(doc, view, &contents, &regex, extend);
1159 } else {
1167 } else {
1160 // get around warning `mutable_borrow_reservation_conflict`
1168 // get around warning `mutable_borrow_reservation_conflict`
helix-term/src/ui/mod.rs+11−1
@@ -20,6 +20,7 @@ pub use spinner::{ProgressSpinners, Spinner};
20pub use text::Text;
20pub use text::Text;
21
21
22use helix_core::regex::Regex;
22use helix_core::regex::Regex;
23+use helix_core::regex::RegexBuilder;
23use helix_view::{Document, Editor, View};
24use helix_view::{Document, Editor, View};
24
25
25use std::path::PathBuf;
26use std::path::PathBuf;
@@ -53,7 +54,16 @@ pub fn regex_prompt(
53 return;
54 return;
54 }
55 }
55
56
57+ let case_insensitive = if cx.editor.config.smart_case {
58+ !input.chars().any(char::is_uppercase)
59+ } else {
60+ false
61+ };
62+
56− match Regex::new(input) {
63+ match RegexBuilder::new(input)
64+ .case_insensitive(case_insensitive)
65+ .build()
66+ {
57 Ok(regex) => {
67 Ok(regex) => {
58 let (view, doc) = current!(cx.editor);
68 let (view, doc) = current!(cx.editor);
59
69
helix-view/src/editor.rs+3
@@ -39,6 +39,8 @@ pub struct Config {
39 pub line_number: LineNumber,
39 pub line_number: LineNumber,
40 /// Middle click paste support. Defaults to true
40 /// Middle click paste support. Defaults to true
41 pub middle_click_paste: bool,
41 pub middle_click_paste: bool,
42+ /// Smart case: Case insensitive searching unless pattern contains upper case characters. Defaults to true.
43+ pub smart_case: bool,
42}
44}
43
45
44#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
46#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
@@ -64,6 +66,7 @@ impl Default for Config {
64 },
66 },
65 line_number: LineNumber::Absolute,
67 line_number: LineNumber::Absolute,
66 middle_click_paste: true,
68 middle_click_paste: true,
69+ smart_case: true,
67 }
70 }
68 }
71 }
69}
72}