summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-10-28 02:13:05 +0100
committerBram Moolenaar <Bram@vim.org>2019-10-28 02:13:05 +0100
commit8b530c1ff91f07cf6b0289a536992b7dfbc86598 (patch)
tree6a672624551a6e1a4e07d5274c2149afdd486a35
parent077ff436a77f95c69da219af8cd8f553ff4f9ff8 (diff)
downloadvim-git-8b530c1ff91f07cf6b0289a536992b7dfbc86598.tar.gz
patch 8.1.2231: not easy to move to the middle of a text linev8.1.2231
Problem: Not easy to move to the middle of a text line. Solution: Add the gM command. (Yasuhiro Matsumoto, closes #2070)
-rw-r--r--runtime/doc/index.txt1
-rw-r--r--runtime/doc/motion.txt8
-rw-r--r--runtime/doc/quickref.txt1
-rw-r--r--runtime/doc/usr_25.txt9
-rw-r--r--src/normal.c18
-rw-r--r--src/testdir/test_normal.vim24
-rw-r--r--src/version.c2
7 files changed, 57 insertions, 6 deletions
diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt
index 6b7c82205..d6957f512 100644
--- a/runtime/doc/index.txt
+++ b/runtime/doc/index.txt
@@ -781,6 +781,7 @@ tag char note action in Normal mode ~
|gn| gn 1,2 find the next match with the last used
search pattern and Visually select it
|gm| gm 1 go to character at middle of the screenline
+|gM| gM 1 go to character at middle of the text line
|go| go 1 cursor to byte N in the buffer
|gp| ["x]gp 2 put the text [from register x] after the
cursor N times, leave the cursor after it
diff --git a/runtime/doc/motion.txt b/runtime/doc/motion.txt
index f0935da0e..9ac460a73 100644
--- a/runtime/doc/motion.txt
+++ b/runtime/doc/motion.txt
@@ -1,4 +1,4 @@
-*motion.txt* For Vim version 8.1. Last change: 2019 Jun 02
+*motion.txt* For Vim version 8.1. Last change: 2019 Oct 28
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -227,6 +227,12 @@ g^ When lines wrap ('wrap' on): To the first non-blank
gm Like "g0", but half a screenwidth to the right (or as
much as possible).
+ *gm* *gM*
+gM Like "g0", but to halfway the text of the line.
+ With a count: to this percentage of text in the line.
+ Thus "10gM" is near the start of the text and "90gM"
+ is near the end of the text.
+
*g$* *g<End>*
g$ or g<End> When lines wrap ('wrap' on): To the last character of
the screen line and [count - 1] screen lines downward
diff --git a/runtime/doc/quickref.txt b/runtime/doc/quickref.txt
index fa15bca8d..76067f593 100644
--- a/runtime/doc/quickref.txt
+++ b/runtime/doc/quickref.txt
@@ -47,6 +47,7 @@ N is used to indicate an optional count that can be given before the command.
|g$| N g$ to last character in screen line (differs from "$"
when lines wrap)
|gm| gm to middle of the screen line
+|gM| gM to middle of the line
|bar| N | to column N (default: 1)
|f| N f{char} to the Nth occurrence of {char} to the right
|F| N F{char} to the Nth occurrence of {char} to the left
diff --git a/runtime/doc/usr_25.txt b/runtime/doc/usr_25.txt
index 7f65a852e..1f71f3e35 100644
--- a/runtime/doc/usr_25.txt
+++ b/runtime/doc/usr_25.txt
@@ -346,12 +346,13 @@ scroll:
g0 to first visible character in this line
g^ to first non-blank visible character in this line
- gm to middle of this line
+ gm to middle of screen line
+ gM to middle of the text in this line
g$ to last visible character in this line
- |<-- window -->|
- some long text, part of which is visible ~
- g0 g^ gm g$
+ |<-- window -->|
+ some long text, part of which is visible in one line ~
+ g0 g^ gm gM g$
BREAKING AT WORDS *edit-no-break*
diff --git a/src/normal.c b/src/normal.c
index f66a97c34..17db06a16 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -5979,6 +5979,24 @@ nv_g_cmd(cmdarg_T *cap)
curwin->w_set_curswant = TRUE;
break;
+ case 'M':
+ {
+ char_u *ptr = ml_get_curline();
+
+ oap->motion_type = MCHAR;
+ oap->inclusive = FALSE;
+ if (has_mbyte)
+ i = mb_string2cells(ptr, STRLEN(ptr));
+ else
+ i = (int)STRLEN(ptr);
+ if (cap->count0 > 0 && cap->count0 <= 100)
+ coladvance((colnr_T)(i * cap->count0 / 100));
+ else
+ coladvance((colnr_T)(i / 2));
+ curwin->w_set_curswant = TRUE;
+ }
+ break;
+
case '_':
/* "g_": to the last non-blank character in the line or <count> lines
* downward. */
diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim
index b37f613ed..c4b38b1c6 100644
--- a/src/testdir/test_normal.vim
+++ b/src/testdir/test_normal.vim
@@ -1733,6 +1733,7 @@ fun! Test_normal33_g_cmd2()
set wrap listchars= sbr=
let lineA='abcdefghijklmnopqrstuvwxyz'
let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ let lineC='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
$put =lineA
$put =lineB
@@ -1766,9 +1767,30 @@ fun! Test_normal33_g_cmd2()
call assert_equal(15, col('.'))
call assert_equal('l', getreg(0))
+ norm! 2ggdd
+ $put =lineC
+
+ " Test for gM
+ norm! gMyl
+ call assert_equal(73, col('.'))
+ call assert_equal('0', getreg(0))
+ " Test for 20gM
+ norm! 20gMyl
+ call assert_equal(29, col('.'))
+ call assert_equal('S', getreg(0))
+ " Test for 60gM
+ norm! 60gMyl
+ call assert_equal(87, col('.'))
+ call assert_equal('E', getreg(0))
+
+ " Test for g Ctrl-G
+ set ff=unix
+ let a=execute(":norm! g\<c-g>")
+ call assert_match('Col 87 of 144; Line 2 of 2; Word 1 of 1; Byte 88 of 146', a)
+
" Test for gI
norm! gIfoo
- call assert_equal(['', 'fooabcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
+ call assert_equal(['', 'foo0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'], getline(1,'$'))
" Test for gi
wincmd c
diff --git a/src/version.c b/src/version.c
index 07a8cd9e5..99f15701b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2231,
+/**/
2230,
/**/
2229,