Comment déplacer le curseur au centre de la ligne actuelle?

17

Existe-t-il un moyen de déplacer mon curseur au milieu de la ligne actuelle? (le milieu de la ligne de texte - pas le milieu de la largeur de l'écran)

Je me demandais s'il y avait un raccourci similaire à Mcelui qui déplace le curseur au milieu de l'écran.

EDIT : Ajout de clarifications entre parenthèses

thameera
la source
2
Est-ce que le milieu du milieu de la ligne complète ou le milieu de la largeur de l'écran?
muru
@muru Pensait au milieu de la ligne complète
thameera
2
Pourriez-vous ajouter cela à la question également? Et que pensez-vous qu'il advienne de l'emballage?
muru

Réponses:

16

Je ne connais aucun moyen intégré de le faire, cependant, vous pouvez facilement avoir une carte pour le faire:

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

@Ingo Karkat a proposé la variante suivante qui fonctionne également en mode VISUEL.

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

Malheureusement, il est également déclenché en mode SELECT. En conséquence, je préfère le couple:

nnoremap <expr> gM (virtcol('$') / 2) . '<Bar>'
xnoremap <expr> gM (virtcol('$') / 2) . '<Bar>'
Luc Hermitte
la source
3
Cette variante fonctionnera également correctement pour le mode visuel:noremap <expr> gM (virtcol('$') / 2) . '<Bar>'
Ingo Karkat
15

L'intégré gmfait exactement cela.

tommcdo
la source
7
Notez que cela vous amène au milieu de la ligne par rapport à la largeur de la console , pas par rapport à la longueur de la ligne . Donc, si vous avez une ligne de 10 caractères et une console de 80 caractères de large, le curseur se retrouvera sur le 10e caractère de la ligne (car il "essaie" d'arriver au 40e), pas sur le 5e.
apnorton
3
Oui. D'après la question, il n'est pas clair si nous recherchons le milieu de la ligne ou le milieu de l'écran. Sur la base de l'analogie avec M, je suppose que l'écran.
tommcdo
1
En fait, je viens d'essayer ceci sur un écran large (environ 180 caractères) avec un texte de 80 caractères. Le curseur est allé à la fin de la ligne. Ne semble pas une commande très utile.
Ben
@Ben At-il atteint la fin de la ligne, ou est-il allé aussi près que possible du centre de la largeur de l'écran? Essayez-le avec une ligne plus de 50% aussi large que l'écran, ou essayez-le avec :set virtualedit=all.
8bittree
Oui, mais l'OP demandait une commande pour passer au milieu du texte de la ligne, pas au milieu de l'écran. Cela ne répond donc pas à la question.
Ben
3

Pour ajouter à la réponse de Luc, il y a aussi le plugin Easymotion , qui rend le déplacement rapide vers une position spécifique un jeu d'enfant. Appuyez sur <Leader><Leader>wpour mettre en surbrillance la touche sur laquelle vous pouvez appuyer pour passer à un mot spécifique. De cette façon, vous pouvez facilement passer à un mot au milieu de la ligne actuelle.

daanavitch
la source
1

Si vous voulez aller au milieu du texte (sans tenir compte des espaces au début de la ligne), cela fonctionnera:

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>

Cependant, je ne pense pas que cela fonctionnera en mode visuel.

user11824
la source