aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core-commands.c3
-rw-r--r--src/move-commands.c36
-rw-r--r--src/move-commands.h3
3 files changed, 38 insertions, 4 deletions
diff --git a/src/core-commands.c b/src/core-commands.c
index f39f6f9..4abf38b 100644
--- a/src/core-commands.c
+++ b/src/core-commands.c
@@ -659,7 +659,8 @@ teco_state_start_input(teco_machine_main_t *ctx, gunichar chr, GError **error)
['R'] = {&teco_state_start, teco_state_start_reverse},
['L'] = {&teco_state_start, teco_state_start_line},
['B'] = {&teco_state_start, teco_state_start_back},
- ['W'] = {&teco_state_start, teco_state_start_word},
+ ['W'] = {&teco_state_start, teco_state_start_words},
+ ['P'] = {&teco_state_start, teco_state_start_words_back},
['V'] = {&teco_state_start, teco_state_start_delete_words},
['Y'] = {&teco_state_start, teco_state_start_delete_words_back},
['='] = {&teco_state_start, teco_state_start_print},
diff --git a/src/move-commands.c b/src/move-commands.c
index 8abd8ca..5339f24 100644
--- a/src/move-commands.c
+++ b/src/move-commands.c
@@ -316,7 +316,7 @@ teco_find_words(gsize *pos, teco_int_t n)
}
/*$ W word
- * [n]W -- Move dot by words
+ * [n]W -- Move dot <n> words forwards
* -W
* [n]:W -> Success|Failure
*
@@ -337,7 +337,7 @@ teco_find_words(gsize *pos, teco_int_t n)
* If colon-modified it instead returns a condition code.
*/
void
-teco_state_start_word(teco_machine_main_t *ctx, GError **error)
+teco_state_start_words(teco_machine_main_t *ctx, GError **error)
{
teco_int_t v;
if (!teco_expressions_pop_num_calc(&v, teco_num_sign, error))
@@ -360,6 +360,38 @@ teco_state_start_word(teco_machine_main_t *ctx, GError **error)
teco_expressions_push(TECO_SUCCESS);
}
+/*$ P
+ * [n]P -- Move dot <n> words backwards
+ * -P
+ * [n]:P -> Success|Failure
+ *
+ * Move dot to the beginning of preceding words.
+ * It is equivalent to \(lq-nW\(rq.
+ */
+void
+teco_state_start_words_back(teco_machine_main_t *ctx, GError **error)
+{
+ teco_int_t v;
+ if (!teco_expressions_pop_num_calc(&v, teco_num_sign, error))
+ return;
+ sptr_t pos = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0);
+
+ gsize word_pos = pos;
+ if (!teco_find_words(&word_pos, -v)) {
+ if (!teco_machine_main_eval_colon(ctx))
+ teco_error_move_set(error, "P");
+ else
+ teco_expressions_push(TECO_FAILURE);
+ return;
+ }
+
+ if (teco_current_doc_must_undo())
+ undo__teco_interface_ssm(SCI_GOTOPOS, pos, 0);
+ teco_interface_ssm(SCI_GOTOPOS, word_pos, 0);
+ if (teco_machine_main_eval_colon(ctx) > 0)
+ teco_expressions_push(TECO_SUCCESS);
+}
+
static gboolean
teco_delete_words(teco_int_t n)
{
diff --git a/src/move-commands.h b/src/move-commands.h
index 36acec8..9dddc8d 100644
--- a/src/move-commands.h
+++ b/src/move-commands.h
@@ -28,7 +28,8 @@ void teco_state_start_reverse(teco_machine_main_t *ctx, GError **error);
void teco_state_start_line(teco_machine_main_t *ctx, GError **error);
void teco_state_start_back(teco_machine_main_t *ctx, GError **error);
-void teco_state_start_word(teco_machine_main_t *ctx, GError **error);
+void teco_state_start_words(teco_machine_main_t *ctx, GError **error);
+void teco_state_start_words_back(teco_machine_main_t *ctx, GError **error);
void teco_state_start_delete_words(teco_machine_main_t *ctx, GError **error);
void teco_state_start_delete_words_back(teco_machine_main_t *ctx, GError **error);