Como movo o cursor para o centro da linha atual?

17

Existe uma maneira de mover meu cursor para o meio da linha atual? (no meio da linha de texto - não no meio da largura da tela)

Fiquei me perguntando se havia um atalho semelhante ao Mque move o cursor para o meio da tela.

EDIT : Adicionado esclarecimento entre parênteses

thameera
fonte
2
Então, é meio meio da linha completa ou meio da largura da tela?
Muru
@muru Foi pensando em meados de linha completa
thameera
2
Você poderia adicionar isso à pergunta também? E o que você espera que aconteça com a embalagem?
Muru

Respostas:

16

Não conheço nenhuma maneira embutida de fazer isso, no entanto, você pode facilmente ter um mapa para fazê-lo:

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

A @Ingo Karkat propôs a seguinte variante que também funciona no modo VISUAL.

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

Infelizmente, também é acionado no modo SELECT. Como conseqüência, eu prefiro o casal:

nnoremap <expr> gM (virtcol('$') / 2) . '<Bar>'
xnoremap <expr> gM (virtcol('$') / 2) . '<Bar>'
Luc Hermitte
fonte
3
Esta variante também irá funcionar correctamente para o modo visual:noremap <expr> gM (virtcol('$') / 2) . '<Bar>'
Ingo Karkat
15

O built-in gmfaz exatamente isso.

tommcdo
fonte
7
Observe que isso leva você ao meio da linha em relação à largura do console , não em relação ao comprimento da linha . Portanto, se você tiver uma linha de 10 caracteres e um console com 80 caracteres de largura, o cursor terminará no 10º caractere da linha (porque está "tentando" chegar ao 40º), não ao 5º.
apnorton
3
Sim. Da questão, não está claro se estamos procurando o meio da linha ou o meio da tela. Com base na analogia M, assumi a tela.
tommcdo
1
Na verdade, eu tentei isso em uma tela ampla (cerca de 180 caracteres) com texto de 80 caracteres. O cursor foi para o final da linha. Não parece um comando muito útil.
217 Ben
@ Ben Foi para o final da linha ou foi o mais próximo possível do centro da largura da tela? Experimente com uma linha com mais de 50% da largura da tela ou com :set virtualedit=all.
precisa saber é o seguinte
Sim, mas o OP estava pedindo um comando para pular para o meio do texto da linha, não para o meio da tela. Portanto, não responde à pergunta.
Ben
3

Para adicionar à resposta de Luc, também há o plug- in Easymotion , que facilita a mudança rápida para uma posição específica. Pressionar <Leader><Leader>wdestacará a tecla que você pode pressionar para ir para uma palavra específica. Dessa forma, você pode facilmente mudar para uma palavra no meio da linha atual.

daanavitch
fonte
1

Se você deseja ir para o meio do texto (sem levar em consideração o espaço em branco no início da linha), isso funcionará:

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>

Eu não acho que isso funcionará no modo visual, no entanto.

user11824
fonte