Come cambio il cursore tra le modalità Normale e Inserisci in Vim?


107

Vorrei sapere come cambiare, se possibile, il cursore in Vim (nel colore, nella forma, ecc.) A seconda della modalità in cui ti trovi.

Dimentico costantemente che non sono in modalità di inserimento e inizio a digitare il codice, il che si traduce in ogni sorta di cose folli. Sarebbe utile se ci fosse una sorta di indicazione visiva sul cursore.


19
Ti suggerisco di imparare una regola: smettere di digitare => uscire dalla modalità di inserimento. Quindi non osserverai mai una situazione in cui ti sei dimenticato di non essere in modalità di inserimento.
ZyX

2
@ZyX tranne quando ti dimentichi di uscire dalla modalità di inserimento dopo aver smesso di digitare: p
gented

3
@ZyX è una bella regola e l'ho sempre fatto, ma gli indicatori visivi sono comunque importanti. La marijuana è legale ora e dimentico sempre quello che faccio.
felwithe il

Risposte:


107

Un'opzione popolare per indicare il passaggio alla e dalla modalità di inserimento è l'attivazione cursorlinedell'opzione, che è responsabile dell'evidenziazione della riga dello schermo corrente (vedere :help cursorline):

:autocmd InsertEnter,InsertLeave * set cul!

o, in alternativa,

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

Modificare il CursorLinegruppo di evidenziazione per cambiare lo stile della linea del cursore a proprio piacimento (vedere :help :highlighte :help highlight-groups).


5
Ho anche impostato cul su higlight bg invece della sottolineatura predefinita: hi CursorLine cterm = NONE ctermbg = black
Nikita Prokopov

C'è una ragione per cui questo non funzionerebbe nel vim di Cygwin? Sono nell'editor e ho inserito entrambi i set di righe, e non sono stato in grado di impostare alcun tipo di evidenziazione, oltre la colonna intera o l'evidenziazione delle righe
TankorSmash

@Tankor: l' cursorlineopzione non dipende da alcuna capacità specifica della piattaforma; è disponibile su qualsiasi istanza Vim compilata con la +syntaxfunzionalità (che di solito è il caso).
ib.

Ovviamente, salvalo nel tuo ~ / .vimrc per la permanenza come zo:echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
alchemy

75

Quanto segue funziona con xterm, urxvt e altri emulatori di terminale su Linux; iTerm2 su macOS; Git Bash con ConEmu su Windows; e altro (vedi commenti):

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

Altre opzioni (sostituire il numero dopo \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).

Quando usi tmux , è importante usarlo in questo modo (senza \<Esc>Ptmux;escape). tmux terrà traccia della forma corretta del cursore quando si cambia finestra / riquadro.

Se non funziona per te, prova a impostare TERM=xterm-256colorprima di avviare tmux o aggiungilo al tuo .tmux.conf( grazie @Steven Lu ):

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

2
Funziona alla grande in alacritty ora
Steven Lu

Funziona perfettamente con xfce4-terminal
korst1k

@Charles Riguardo al motivo per cui non funziona nello stucco, vedere questo: superuser.com/questions/304318/…
WesternGun

1
Il mio aggiornamento: lavorare finalmente con set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'nella mia configurazione tmux. Apparentemente se usi setper terminal-overridessenza -a, sovrascriverà l'impostazione, che ha già questa impostazione predefinita.
Steven Lu

1
la soluzione ha un ritardo significativo nel cambiare forma dalla modalità di inserimento alla modalità normale sul terminale semplice (suckless st)
daGo

16

Se stai usando tmux e iTerm2 su macOS ,
quanto segue cambia il cursore da un blocco a un cursore ed evidenzia la riga corrente

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

credito: https://gist.github.com/andyfowler/1195581


1
Nota che questo è specifico di iTerm . Poiché quelli standard in realtà funzionano anche ma funzionano anche in tutti gli altri terminali di supporto, questa è probabilmente la risposta sbagliata. Guarda qui -> stackoverflow.com/a/42118416/340947
Steven Lu

@StevenLu in realtà quello nella tua risposta suggerita non ha funzionato per iTerm2 (Mac), mentre questo ha funzionato. Questa roba è più complicata di quanto potresti aspettarti.
CS

Questa roba del cursore è sicuramente una delle cose più complicate là fuori. Mi sono appena reso conto che non penso nemmeno di avere una configurazione corretta, poiché tmux non sembra eseguire il monitoraggio dello stato del cursore che alcune risposte indicano come una possibilità. Ero abbastanza contento di far sì che vim gestisse l'impostazione del cursore su una riga in modalità di inserimento.
Steven Lu

Ho capito questa roba. La soluzione è modificare tmux per gestirlo correttamente e può essere non ovvio. Quello che dovevo fare era assicurarmi che la mia configurazione di tmux terminal-overridesvenisse aggiunta solo a, in modo da non rovinare la ,*:Ss=\E[%p1%d q:Se=\E[2 qparte di terminal-overrides. quindi la mia configurazione sembra set -sa terminal-overrides ",xterm-256color-italic:Tc"(per impostare l'abilitazione del colore a 24 bit senza calpestare gli stili del cursore Ss / Se.
Steven Lu

13

Per modificare la forma del cursore in diverse modalità, è possibile aggiungere quanto segue nel .vimrcfile.

Per il terminale GNOME (versione 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

Se usi più di un profilo nel terminale GNOME, potresti doverlo adattare ai tuoi profili.

Per Konsole in KDE4:

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

Funziona con più schede e finestre.

Vedi anche: “ Modificare la forma del cursore in diverse modalità ” su Vim Tips Wiki .


13
Uso principalmente vim in tmux su ssh con putty. C'è un'opzione più universale?
lanrat

Ha funzionato come un fascino. Grazie.
Ernest

1
Modificare le impostazioni di gnome-terminal tramite un comando gconftool-2 è una pessima idea. Non influenza solo il terminale su cui è in esecuzione il tuo vim, ma anche tutte le altre schede di gnome-terminal attuali e future dello stesso profilo.
egmont

questo funziona per konsole, grazie. Ma un problema è che l'uscita dalla modalità di inserimento è slooow, non so perché
Hoang Tran

1
@HoangTran useset ttimeoutlen=0
Bananach

10

Puoi provare il plugin Terminus Vim :

In modalità di inserimento, la forma del cursore si trasforma in una sottile barra verticale. In modalità di sostituzione, cambia in una sottolineatura. Al ritorno alla modalità normale, ritorna alla forma "blocco" standard.


Questa sembra la soluzione più sensata. Dovrebbe esserci un: impostato per questo direttamente in VIM, standard.
user12711

Requisiti: gnome-terminal ( wiki.gnome.org/Apps/Terminal ) e altri terminali che utilizzano la libreria VTE ( github.com/GNOME/vte ): Parzialmente supportato (ad esempio, supporta le modifiche alla forma del cursore ma non la segnalazione del focus). Nel mio caso (gnome-terminal 3.6.2) non funziona affatto.
daGo

8

Trovo utile avere il cursore lampeggiante solo in modalità di inserimento e mantenerlo statico in altre modalità.

set guicursor+=n-v-c:blinkon0

2

Non sono sicuro che qualcun altro stia affrontando un ritardo dopo aver premuto il Esctasto per tornare alla modalità normale per mostrare il cursore di blocco, ma in tal caso, questo è il modo in cui lo risolvo.

In realtà sto usando iTerm2 e sto usando Vim all'interno del mio terminale su macOS. E quando si accede alla modalità di inserimento, il cursore è ancora un blocco ed è un po 'confuso quando si è in modalità di inserimento o in modalità normale.

Volevo mostrare una linea sottile come cursore quando in modalità di inserimento e tornare al blocco quando in modalità normale come fa MacVim. E per farlo è piuttosto semplice, basta aggiungerlo al mio .vimrcfile come descritto qui :

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

inserisci qui la descrizione dell'immagine

Ma come puoi vedere c'è stato un ritardo quando si preme ESCper uscire dalla modalità di inserimento e tornare alla modalità normale e mostrare nuovamente il blocco come cursore. Quindi per risolverlo ho trovato questo:

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

E ora funziona abbastanza bene come puoi vedere:

risolto il ritardo nel tornare al blocco come cursore

Spero che possa aiutare chiunque altro! 👻


1

Non penso che questo aggiunga molto alle risposte che altre persone hanno già fornito, ma volevo riassumere in qualche modo le cose in un unico posto e avere anche collegamenti ai riferimenti pertinenti.

Questo è l' .vimrcaspetto dello snippet pertinente del mio :

    " 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: i '^['caratteri sono in realtà un ESCcarattere di controllo (sequenza di escape).


0

Funziona correttamente su xfce4-terminal:

aggiungi il seguente script al tuo .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: come sapete xfce4-terminal mantiene le preferenze nel .config/xfce4/terminal/terminalrcfile. Lo script cambia TERMINAL_CURSOR_SHAPE_BLOCKin TERMINAL_CURSOR_SHAPE_IBEAMquando sei in modalità di inserimento e torna in blocco quando esci dalla modalità di inserimento o vim. Sentitevi liberi di cambiare IBEAMa tutto quello che vuoi ( BLOCK, IBEAMe UNDERLINEdisponibili).


0

Se stai utilizzando una versione moderna di nvime desideri ottenere questo risultato, puoi evitare alcune di queste fantasiose soluzioni alternative elencate sopra.

Le seguenti impostazioni passeranno da cursore a blocco in modalità normale, a cursore di sottolineatura in sostituzione a cursore di linea in inserimento.

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

Sono riuscito a farlo funzionare con le seguenti impostazioni estratte da queste due fonti.

forma-cursore-tui

guicursor


-2

Di solito ho l'attuale modalità vim sulla statusline, tra le altre cose. Se cerchi la semplicità, puoi impostare solo queste informazioni sulla statusline .

Tuttavia, di solito le cose davvero pazze accadono quando hai il blocco delle maiuscole premuto e sei in modalità di comando (dato che hjkl ora sono HJKL - solo J e K sono sufficienti per farti tirare i capelli quando non capisci cosa sta succedendo. :h Je :h Kper vedere cosa intendo). Fai attenzione al tasto BLOC MAIUSC e starai bene la maggior parte del tempo IMO.


46
Come risponde questo alla domanda?
David Rivers il

1
@DavidRivers È un'applicazione del problema XY in cui l'OP chiedeva una risoluzione al suo problema (non sapendo di essere in modalità normale di vim e volendo che il cursore cambiasse per indicarlo) ma si è rivelato soddisfatto di un'alternativa (e IMO no una grande soluzione (migliorando la sua statusline con lo stato)
Steven Lu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.