mirror of
https://github.com/neovim/neovim.git
synced 2025-09-23 19:48:32 +00:00
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:

committed by
Justin M. Keyes

parent
efaf4732e2
commit
471427d045
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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*
|
||||||
|
@@ -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. */
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user