aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOmnikar2021-11-08 00:54:39 +0000
committerGitHub2021-11-08 00:54:39 +0000
commita252ecd8c85af5cc16638a4752011e2e920fa652 (patch)
treed0622202026845b6e95a2814cb72885fa5049b59
parente0e227d172697c0d3c418704fd20e780ee1a1032 (diff)
Add WORD textobject (#991)
* Add WORD textobject * Document WORD textobject
-rw-r--r--book/src/usage.md1
-rw-r--r--helix-core/src/textobject.rs11
-rw-r--r--helix-term/src/commands.rs3
-rw-r--r--helix-term/src/ui/prompt.rs1
4 files changed, 10 insertions, 6 deletions
diff --git a/book/src/usage.md b/book/src/usage.md
index 71730fa8..6b7cbc41 100644
--- a/book/src/usage.md
+++ b/book/src/usage.md
@@ -62,6 +62,7 @@ Currently supported: `word`, `surround`, `function`, `class`, `parameter`.
| Key after `mi` or `ma` | Textobject selected |
| --- | --- |
| `w` | Word |
+| `W` | WORD |
| `(`, `[`, `'`, etc | Specified surround pairs |
| `f` | Function |
| `c` | Class |
diff --git a/helix-core/src/textobject.rs b/helix-core/src/textobject.rs
index 975ed115..24f063d4 100644
--- a/helix-core/src/textobject.rs
+++ b/helix-core/src/textobject.rs
@@ -10,7 +10,7 @@ use crate::surround;
use crate::syntax::LanguageConfiguration;
use crate::Range;
-fn find_word_boundary(slice: RopeSlice, mut pos: usize, direction: Direction) -> usize {
+fn find_word_boundary(slice: RopeSlice, mut pos: usize, direction: Direction, long: bool) -> usize {
use CharCategory::{Eol, Whitespace};
let iter = match direction {
@@ -33,7 +33,7 @@ fn find_word_boundary(slice: RopeSlice, mut pos: usize, direction: Direction) ->
match categorize_char(ch) {
Eol | Whitespace => return pos,
category => {
- if category != prev_category && pos != 0 && pos != slice.len_chars() {
+ if !long && category != prev_category && pos != 0 && pos != slice.len_chars() {
return pos;
} else {
match direction {
@@ -70,13 +70,14 @@ pub fn textobject_word(
range: Range,
textobject: TextObject,
_count: usize,
+ long: bool,
) -> Range {
let pos = range.cursor(slice);
- let word_start = find_word_boundary(slice, pos, Direction::Backward);
+ let word_start = find_word_boundary(slice, pos, Direction::Backward, long);
let word_end = match slice.get_char(pos).map(categorize_char) {
None | Some(CharCategory::Whitespace | CharCategory::Eol) => pos,
- _ => find_word_boundary(slice, pos + 1, Direction::Forward),
+ _ => find_word_boundary(slice, pos + 1, Direction::Forward, long),
};
// Special case.
@@ -268,7 +269,7 @@ mod test {
let slice = doc.slice(..);
for &case in scenario {
let (pos, objtype, expected_range) = case;
- let result = textobject_word(slice, Range::point(pos), objtype, 1);
+ let result = textobject_word(slice, Range::point(pos), objtype, 1, false);
assert_eq!(
result,
expected_range.into(),
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 80cbd6d2..5f091775 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -4672,7 +4672,8 @@ fn select_textobject(cx: &mut Context, objtype: textobject::TextObject) {
let selection = doc.selection(view.id).clone().transform(|range| {
match ch {
- 'w' => textobject::textobject_word(text, range, objtype, count),
+ 'w' => textobject::textobject_word(text, range, objtype, count, false),
+ 'W' => textobject::textobject_word(text, range, objtype, count, true),
'c' => textobject_treesitter("class", range),
'f' => textobject_treesitter("function", range),
'p' => textobject_treesitter("parameter", range),
diff --git a/helix-term/src/ui/prompt.rs b/helix-term/src/ui/prompt.rs
index c999ba14..29ca18b1 100644
--- a/helix-term/src/ui/prompt.rs
+++ b/helix-term/src/ui/prompt.rs
@@ -491,6 +491,7 @@ impl Component for Prompt {
doc.selection(view.id).primary(),
textobject::TextObject::Inside,
1,
+ false,
);
let line = text.slice(range.from()..range.to()).to_string();
if !line.is_empty() {