Wie ändere ich den Vim-Cursor im Einfüge- / Normalmodus?

105

Ich möchte nach Möglichkeit wissen, wie Sie den Cursor in Vim (in Farbe, Form usw.) ändern können, je nachdem, in welchem ​​Modus Sie sich befinden.

Ich vergesse ständig, dass ich mich nicht im Einfügemodus befinde und beginne, Code einzugeben, was dazu führt, dass alle möglichen verrückten Dinge passieren. Es wäre hilfreich, wenn der Cursor eine visuelle Anzeige hätte.

lanrat
quelle
18
Ich schlage vor, dass Sie eine Regel lernen: Eingabe beendet => Einfügemodus beenden. Dann werden Sie niemals eine Situation beobachten, in der Sie vergessen haben, dass Sie sich nicht im Einfügemodus befinden.
ZyX
2
@ZyX, außer wenn Sie vergessen haben, den Einfügemodus zu verlassen, nachdem Sie die Eingabe beendet haben: p
gented
3
@ZyX das ist eine gute Regel und das habe ich immer getan, aber visuelle Indikatoren sind immer noch wichtig. Marihuana ist jetzt legal und ich vergesse die ganze Zeit, was ich tue.
Felwithe

Antworten:

106

Eine beliebte Option zum Anzeigen des Wechsels zum und vom Einfügemodus ist das Umschalten der cursorlineOption, die dafür verantwortlich ist, ob die aktuelle Bildschirmzeile markiert ist (siehe :help cursorline):

:autocmd InsertEnter,InsertLeave * set cul!

oder alternativ,

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

Ändern Sie die CursorLineHervorhebungsgruppe, um das Design der Cursorlinie nach Ihren Wünschen zu ändern (siehe :help :highlightund :help highlight-groups).

ib.
quelle
5
Ich habe auch cul auf higlight gesetzt, anstatt standardmäßig zu unterstreichen: hi CursorLine cterm = NONE ctermbg = black
Nikita Prokopov
Gibt es einen Grund, warum dies in Cygwins Vim nicht funktionieren würde? Ich bin im Editor und habe beide Zeilen eingegeben, und ich konnte keine Hervorhebungen vornehmen, die über die vollständige Spalten- oder Zeilenhighligting hinausgehen
TankorSmash
@Tankor: Die cursorlineOption hängt nicht von plattformspezifischen Funktionen ab. Es ist auf jeder Vim-Instanz verfügbar, die mit der +syntaxFunktion kompiliert wurde (was normalerweise der Fall ist).
ib.
Speichern Sie das natürlich in Ihrem ~ / .vimrc für die Dauerhaftigkeit wie zo:echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
Alchemie
75

Folgendes funktioniert für xterm / urxvt / ... (Linux), iTerm2 (Mac), Git Bash mit ConEmu (Windows) und mehr (siehe Kommentare):

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

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

Andere Optionen (ersetzen Sie die Nummer nach \ 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).

Wenn Sie tmux verwenden , ist es wichtig, dass Sie es so verwenden (ohne \<Esc>Ptmux;Escape). tmux verfolgt die richtige Cursorform, wenn Sie zwischen Fenstern / Fenstern wechseln.

Wenn es bei Ihnen nicht funktioniert, versuchen Sie es entweder TERM=xterm-256colorvor dem Starten von tmux oder fügen Sie dies Ihrer .tmux.conf hinzu (danke @Steven Lu):

set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'
Laktak
quelle
2
Funktioniert jetzt hervorragend in alacritty
Steven Lu
Funktioniert perfekt in xfce4-terminal
korst1k
@Charles darüber , warum es in Kitt nicht funktioniert, sehen Sie: superuser.com/questions/304318/...
WesternGun
1
Mein Update: Endlich mit set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'in meiner tmux Konfiguration arbeiten. Wenn Sie setfor terminal-overrideswithout verwenden -a, wird anscheinend die Einstellung überschrieben, die diese standardmäßig bereits enthält.
Steven Lu
1
Die Lösung hat eine erhebliche Verzögerung beim Ändern der Form vom Einfügemodus in den Normalmodus am einfachen Terminal (saugfreie M)
daGo
16

Wenn Sie mit tmux und iTerm2 auf OSX ,
ändert sich die folgende den Cursor von einem Block zu einem Cursor und zeigt die aktuelle Zeile

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

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

Absichten
quelle
1
Beachten Sie, dass dies spezifisch für iTerm ist . Da die Standardterminals tatsächlich auch funktionieren, aber auch in allen anderen unterstützenden Terminals funktionieren, ist dies wahrscheinlich die falsche Antwort. Schauen Sie hier -> stackoverflow.com/a/42118416/340947
Steven Lu
@StevenLu funktionierte tatsächlich nicht in iTerm2 (Mac), während diese Antwort funktionierte. Dieses Zeug ist fummeliger als Sie vielleicht erwarten.
CS
Dieses Cursor-Zeug ist definitiv eines der fummeligeren Dinge da draußen. Ich habe gerade festgestellt, dass ich nicht einmal glaube, dass ich ein richtiges Setup habe, da tmux anscheinend keine Cursor-Statusverfolgung durchführt, was einige Antworten als möglich ansehen. Ich war sehr glücklich genug, um vim dazu zu bringen, den Cursor im Einfügemodus auf eine Linie zu setzen.
Steven Lu
Ich habe das herausgefunden. Die Lösung besteht darin, tmux so zu optimieren, dass es richtig funktioniert, und es kann nicht offensichtlich sein. Was ich tun musste, war sicherzustellen, dass meine tmux-Konfigurationen terminal-overridesnur angehängt wurden, damit der ,*:Ss=\E[%p1%d q:Se=\E[2 qTeil von nicht überlastet wurde terminal-overrides. so sieht meine Konfiguration aus set -sa terminal-overrides ",xterm-256color-italic:Tc"(um die 24-Bit-
Steven Lu
13

Um die Form des Cursors in verschiedenen Modi zu ändern, können Sie Ihrem vimrc Folgendes hinzufügen.

Für das Gnome-Terminal (Version 2.26) Bearbeiten

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

Wenn Sie in gnome-terminal mehr als ein Profil verwenden, müssen Sie dieses möglicherweise an Ihre Profile anpassen.

Für Konsole in KDE4Edit

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

Dies funktioniert mit mehreren Registerkarten und Fenstern.

http://vim.wikia.com/wiki/Change_cursor_shape_in_different_modes

IvanGL
quelle
13
Ich benutze hauptsächlich vim in tmux über ssh mit Kitt. Gibt es eine universellere Option?
Lanrat
Lief wie am Schnürchen. Vielen Dank.
Ernest
1
Das Ändern der Einstellungen des Gnome-Terminals über einen Befehl gconftool-2 ist eine sehr schlechte Idee. Dies beeinflusst nicht nur das Terminal, auf dem Ihr vim ausgeführt wird, sondern auch alle anderen aktuellen und zukünftigen Gnome-Terminal-Registerkarten desselben Profils.
Egmont
das funktioniert für konsole, danke. Aber ein Problem ist, dass das Verlassen des Einfügemodus langsam ist, nicht sicher warum
Hoang Tran
1
@ HoangTran verwendenset ttimeoutlen=0
Bananach
10

Sie können das Terminus Vim Plugin ausprobieren :

Im Einfügemodus ändert sich die Cursorform in einen dünnen vertikalen Balken. Im Ersetzungsmodus wird eine Unterstreichung vorgenommen. Bei Rückkehr zum normalen Modus wird die Standardform "Block" wiederhergestellt.

Tim Gabets
quelle
Dies scheint die sinnvollste Lösung zu sein. Es sollte ein: Set dafür direkt in VIM, Standard, geben.
user12711
Anforderungen: gnome-terminal ( wiki.gnome.org/Apps/Terminal ) und andere Terminals, die die VTE-Bibliothek verwenden ( github.com/GNOME/vte ): Teilweise unterstützt (unterstützt beispielsweise Änderungen der Cursorform , jedoch keine Fokusberichterstattung). In meinem Fall (Gnome-Terminal 3.6.2) funktioniert es überhaupt nicht.
daGo
8

Ich finde es nützlich, wenn der Cursor nur im Einfügemodus blinkt und in anderen Modi statisch ist.

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

Ich bin mir nicht sicher, ob jemand anderes nach dem Schlagen eine Verzögerung hat ESCIch bin Taste , um zum normalen Modus zurückzukehren und den Blockcursor anzuzeigen. Wenn ja, behebe ich dies auch auf diese Weise.

Eigentlich benutze ich iTerm2 und Vim in meinem Terminal auf dem Mac. Und wenn Sie in den Einfügemodus wechseln, ist der Cursor immer noch ein Block und verwirrt, wenn Sie sich im Einfügemodus oder im normalen Modus befinden.

Ich wollte im Einfügemodus eine dünne Linie als Cursor anzeigen und im normalen Modus wie MacVim zurück zum Blockieren. Und um dies zu tun, ist es ziemlich einfach. Fügen Sie dies einfach .vimrcwie hier beschrieben zu meiner Datei hinzu :

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

Geben Sie hier die Bildbeschreibung ein

Wie Sie jedoch sehen können, gab es eine Verzögerung beim Drücken ESC, um den Einfügemodus wieder in den normalen Modus zu verlassen und den Block erneut als Cursor anzuzeigen. Um das Problem zu beheben, habe ich Folgendes gefunden:

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

Und jetzt funktioniert es ziemlich gut, wie Sie sehen können:

Korrektur der Verzögerung, die zurück zum Blockieren als Cursor geht

Ich hoffe es könnte jemand anderem helfen! 👻

alexventuraio
quelle
1

Ich denke nicht, dass dies viel zu den Antworten beiträgt, die andere Leute bereits gegeben haben, aber ich wollte die Dinge irgendwie an einem Ort zusammenfassen und auch Links zu den relevanten Referenzen haben.

So .vimrcsieht der relevante Ausschnitt aus meinem aus:

    " 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)

Hinweis: Die '^['Zeichen sind tatsächlich ein ESCSteuerzeichen (Escape-Sequenz).

Zdzisław Śliwiński
quelle
0

Dies funktioniert ordnungsgemäß auf dem xfce4-Terminal:

Fügen Sie Ihrem Skript das folgende Skript hinzu .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

Kurz: Wie Sie wissen, speichert das xfce4-Terminal die Einstellungen in der .config/xfce4/terminal/terminalrcDatei. Das Skript ändert sich TERMINAL_CURSOR_SHAPE_BLOCKzu, TERMINAL_CURSOR_SHAPE_IBEAMwenn Sie sich im Einfügemodus befinden, und zurück zum Blockieren, wenn Sie den Einfügemodus oder vim verlassen. Fühlen Sie sich frei zu ändern , IBEAMum alles , was Sie wollen ( BLOCK, IBEAMund UNDERLINEverfügbar).

Amirali
quelle
0

Wenn Sie eine moderne Version von verwenden nvimund dies erreichen möchten, können Sie einige der oben aufgeführten ausgefallenen Problemumgehungen vermeiden.

Die folgenden Einstellungen wechseln vom Blockcursor im normalen Modus zum Unterstreichen des Cursors beim Ersetzen zum Zeilencursor beim Einfügen.

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

Ich habe es geschafft, dies mit den folgenden Einstellungen zum Laufen zu bringen, die aus diesen beiden Quellen stammen.

Tui-Cursor-Form

guicursor

Thrgamon
quelle
-2

Normalerweise habe ich unter anderem den aktuellen VIM-Modus in der Statuszeile. Wenn Sie Einfachheit suchen, können Sie nur diese Informationen in der Statuszeile festlegen .

Normalerweise passieren die wirklich verrückten Dinge jedoch, wenn Sie die Feststelltaste gedrückt haben und sich im Befehlsmodus befinden (da hjkl jetzt HJKL sind - nur J und K reichen aus, um Ihnen die Haare auszureißen, wenn Sie nicht verstehen, was passiert :h Jund um :h Kzu sehen was ich meine). Passen Sie einfach auf die Feststelltaste auf und es wird Ihnen die meiste Zeit gut gehen, IMO.

GmonC
quelle
46
Wie beantwortet dies die Frage?
David Rivers
1
@DavidRivers Es handelt sich um eine Anwendung des XY-Problems, bei der das OP nach einer Lösung für sein Problem fragte (ohne zu wissen, dass es sich im normalen Vim-Modus befindet und möchte, dass sich der Cursor ändert, um dies anzuzeigen), sich jedoch mit einer Alternative zufrieden stellte (und IMO nicht eine großartige) Lösung (Verbesserung seiner Statuslinie mit dem Staat)
Steven Lu