about summary refs log tree commit diff
path: root/edit.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--edit.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/edit.c b/edit.c
index 4a2008d..d2c3a91 100644
--- a/edit.c
+++ b/edit.c
@@ -250,6 +250,21 @@ static int viInsert(struct Edit *e, wchar_t ch) {
 	return 0;
 }
 
+static size_t viMotion(struct Edit *e, wchar_t ch) {
+	unsigned count = (e->vi.count ?: 1);
+	switch (ch) {
+		break; case L'$': return (e->len ? e->len - 1 : 0);
+		break; case L'0': return 0;
+		break; case L'h': case Erase: {
+			return (e->pos > count ? e->pos - count : 0);
+		}
+		break; case L'l': case L' ': {
+			return (e->pos + count < e->len ? e->pos + count : e->len - 1);
+		}
+	}
+	return e->pos;
+}
+
 static int viCommand(struct Edit *e, wchar_t ch) {
 	if ((ch >= L'1' && ch <= L'9') || (e->vi.count && ch == L'0')) {
 		e->vi.count *= 10;
@@ -259,14 +274,16 @@ static int viCommand(struct Edit *e, wchar_t ch) {
 	e->vi.verb = ch;
 	switch (ch) {
 		break; case Esc: viEscape(e);
-		break; case L'$': if (e->len) e->pos = e->len - 1; viEscape(e);
-		break; case L'0': e->pos = 0; viEscape(e);
 		break; case L'A': e->pos = e->len; e->vi.mode = Insert;
 		break; case L'I': e->pos = 0; e->vi.mode = Insert;
 		break; case L'R': e->vi.mode = Insert;
 		break; case L'a': if (e->len) e->pos++; e->vi.mode = Insert;
 		break; case L'i': e->vi.mode = Insert;
 		break; case L'r': e->vi.mode = Insert;
+		break; default: {
+			e->pos = viMotion(e, ch);
+			viEscape(e);
+		}
 	}
 	return 0;
 }
@@ -442,6 +459,14 @@ int main(void) {
 	assert(eq(&e, "\0foo bar"));
 	vi(&e, "$");
 	assert(eq(&e, "foo ba\0r"));
+	vi(&e, "h");
+	assert(eq(&e, "foo b\0ar"));
+	vi(&e, "l");
+	assert(eq(&e, "foo ba\0r"));
+	vi(&e, "99h");
+	assert(eq(&e, "\0foo bar"));
+	vi(&e, "99l");
+	assert(eq(&e, "foo ba\0r"));
 }
 
 #endif /* TEST */
t-pink/commit/filters/syntax-highlighting.py?id=ceffeb5d52609a38c5d5d410456d796673fe8461&follow=1'>filters: Improved syntax-highlighting.pyStefan Tatschner 2014-01-12tests: add CGIT_TEST_OPTS variable to MakefileJohn Keeping 2014-01-12ui-repolist: HTML-escape cgit_rooturl() responseJohn Keeping 2014-01-12ui-shared: URL-escape script_nameJohn Keeping 2014-01-12ui-refs: escape HTML chars in author and tagger namesJohn Keeping 2014-01-12filter: pass extra arguments via cgit_open_filterJohn Keeping 2014-01-12ui-snapshot: set unused cgit_filter fields to zeroJohn Keeping 2014-01-12html: remove redundant htmlfd variableJohn Keeping 2014-01-12tests: add Valgrind supportJohn Keeping 2014-01-12cache: don't leave cache_slot fields uninitializedJohn Keeping 2014-01-10filter: split filter functions into their own fileJason A. Donenfeld 2014-01-10filter: make exit status localJason A. Donenfeld 2014-01-10parsing: fix header typoJason A. Donenfeld 2014-01-10cgit.c: Fix comment on bit mask hackLukas Fleischer 2014-01-10cgit.c: Use "else" for mutually exclusive branchesLukas Fleischer 2014-01-10ui-snapshot.c: Do not reinvent suffixcmp()Lukas Fleischer 2014-01-10Refactor cgit_parse_snapshots_mask()Lukas Fleischer 2014-01-10Disallow use of undocumented snapshot delimitersLukas Fleischer 2014-01-10Replace most uses of strncmp() with prefixcmp()Lukas Fleischer 2014-01-09README: Fix dependenciesLukas Fleischer 2014-01-08README: Spelling and formatting fixesLukas Fleischer 2014-01-08Fix UTF-8 with syntax-highlighting.pyPřemysl Janouch 2014-01-08Add a suggestion to the manpagePřemysl Janouch 2014-01-08Fix the example configurationPřemysl Janouch 2014-01-08Fix about-formatting.shPřemysl Janouch 2014-01-08Fix some spelling errorsPřemysl Janouch 2014-01-08filters: highlight.sh: add css comments for highlight 2.6 and 3.8Ferry Huberts