mirror of
https://github.com/helix-editor/helix.git
synced 2025-01-19 13:37:06 +04:00
enable smart case regex search by default (#761)
This commit is contained in:
parent
e0e41f4f77
commit
4a003782a5
2
TODO.md
2
TODO.md
@ -22,8 +22,6 @@
|
|||||||
|
|
||||||
- [ ] lsp: signature help
|
- [ ] lsp: signature help
|
||||||
|
|
||||||
- [ ] search: smart case by default: insensitive unless upper detected
|
|
||||||
|
|
||||||
2
|
2
|
||||||
- [ ] macro recording
|
- [ ] macro recording
|
||||||
- [ ] extend selection (treesitter select parent node) (replaces viw, vi(, va( etc )
|
- [ ] extend selection (treesitter select parent node) (replaces viw, vi(, va( etc )
|
||||||
|
@ -17,6 +17,7 @@ ## Editor
|
|||||||
| `scroll-lines` | Number of lines to scroll per scroll wheel step. | `3` |
|
| `scroll-lines` | Number of lines to scroll per scroll wheel step. | `3` |
|
||||||
| `shell` | Shell to use when running external commands. | Unix: `["sh", "-c"]`<br/>Windows: `["cmd", "/C"]` |
|
| `shell` | Shell to use when running external commands. | Unix: `["sh", "-c"]`<br/>Windows: `["cmd", "/C"]` |
|
||||||
| `line-number` | Line number display (`absolute`, `relative`) | `absolute` |
|
| `line-number` | Line number display (`absolute`, `relative`) | `absolute` |
|
||||||
|
| `smart-case` | Enable smart case regex searching (case insensitive unless pattern contains upper case characters) | `true` |
|
||||||
|
|
||||||
## LSP
|
## LSP
|
||||||
|
|
||||||
|
@ -104,8 +104,7 @@ ### Selection manipulation
|
|||||||
|
|
||||||
### Search
|
### Search
|
||||||
|
|
||||||
> TODO: The search implementation isn't ideal yet -- we don't support searching
|
> TODO: The search implementation isn't ideal yet -- we don't support searching in reverse.
|
||||||
in reverse, or searching via smartcase.
|
|
||||||
|
|
||||||
| Key | Description | Command |
|
| Key | Description | Command |
|
||||||
| ----- | ----------- | ------- |
|
| ----- | ----------- | ------- |
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
match_brackets,
|
match_brackets,
|
||||||
movement::{self, Direction},
|
movement::{self, Direction},
|
||||||
object, pos_at_coords,
|
object, pos_at_coords,
|
||||||
regex::{self, Regex},
|
regex::{self, Regex, RegexBuilder},
|
||||||
register::Register,
|
register::Register,
|
||||||
search, selection, surround, textobject, LineEnding, Position, Range, Rope, RopeGraphemes,
|
search, selection, surround, textobject, LineEnding, Position, Range, Rope, RopeGraphemes,
|
||||||
RopeSlice, Selection, SmallVec, Tendril, Transaction,
|
RopeSlice, Selection, SmallVec, Tendril, Transaction,
|
||||||
@ -1154,7 +1154,15 @@ fn search_next_impl(cx: &mut Context, extend: bool) {
|
|||||||
if let Some(query) = registers.read('/') {
|
if let Some(query) = registers.read('/') {
|
||||||
let query = query.last().unwrap();
|
let query = query.last().unwrap();
|
||||||
let contents = doc.text().slice(..).to_string();
|
let contents = doc.text().slice(..).to_string();
|
||||||
if let Ok(regex) = Regex::new(query) {
|
let case_insensitive = if cx.editor.config.smart_case {
|
||||||
|
!query.chars().any(char::is_uppercase)
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
};
|
||||||
|
if let Ok(regex) = RegexBuilder::new(query)
|
||||||
|
.case_insensitive(case_insensitive)
|
||||||
|
.build()
|
||||||
|
{
|
||||||
search_impl(doc, view, &contents, ®ex, extend);
|
search_impl(doc, view, &contents, ®ex, extend);
|
||||||
} else {
|
} else {
|
||||||
// get around warning `mutable_borrow_reservation_conflict`
|
// get around warning `mutable_borrow_reservation_conflict`
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
pub use text::Text;
|
pub use text::Text;
|
||||||
|
|
||||||
use helix_core::regex::Regex;
|
use helix_core::regex::Regex;
|
||||||
|
use helix_core::regex::RegexBuilder;
|
||||||
use helix_view::{Document, Editor, View};
|
use helix_view::{Document, Editor, View};
|
||||||
|
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
@ -53,7 +54,16 @@ pub fn regex_prompt(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
match Regex::new(input) {
|
let case_insensitive = if cx.editor.config.smart_case {
|
||||||
|
!input.chars().any(char::is_uppercase)
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
|
match RegexBuilder::new(input)
|
||||||
|
.case_insensitive(case_insensitive)
|
||||||
|
.build()
|
||||||
|
{
|
||||||
Ok(regex) => {
|
Ok(regex) => {
|
||||||
let (view, doc) = current!(cx.editor);
|
let (view, doc) = current!(cx.editor);
|
||||||
|
|
||||||
|
@ -39,6 +39,8 @@ pub struct Config {
|
|||||||
pub line_number: LineNumber,
|
pub line_number: LineNumber,
|
||||||
/// Middle click paste support. Defaults to true
|
/// Middle click paste support. Defaults to true
|
||||||
pub middle_click_paste: bool,
|
pub middle_click_paste: bool,
|
||||||
|
/// Smart case: Case insensitive searching unless pattern contains upper case characters. Defaults to true.
|
||||||
|
pub smart_case: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
|
||||||
@ -64,6 +66,7 @@ fn default() -> Self {
|
|||||||
},
|
},
|
||||||
line_number: LineNumber::Absolute,
|
line_number: LineNumber::Absolute,
|
||||||
middle_click_paste: true,
|
middle_click_paste: true,
|
||||||
|
smart_case: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user