¿Cómo cambio el cursor Vim en modo Insertar / Normal?

106

Me gustaría saber, si es posible, cómo cambiar el cursor en Vim (en color, forma, etc.) dependiendo del modo en el que se encuentre.

Constantemente me olvido de que no estoy en el modo de inserción y empiezo a escribir código, lo que provoca que sucedan todo tipo de cosas locas. Sería útil si hubiera algún tipo de indicación visual en el cursor.

lanrat
fuente
19
Le sugiero que aprenda una regla: dejó de escribir => salir del modo de inserción. Entonces nunca observará una situación en la que haya olvidado que no está en modo de inserción.
ZyX
2
@ZyX excepto cuando olvide salir del modo de inserción después de haber dejado de escribir: p
gented
3
@ZyX esa es una buena regla y siempre lo he hecho, pero los indicadores visuales siguen siendo importantes. La marihuana es legal ahora y me olvido de lo que hago todo el tiempo.
felwithe

Respuestas:

107

Una opción popular para indicar el cambio hacia y desde el modo Insertar es alternar la cursorlineopción, que es responsable de si la línea de pantalla actual está resaltada (ver :help cursorline):

:autocmd InsertEnter,InsertLeave * set cul!

o alternativamente,

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

Modifique el CursorLinegrupo de resaltado para cambiar el estilo de la línea del cursor a su gusto (ver :help :highlighty :help highlight-groups).

ib.
fuente
5
También configuré cul para resaltar bg en lugar del subrayado predeterminado: hi CursorLine cterm = NONE ctermbg = black
Nikita Prokopov
¿Hay alguna razón por la que esto no funcionaría en el vim de cygwin? Estoy en el editor e ingresé ambos conjuntos de líneas, y no he podido establecer ningún tipo de resaltado, más allá del resaltado completo de la columna o fila
TankorSmash
@Tankor: la cursorlineopción no depende de ninguna capacidad específica de la plataforma; está disponible en cualquier instancia de Vim compilada con la +syntaxfunción (que suele ser el caso).
ib.
Por supuesto, guarde eso en su ~ / .vimrc para permanencia como zo:echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
alquimia
75

Lo siguiente funciona en xterm, urxvt y otros emuladores de terminal en Linux; iTerm2 en macOS; Git Bash con ConEmu en Windows; y más (ver comentarios):

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

Otras opciones (reemplace el número despué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).

Cuando usa tmux , es importante usarlo así (sin el \<Esc>Ptmux;escape). tmux hará un seguimiento de la forma correcta del cursor cuando cambie de ventana / panel.

Si no funciona para usted, intente configurar TERM=xterm-256colorantes de iniciar tmux, o agregue esto a su .tmux.conf( gracias @Steven Lu ):

set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'
laktak
fuente
2
Funciona muy bien en alacritty ahora
Steven Lu
Funciona perfectamente en xfce4-terminal
korst1k
@Charles acerca de por qué no funciona en masilla, ven esto: superuser.com/questions/304318/...
WesternGun
1
Mi actualización: trabajando finalmente con set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'mi configuración tmux. Aparentemente, si usa setpara terminal-overridessin -a, anulará la configuración, que ya tiene esto allí de forma predeterminada.
Steven Lu
1
la solución tiene un retraso significativo en el cambio de forma del modo de inserción al modo normal en un terminal simple (suckless st)
daGo
16

Si está utilizando tmux e iTerm2 en macOS ,
lo siguiente cambia el cursor de un bloque a un cursor y resalta la línea actual

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édito: https://gist.github.com/andyfowler/1195581

Intenciones
fuente
1
Tenga en cuenta que esto es específico de iTerm . Dado que los estándar en realidad también funcionan, pero también funcionan en todos los demás terminales compatibles, esta es probablemente la respuesta incorrecta. Mire aquí -> stackoverflow.com/a/42118416/340947
Steven Lu
@StevenLu en realidad, el de su respuesta sugerida no funcionó para iTerm2 (Mac), mientras que este funcionó. Esto es más complicado de lo que cabría esperar.
CS
Este material del cursor es definitivamente una de las cosas más complicadas que existen. Me acabo de dar cuenta de que ni siquiera creo que tenga una configuración adecuada, ya que tmux no parece estar realizando un seguimiento del estado del cursor, lo que algunas respuestas indican que es una posibilidad. Estaba lo suficientemente feliz solo para que vim se encargara de colocar el cursor en una línea en el modo de inserción.
Steven Lu
Descubrí esto. La solución es modificar tmux para manejarlo correctamente, y puede que no sea obvio. Lo que tenía que hacer era asegurarme de que mi configuración tmux terminal-overridessolo se agregara a, para que no golpeara la ,*:Ss=\E[%p1%d q:Se=\E[2 qparte de terminal-overrides. entonces mi configuración se ve como set -sa terminal-overrides ",xterm-256color-italic:Tc"(para establecer la habilitación de color de 24 bits sin pisotear los estilos de cursor Ss / Se.
Steven Lu
13

Para cambiar la forma del cursor en diferentes modos, puede agregar lo siguiente en su .vimrc archivo.

Para el terminal GNOME (versión 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 usa más de un perfil en GNOME Terminal, es posible que deba adaptarlo a sus perfiles.

Para Konsole en KDE4:

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

Esto funciona con múltiples pestañas y ventanas.

Consulte también: " Cambiar la forma del cursor en diferentes modos " en Vim Tips Wiki .

IvanGL
fuente
13
Principalmente uso vim en tmux sobre ssh con masilla. ¿Existe una opción más universal?
lanrat
Trabajado como un encanto. Gracias.
Ernest
1
Cambiar la configuración de gnome-terminal mediante un comando gconftool-2 es una muy mala idea. No solo influye en el terminal donde se ejecuta vim, sino también en todas las demás pestañas de gnome-terminal actuales y futuras del mismo perfil.
egmont
esto funciona para konsole, gracias. Pero un problema es que salir del modo de inserción es lento, no estoy seguro de por qué
Hoang Tran
1
@HoangTran useset ttimeoutlen=0
Bananach
10

Puede probar el complemento terminus vim :

En el modo de inserción, la forma del cursor cambia a una barra vertical delgada. En el modo de reemplazo, cambia a un subrayado. Al volver al modo normal, vuelve a la forma estándar de "bloque".

Tim Gabets
fuente
Esta parece la solución más sensata. Debe haber un: establecido para esto directamente en VIM, estándar.
user12711
Requisitos: gnome-terminal ( wiki.gnome.org/Apps/Terminal ) y otros terminales que utilizan la biblioteca VTE ( github.com/GNOME/vte ): parcialmente compatible (por ejemplo, admite cambios en la forma del cursor pero no informes de enfoque). En mi caso (gnome-terminal 3.6.2) no funciona en absoluto.
DaGo
8

Me resulta útil tener el cursor parpadeando solo en el modo Insertar y estático en otros modos.

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

No estoy seguro de si alguien más se enfrenta a un retraso después de presionar el Esc presionar tecla para volver al modo normal y mostrar el cursor de bloque, pero si es así, esta es la forma en que lo soluciono también.

En realidad, estoy usando iTerm2 y usando Vim dentro de mi terminal en macOS. Y al ingresar al modo de inserción, el cursor sigue siendo un bloque y es un poco confuso cuando estás en el modo de inserción o en el modo normal.

Quería mostrar una línea delgada como cursor cuando estaba en modo de inserción y volver a bloquear cuando estaba en modo normal como lo hace MacVim. Y para hacerlo es bastante simple, simplemente agregué esto a mi .vimrcarchivo como se describe aquí :

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

ingrese la descripción de la imagen aquí

Pero como puede ver, hubo un retraso al presionar ESCpara salir del modo de inserción y volver al modo normal y mostrar el bloque como cursor nuevamente. Entonces, para solucionarlo, encontré esto:

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

Y ahora funciona bastante bien como puede ver:

corregir el retraso que vuelve al bloque como cursor

¡Espero que pueda ayudar a alguien más! 👻

alexventuraio
fuente
1

No creo que esto agregue mucho a las respuestas que otras personas ya han brindado, pero quería resumir de alguna manera las cosas en un solo lugar y también tener enlaces a las referencias relevantes.

Así es como se ve el fragmento relevante de mi .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)

Nota: Los '^['caracteres son en realidad un ESCcarácter de control (secuencia de escape).

Zdzisław Śliwiński
fuente
0

Esto funciona correctamente en xfce4-terminal:

agregue el siguiente script a su .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

Breve: Como usted sabe, xfce4-terminal mantiene las preferencias en el .config/xfce4/terminal/terminalrcarchivo. La secuencia de comandos cambia TERMINAL_CURSOR_SHAPE_BLOCKa TERMINAL_CURSOR_SHAPE_IBEAMcuando estás en modo de inserción y vuelve a bloquear cuando sales del modo de inserción o vim. Siéntase libre de cambiar IBEAMa cualquier cosa que desee ( BLOCK, IBEAMy UNDERLINEestá disponible).

amirali
fuente
0

Si está utilizando una versión moderna de nvimy desea lograrlo, puede evitar algunas de estas soluciones elegantes enumeradas anteriormente.

La siguiente configuración cambiará del cursor de bloque en modo normal al cursor subrayado en reemplazo al cursor de línea en inserción.

# ~/.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

Me las arreglé para que esto funcionara con la siguiente configuración extraída de estas dos fuentes.

forma-cursor-tui

guicursor

thrgamon
fuente
-2

Normalmente tengo el modo vim actual en statusline, entre otras cosas. Si busca simplicidad, puede establecer solo esta información en la línea de estado .

Sin embargo, por lo general, las cosas realmente locas suceden cuando tienes el bloqueo de mayúsculas presionado y estás en el modo de comando (ya que hjkl ahora son HJKL, solo J y K son suficientes para hacerte arrancarte los pelos cuando no entiendes lo que está sucediendo. :h Jy :h Kpara ver a qué me refiero). Solo tenga cuidado con la tecla de bloqueo de mayúsculas y estará bien la mayor parte del tiempo, en mi opinión.

GmonC
fuente
46
¿Cómo responde esto a la pregunta?
David Rivers
1
@DavidRivers Es una aplicación del problema XY donde el OP estaba pidiendo una resolución a su problema (sin saber si estaba en modo normal vim y queriendo que el cursor cambiara para indicarlo) pero resultó satisfecho con una alternativa (y en mi opinión no una gran) solución (mejorar su línea de estado con el estado)
Steven Lu