163 votes

Comment changer le curseur entre les modes Normal et Insertion dans Vim ?

J'aimerais savoir comment changer, si possible, le curseur dans Vim (en couleur, forme, etc.) en fonction du mode dans lequel on se trouve.

J'oublie constamment que je ne suis pas en mode Insertion et je commence à taper du code, ce qui entraîne toutes sortes de choses bizarres. Il serait utile qu'il y ait une sorte d'indication visuelle sur le curseur.

29 votes

Je vous suggère d'apprendre une règle : arrêter de taper => sortir du mode insertion. Ainsi, vous n'observerez jamais une situation où vous avez oublié que vous n'êtes pas en mode insertion.

7 votes

@ZyX sauf quand vous oubliez de quitter le mode insertion après avoir arrêté de taper :p

13 votes

@ZyX c'est une bonne règle et je l'ai toujours fait, mais les indicateurs visuels sont toujours importants. La marijuana est légale maintenant et j'oublie tout le temps ce que je fais.

157voto

hcris Points 9359

Ce qui suit fonctionne dans xterm, urxvt et d'autres émulateurs de terminal sous Linux ; iTerm2 sous macOS ; Git Bash avec ConEmu sous Windows ; et plus encore (voir les commentaires) :

let &t_SI = "\e[6 q"
let &t_EI = "\e[2 q"

" reset the cursor on start (for older versions of vim, usually not required)
augroup myCmds
au!
autocmd VimEnter * silent !echo -ne "\e[2 q"
augroup END

Autres options (remplacer le numéro après \e[ ):

Ps = 0  -> blinking block.
Ps = 1  -> blinking block (default).
Ps = 2  -> steady block.
Ps = 3  -> blinking underline.
Ps = 4  -> steady underline.
Ps = 5  -> blinking bar (xterm).
Ps = 6  -> steady bar (xterm).

Lorsque vous utilisez tmux il est important de l'utiliser comme cela (sans l'option \<Esc>Ptmux; escape). tmux gardera la trace de la forme correcte du curseur lorsque vous changez de fenêtre/panneau.

Si cela ne fonctionne pas pour vous, essayez soit de définir TERM=xterm-256color avant de démarrer tmux, ou ajoutez ceci à votre fichier .tmux.conf ( Merci @Steven Lu ):

set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'

4 votes

Fonctionne très bien dans l'alacrité maintenant

0 votes

Fonctionne parfaitement dans xfce4-terminal

0 votes

@Charles Pour savoir pourquoi cela ne fonctionne pas avec putty, voir ceci : superuser.com/questions/304318/

136voto

ib. Points 14520

Une approche populaire pour indiquer le passage du mode Insertion à l'autre est la suivante de basculer le cursorline qui permet de déterminer si la ligne courante de l'écran est mise en évidence (voir :help cursorline ):

:autocmd InsertEnter,InsertLeave * set cul!

ou, alternativement :

:autocmd InsertEnter * set cul
:autocmd InsertLeave * set nocul

Modifiez le CursorLine groupe de surbrillance pour modifier le style de la ligne du curseur à votre convenance (cf. :help :highlight et :help highlight-groups ).

9 votes

J'ai aussi réglé cul pour qu'il y ait un fond clair au lieu du soulignement par défaut : hi CursorLine cterm=NONE ctermbg=black

1 votes

Y a-t-il une raison pour que cela ne fonctionne pas dans le vim de Cygwin ? Je suis dans l'éditeur et j'ai entré les deux ensembles de lignes, et je n'ai pas été en mesure de définir une sorte de surlignage, au-delà du surlignage complet des colonnes ou des lignes.

1 votes

@Tankor : Le cursorline ne dépend d'aucune capacité spécifique à une plate-forme ; elle est disponible sur toute instance de Vim compilée avec l'option +syntax (ce qui est généralement le cas).

33voto

Alex Ventura Points 1390

Je ne sais pas si quelqu'un d'autre fait face à un retard après avoir frappé le Esc pour revenir au mode normal et afficher le curseur de bloc, mais si c'est le cas, c'est aussi la façon dont je le règle.

En fait, j'utilise iTerm2 et j'utilise Vim dans mon terminal sous macOS. En entrant en mode insertion, le curseur reste un bloc et c'est un peu déroutant de savoir si on est en mode insertion ou en mode normal.

Je voulais afficher une ligne fine comme curseur en mode insertion et revenir au bloc en mode normal comme le fait MacVim. Et pour ce faire, c'est assez simple, il suffit d'ajouter ceci à mon fichier .vimrc en tant que décrit ici :

let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_SR = "\<Esc>]50;CursorShape=2\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"

enter image description here

Mais comme vous pouvez le voir, il y a eu un retard lorsque vous avez frappé ESC pour quitter le mode insertion et revenir au mode normal et afficher à nouveau le bloc comme curseur. Pour résoudre ce problème, j'ai trouvé ceci :

set ttimeout
set ttimeoutlen=1
set ttyfast

Et maintenant ça marche plutôt bien comme vous pouvez le voir :

fix delay going back to block as cursor

J'espère que cela pourra aider quelqu'un d'autre !

2 votes

Le décalage du changement de mode me dérangeait depuis longtemps. Je vous remercie !

2 votes

@leedreit même chose pour moi jusqu'à ce que je trouve cette solution de contournement !

20voto

Intentss Points 4591

Si vous utilisez tmux y iTerm2 en macOS ,
ce qui suit fait passer le curseur d'un bloc à un curseur et met en surbrillance la ligne courante

if exists('$TMUX')
  let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=1\x7\<Esc>\\"
  let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=0\x7\<Esc>\\"
else
  let &t_SI = "\<Esc>]50;CursorShape=1\x7"
  let &t_EI = "\<Esc>]50;CursorShape=0\x7"
endif
:autocmd InsertEnter * set cul
:autocmd InsertLeave * set nocul

crédit : https://gist.github.com/andyfowler/1195581

1 votes

A noter qu'il s'agit de spécifique à iTerm . Étant donné que les terminaux standard fonctionnent également dans tous les autres terminaux de support, il s'agit probablement d'une mauvaise réponse. Regardez ici --> stackoverflow.com/a/42118416/340947

0 votes

@StevenLu En fait, la réponse que vous avez suggérée ne fonctionnait pas pour iTerm2 (Mac), alors que celle-ci a fonctionné. Ce genre de choses est plus compliqué que vous ne le pensez.

0 votes

Le curseur est certainement l'une des choses les plus délicates qui soient. Je viens de réaliser que je ne pense même pas avoir une configuration correcte, car tmux ne semble pas effectuer le suivi de l'état du curseur, ce que certaines réponses indiquent comme étant une possibilité. J'étais bien assez content pour que vim gère la mise en place du curseur sur une ligne en mode insertion.

13voto

IvanGL Points 511

Pour modifier la forme du curseur dans différents modes, vous pouvez ajouter ce qui suit dans votre fichier .vimrc fichier.

Pour le terminal GNOME (version 2.26) :

if has("autocmd")
  au InsertEnter * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape ibeam"
  au InsertLeave * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape block"
  au VimLeave * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape ibeam"
endif

Si vous utilisez plus d'un profil dans le terminal GNOME, vous devrez peut-être l'adapter à vos profils.

Pour Konsole dans KDE4 :

let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"

Cela fonctionne avec plusieurs onglets et Windows.

Voir aussi : " Modifier la forme du curseur dans différents modes " sur Wiki d'astuces Vim .

14 votes

J'utilise principalement vim dans tmux via ssh avec putty. Existe-t-il une option plus universelle ?

0 votes

Ça a marché comme sur des roulettes. Merci.

1 votes

Modifier les paramètres de gnome-terminal via une commande gconftool-2 est une très mauvaise idée. Cela n'influence pas seulement le terminal où s'exécute votre vim, mais aussi tous les autres onglets gnome-terminal actuels et futurs du même profil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X