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

107

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

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

Lanrat
la source
19
Je vous suggère d'apprendre une règle: arrêter de taper => quitter le mode insertion. Alors vous n'observerez jamais une situation où vous avez oublié que vous n'êtes pas en mode insertion.
ZyX
2
@ZyX sauf lorsque vous oubliez de quitter le mode insertion après avoir arrêté de taper: p
gented
3
@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.
felwithe le

Réponses:

107

Une option populaire pour indiquer le basculement vers et depuis le mode Insertion est de basculer l' cursorlineoption, qui est responsable de savoir si la ligne d'écran actuelle est mise en surbrillance (voir :help cursorline):

:autocmd InsertEnter,InsertLeave * set cul!

Ou bien,

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

Modifiez le CursorLinegroupe de surbrillance pour changer le style de la ligne du curseur à votre guise (voir :help :highlightet :help highlight-groups).

ib.
la source
5
J'ai également mis cul à higlight bg au lieu du soulignement par défaut: hi CursorLine cterm = NONE ctermbg = black
Nikita Prokopov
Y a-t-il une raison pour laquelle cela ne fonctionnerait 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 mise en évidence, au-delà de la colonne complète ou de la mise en évidence de la ligne
TankorSmash
@Tankor: L' cursorlineoption ne dépend d'aucune capacité spécifique à la plate-forme; il est disponible sur n'importe quelle instance de Vim compilée avec la +syntaxfonctionnalité (ce qui est généralement le cas).
ib.
Bien sûr, enregistrez-le dans votre ~ / .vimrc pour une permanence comme zo:echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
alchemy le
75

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

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

" Optionally reset the cursor on start:
augroup myCmds
au!
autocmd VimEnter * silent !echo -ne "\e[2 q"
augroup END

Autres options (remplacez 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 ça (sans \<Esc>Ptmux;échapper). tmux gardera une trace de la forme correcte du curseur lorsque vous changez de fenêtre / de volet.

Si cela ne fonctionne pas pour vous, essayez soit de définir TERM=xterm-256coloravant de démarrer tmux, soit d'ajouter ceci à votre .tmux.conf( merci @Steven Lu ):

set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'
laktak
la source
2
Fonctionne très bien dans alacritty maintenant
Steven Lu
Fonctionne parfaitement dans xfce4-terminal
korst1k
@Charles Pourquoi cela ne fonctionne pas dans le mastic, voir ceci: superuser.com/questions/304318/…
WesternGun
1
Ma mise à jour: travailler enfin avec set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'dans ma configuration tmux. Apparemment, si vous utilisez setpour terminal-overridessans -a, il remplacera le paramètre, qui l'a déjà par défaut.
Steven Lu
1
la solution a un retard important pour changer de forme du mode insertion au mode normal sur un terminal simple (st suckless)
daGo
16

Si vous utilisez tmux et iTerm2 sur macOS ,
ce qui suit change le curseur d'un bloc en curseur et met en surbrillance la ligne actuelle

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

Intentions
la source
1
Notez que ceci est spécifique à iTerm . Étant donné que les terminaux standard fonctionnent également mais fonctionnent également dans tous les autres terminaux de support, c'est probablement la mauvaise réponse. Regardez ici -> stackoverflow.com/a/42118416/340947
Steven Lu
@StevenLu en fait celui de votre réponse suggérée ne fonctionnait pas pour iTerm2 (Mac), alors que celui-ci fonctionnait. Ce truc est plus compliqué que vous ne le pensez.
CS
Ce truc de curseur est certainement l'une des choses les plus compliquées. Je viens de réaliser que je ne pense même pas avoir une configuration appropriée, car tmux ne semble pas effectuer le suivi de l'état du curseur, ce que certaines réponses indiquent comme une possibilité. J'étais assez content de demander à vim de gérer le réglage du curseur sur une ligne en mode insertion.
Steven Lu
J'ai compris ce truc. La solution consiste à modifier tmux pour le gérer correctement, et cela peut ne pas être évident. Ce que je devais faire était de m'assurer que ma configuration tmux terminal-overridesétait uniquement ajoutée à, afin de ne pas écraser la ,*:Ss=\E[%p1%d q:Se=\E[2 qpartie de terminal-overrides. donc ma configuration ressemble à set -sa terminal-overrides ",xterm-256color-italic:Tc"(pour définir la couleur 24 bits permettant sans piétiner les styles de curseur Ss / Se.
Steven Lu
13

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

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 GNOME Terminal, 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 fenêtres.

Voir aussi: « Changer la forme du curseur dans différents modes » sur le wiki Vim Tips .

IvanGL
la source
13
J'utilise principalement vim dans tmux plutôt que ssh avec du mastic. Existe-t-il une option plus universelle?
lanrat
A fonctionné comme un charme. Merci.
Ernest
1
Changer 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 sur lequel s'exécute votre vim, mais également tous les autres onglets gnome-terminal actuels et futurs du même profil.
egmont le
cela fonctionne pour konsole, merci. Mais un problème est que quitter le mode d'insertion est lent, je ne sais pas pourquoi
Hoang Tran
1
@HoangTran useset ttimeoutlen=0
Bananach
10

Vous pouvez essayer le plugin Terminus Vim :

En mode insertion, la forme du curseur se transforme en une fine barre verticale. En mode remplacement, il se transforme en soulignement. En revenant au mode normal, il revient à la forme standard de "bloc".

Tim Gabets
la source
Cela semble être la solution la plus judicieuse. Il devrait y avoir un: set pour cela directement dans VIM, standard.
user12711
Exigences: gnome-terminal ( wiki.gnome.org/Apps/Terminal ) et autres terminaux utilisant la bibliothèque VTE ( github.com/GNOME/vte ): partiellement pris en charge (par exemple, prend en charge les changements de forme de curseur mais pas le rapport de focus). Dans mon cas (gnome-terminal 3.6.2) cela ne fonctionne pas du tout.
daGo
8

Je trouve utile de ne faire clignoter le curseur qu'en mode Insertion et de le garder statique dans les autres modes.

set guicursor+=n-v-c:blinkon0
user41365
la source
2

Je ne sais pas si quelqu'un d'autre est confronté à un délai après avoir appuyé sur la Esctouche pour revenir en mode normal pour afficher le curseur de bloc, mais si c'est le cas, c'est ainsi que je le corrige aussi.

En fait, j'utilise iTerm2 et Vim dans mon terminal sous macOS. Et lorsque vous entrez en mode insertion, le curseur est toujours un bloc et est un peu déroutant lorsque vous êtes en mode insertion ou en mode normal.

Je voulais montrer une fine ligne 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 .vimrcfichier comme 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"

entrez la description de l'image ici

Mais comme vous pouvez le voir, il y a eu un délai lors de la frappe ESCpour quitter le mode d'insertion pour revenir au mode normal et afficher à nouveau le bloc comme curseur. Donc, pour le réparer, j'ai trouvé ceci:

set ttimeout
set ttimeoutlen=1
set listchars=tab:>-,trail:~,extends:>,precedes:<,space:.
set ttyfast

Et maintenant, cela fonctionne assez bien comme vous pouvez le voir:

correction du délai de retour au bloc en tant que curseur

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

alexventuraio
la source
1

Je ne pense pas que cela ajoute beaucoup aux réponses que d'autres personnes ont déjà fournies, mais je voulais en quelque sorte résumer les choses en un seul endroit et avoir également des liens vers les références pertinentes.

Voici à quoi ressemble l'extrait de code pertinent de mon .vimrc:

    " Cursor appearance
    "
    " See also: [1]'ANSI Control Functions Summary', [2]DECSCUSR, [3]xterm+tmux
    "   entry in terminfo.src.
    " [1] https://www.vt100.net/docs/vt510-rm/chapter4.html
    " [2] https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
    " [3] https://raw.githubusercontent.com/mirror/ncurses/master/misc/terminfo.src
    "
    " On:
    " - entered insert mode
    let &t_SI = "^[[5 q^[]12;Magenta\007" " blinking bar (Ss) in magenta (Cs)
    " - entered replace mode
    let &t_SR = "^[[0 q^[]12;Red\007" " blinking block (Ss) in red (Cs)
    " - leaving insert/replace mode
    let &t_EI = "^[[2 q^[]112\007" " terminal power-on style (Se) and colour (Cr)

Remarque: Les '^['caractères sont en fait un ESCcaractère de contrôle (séquence d'échappement).

Zdzisław Śliwiński
la source
0

Cela fonctionne correctement sur xfce4-terminal:

ajoutez le script suivant à votre .vimrc

if has("autocmd")
  au InsertEnter * silent execute "!sed -i.bak -e 's/TERMINAL_CURSOR_SHAPE_BLOCK/TERMINAL_CURSOR_SHAPE_IBEAM/' ~/.config/xfce4/terminal/terminalrc"                                                                                          
  au InsertLeave * silent execute "!sed -i.bak -e 's/TERMINAL_CURSOR_SHAPE_IBEAM/TERMINAL_CURSOR_SHAPE_BLOCK/' ~/.config/xfce4/terminal/terminalrc"                                                                                          
  au VimLeave * silent execute "!sed -i.bak -e 's/TERMINAL_CURSOR_SHAPE_IBEAM/TERMINAL_CURSOR_SHAPE_BLOCK/' ~/.config/xfce4/terminal/terminalrc"  
endif

Bref: comme vous le savez, xfce4-terminal conserve les préférences dans un .config/xfce4/terminal/terminalrcfichier. Le script change TERMINAL_CURSOR_SHAPE_BLOCKà TERMINAL_CURSOR_SHAPE_IBEAMlorsque vous êtes en mode d'insertion et de retour pour bloquer lorsque vous quittez le mode d' insertion ou vim. Sentez - vous libre de changer IBEAMà tout ce que vous voulez ( BLOCK, IBEAMet UNDERLINEdisponible).

Amirali
la source
0

Si vous utilisez une version moderne de nvimet que vous vouliez y parvenir, vous pouvez éviter certaines de ces solutions de contournement sophistiquées répertoriées ci-dessus.

Les paramètres ci-dessous passeront du curseur de bloc en mode normal au curseur de soulignement lors du remplacement au curseur de ligne lors de l'insertion.

# ~/.tmux.conf
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",*256col*:Tc"
set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q',w

" ~/.vimrc
" Sets cursor styles
" Block in normal, line in insert, underline in replace
set guicursor=n-v-c-sm:block,i-ci-ve:ver25-Cursor,r-cr-o:hor20

J'ai réussi à faire fonctionner cela avec les paramètres suivants tirés de ces deux sources.

forme-curseur-tui

guicurseur

thrgamon
la source
-2

J'ai généralement le mode vim actuel sur la ligne d'état, entre autres. Si vous recherchez la simplicité, vous ne pouvez définir que ces informations sur la ligne d'état .

Cependant, les choses vraiment folles se produisent généralement lorsque le verrouillage des majuscules est enfoncé et que vous êtes en mode commande (puisque hjkl est maintenant HJKL - juste J et K suffisent pour vous faire tirer les cheveux lorsque vous ne comprenez pas ce qui se passe. :h J et :h Kpour voir ce que je veux dire). Méfiez-vous simplement de la touche de verrouillage des majuscules et tout ira bien la plupart du temps IMO.

GmonC
la source
46
Comment cela répond-il à la question?
David Rivers
1
@DavidRivers C'est une application du problème XY où l'OP demandait une résolution à son problème (ne sachant pas être en mode normal vim et souhaitant que le curseur change pour l'indiquer) mais s'est avéré satisfait d'une alternative (et l'OMI non une excellente) solution (améliorant son statut avec l'État)
Steven Lu