Как мне переместить курсор в центр текущей строки?

17

Есть ли способ, которым я могу переместить курсор в середину текущей строки? (середина строки текста - не середина ширины экрана)

Мне было интересно, есть ли ярлык, аналогичный тому, Mкоторый перемещает курсор в середину экрана.

РЕДАКТИРОВАТЬ : Добавлено пояснение в скобках

thameera
источник
2
Так середина полной строки или середина ширины экрана?
Муру
@muru Думал о середине полной строки
thameera
2
Не могли бы вы добавить это и к вопросу? А что вы ожидаете от упаковки?
Муру

Ответы:

16

Я не знаю какой-либо встроенный способ сделать это, однако, вы можете легко иметь карту, чтобы сделать это:

nnoremap µ :exe 'normal! '.(virtcol('$')/2).'\|'<cr>

@ Инго Каркат предложил следующий вариант, который также работает в VISUAL-режиме.

noremap <expr> gM (virtcol('$') / 2) . '<Bar>'

К сожалению, это также срабатывает в режиме SELECT. Как следствие, я предпочитаю пару:

nnoremap <expr> gM (virtcol('$') / 2) . '<Bar>'
xnoremap <expr> gM (virtcol('$') / 2) . '<Bar>'
Люк Эрмитт
источник
3
Этот вариант также будет корректно работать в визуальном режиме:noremap <expr> gM (virtcol('$') / 2) . '<Bar>'
Инго Каркат
15

Встроенный gmделает именно это.

tommcdo
источник
7
Обратите внимание, что это приведет вас к середине строки относительно ширины консоли , а не относительно длины линии . Итак, если у вас есть строка из 10 символов и консоль шириной 80 символов, курсор окажется на 10-м символе в строке (потому что он «пытается» добраться до 40-го), а не на 5-м.
Апнортон
3
Ага. Из вопроса не ясно, ищем ли мы середину линии или середину экрана. Исходя из аналогии M, я предположил экран.
Tommcdo
1
На самом деле я только что попробовал это на широком (около 180 символов) экране с текстом из 80 символов. Курсор переместился в конец строки. Не кажется очень полезной командой.
Бен
@Ben Дошло ли оно до конца строки или как можно ближе к центру ширины экрана? Попробуйте с линией, которая более чем на 50% шириной экрана, или попробуйте :set virtualedit=all.
8bittree
Да, но ОП запрашивала команду для перехода к середине текста строки, а не к середине экрана. Так что это не отвечает на вопрос.
Бен
3

Чтобы добавить к ответу Люка, есть также плагин Easymotion , который позволяет быстро перемещаться в определенную позицию. Нажатие <Leader><Leader>wвыделит, какую клавишу вы можете нажать, чтобы перейти к определенному слову. Таким образом, вы можете легко перейти к слову в середине текущей строки.

daanavitch
источник
1

Если вы хотите перейти к середине текста (без учета пробелов в начале строки), это будет работать:

function! s:Gm()
  execute 'normal! ^'
  let first_col = virtcol('.')
  execute 'normal! g_'
  let last_col  = virtcol('.')
  execute 'normal! ' . (first_col + last_col) / 2 . '|'
endfunction
nnoremap <silent> gm :call <SID>Gm()<CR>

Я не думаю, что это будет работать в визуальном режиме, однако.

user11824
источник