aboutsummaryrefslogtreecommitdiffstats
path: root/vim-mode/vim_mode.pl
diff options
context:
space:
mode:
Diffstat (limited to 'vim-mode/vim_mode.pl')
-rw-r--r--vim-mode/vim_mode.pl51
1 files changed, 41 insertions, 10 deletions
diff --git a/vim-mode/vim_mode.pl b/vim-mode/vim_mode.pl
index bc8df72..a6244c1 100644
--- a/vim-mode/vim_mode.pl
+++ b/vim-mode/vim_mode.pl
@@ -17,7 +17,7 @@
# * Cursor motion: h l 0 ^ $ <space> f t F T
# * History motion: j k
# * Cursor word motion: w b ge e W gE B E
-# * Word objects (only the following work yet): aW
+# * Word objects (only the following work yet): aw aW
# * Yank and paste: y p P
# * Change and delete: c d
# * Delete at cursor: x X
@@ -817,12 +817,9 @@ sub cmd_movement_a_ {
# aw and aW
if ($char eq 'w' or $char eq 'W') {
- if ($char eq 'w') {
-
- } elsif ($char eq 'W') {
while ($count-- > 0 and length($input) > $pos) {
if (substr($input, $pos, 1) =~ /\s/) {
- # Any whitespace before the WORD must be removed.
+ # Any whitespace before the word/WORD must be removed.
if (not defined $cur_pos) {
$cur_pos = _find_regex_before($input, '\S', $pos, 0);
if ($cur_pos < 0) {
@@ -831,17 +828,52 @@ sub cmd_movement_a_ {
$cur_pos++;
}
}
- # Move before the WORD.
+ # Move before the word/WORD.
if (substr($input, $pos + 1) =~ /^\s+/) {
$pos += $+[0];
}
- # And delete it.
- if (substr($input, $pos + 1) =~ /\s/) {
- $pos += $-[0] + 1;
+ # And delete the word.
+ if ($char eq 'w') {
+ if (substr($input, $pos) =~ /^\s($word+|$non_word+)/) {
+ $pos += $+[0];
+ } else {
+ $pos = length($input);
+ }
+ # WORD
+ } else {
+ if (substr($input, $pos + 1) =~ /\s/) {
+ $pos += $-[0] + 1;
+ } else {
+ $pos = length($input);
+ }
+ }
+
+ # word
+ } elsif ($char eq 'w') {
+ # Start at the beginning of this WORD.
+ if (not defined $cur_pos and $pos > 0 and substr($input, $pos - 1, 2) !~ /(\s.|$word$non_word|$non_word$word)/) {
+
+ $cur_pos = _find_regex_before($input, "^($word+$non_word|$non_word+$word|$word+\\s|$non_word+\\s)", $pos, 1);
+ if ($cur_pos < 0) {
+ $cur_pos = 0;
+ } else {
+ $cur_pos += 2;
+ }
+ }
+ # Delete to the end of the word.
+ if (substr($input, $pos) =~ /^($word+$non_word|$non_word+$word|$word+\s+\S|$non_word+\s+\S)/) {
+ $pos += $+[0] - 1;
} else {
$pos = length($input);
+ # If we are at the end of the line, whitespace before
+ # the word is also deleted.
+ my $new_pos = _find_regex_before($input, "^($word+\\s+|$non_word+\\s+)", $pos, 1);
+ if ($new_pos != -1 and (not defined $cur_pos or $cur_pos > $new_pos + 1)) {
+ $cur_pos = $new_pos + 1;
+ }
}
+ # WORD
} else {
# Start at the beginning of this WORD.
if (not defined $cur_pos and $pos > 0 and
@@ -867,7 +899,6 @@ sub cmd_movement_a_ {
}
}
}
- }
}
return ($cur_pos, $pos);