vim-patch:8.1.2231: introduce gM command #11321

Problem:    Not easy to move to the middle of a text line.
Solution:   Add the gM command. (Yasuhiro Matsumoto, closes vim/vim#2070)
8b530c1ff9
This commit is contained in:
Jan Edmund Lazo
2019-11-01 00:43:20 -04:00
committed by Justin M. Keyes
parent efaf4732e2
commit 471427d045
6 changed files with 52 additions and 5 deletions

View File

@@ -767,6 +767,7 @@ tag char note action in Normal mode ~
|gn| gn 1,2 find the next match with the last used |gn| gn 1,2 find the next match with the last used
search pattern and Visually select it 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 screenline
|gM| gM 1 go to character at middle of the text line
|go| go 1 cursor to byte N in the buffer |go| go 1 cursor to byte N in the buffer
|gp| ["x]gp 2 put the text [from register x] after the |gp| ["x]gp 2 put the text [from register x] after the
cursor N times, leave the cursor after it cursor N times, leave the cursor after it

View File

@@ -219,6 +219,12 @@ g^ When lines wrap ('wrap' on): To the first non-blank
gm Like "g0", but half a screenwidth to the right (or as gm Like "g0", but half a screenwidth to the right (or as
much as possible). much as possible).
*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$* *g<End>*
g$ or g<End> When lines wrap ('wrap' on): To the last character of g$ or g<End> When lines wrap ('wrap' on): To the last character of
the screen line and [count - 1] screen lines downward the screen line and [count - 1] screen lines downward

View File

@@ -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 "$" |g$| N g$ to last character in screen line (differs from "$"
when lines wrap) when lines wrap)
|gm| gm to middle of the screen line |gm| gm to middle of the screen line
|gM| gM to middle of the line
|bar| N | to column N (default: 1) |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 right
|F| N F{char} to the Nth occurrence of {char} to the left |F| N F{char} to the Nth occurrence of {char} to the left

View File

@@ -346,12 +346,13 @@ scroll:
g0 to first visible character in this line g0 to first visible character in this line
g^ to first non-blank 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 g$ to last visible character in this line
|<-- window -->| |<-- window -->|
some long text, part of which is visible ~ some long text, part of which is visible in one line ~
g0 g^ gm g$ g0 g^ gm gM g$
BREAKING AT WORDS *edit-no-break* BREAKING AT WORDS *edit-no-break*

View File

@@ -6749,6 +6749,22 @@ static void nv_g_cmd(cmdarg_T *cap)
curwin->w_set_curswant = true; curwin->w_set_curswant = true;
break; break;
case 'M':
{
const char_u *const ptr = get_cursor_line_ptr();
oap->motion_type = kMTCharWise;
oap->inclusive = false;
i = (int)mb_string2cells_len(ptr, 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 '_': case '_':
/* "g_": to the last non-blank character in the line or <count> lines /* "g_": to the last non-blank character in the line or <count> lines
* downward. */ * downward. */

View File

@@ -1895,6 +1895,7 @@ fun! Test_normal33_g_cmd2()
set wrap listchars= sbr= set wrap listchars= sbr=
let lineA='abcdefghijklmnopqrstuvwxyz' let lineA='abcdefghijklmnopqrstuvwxyz'
let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
let lineC='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
$put =lineA $put =lineA
$put =lineB $put =lineB
@@ -1928,9 +1929,30 @@ fun! Test_normal33_g_cmd2()
call assert_equal(15, col('.')) call assert_equal(15, col('.'))
call assert_equal('l', getreg(0)) 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 " Test for gI
norm! gIfoo norm! gIfoo
call assert_equal(['', 'fooabcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$')) call assert_equal(['', 'foo0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'], getline(1,'$'))
" Test for gi " Test for gi
wincmd c wincmd c