Jak zmienić kursor między trybami Normal i Insert w Vimie?

107

Chciałbym wiedzieć, jak zmienić, jeśli to możliwe, kursor w Vimie (w kolorze, kształcie itp.) W zależności od trybu, w którym się znajdujesz.

Ciągle zapominam, że nie jestem w trybie wstawiania i zaczynam pisać kod, co skutkuje różnego rodzaju szalonymi rzeczami. Byłoby pomocne, gdyby kursor zawierał jakieś wizualne wskazanie.

lanrat
źródło
19
Proponuję nauczyć się jednej zasady: przestałem pisać => wyjdź z trybu wstawiania. Wtedy nigdy nie zauważysz sytuacji, w której zapomniałeś, że nie jesteś w trybie wstawiania.
ZyX
2
@ZyX z wyjątkiem sytuacji, gdy zapomnisz wyjść z trybu wstawiania po zatrzymaniu wpisywania: p
gented
3
@ZyX to dobra zasada i zawsze to robiłem, ale wskaźniki wizualne są nadal ważne. Marihuana jest teraz legalna i cały czas zapominam, co robię.
felwithe

Odpowiedzi:

107

Popularną opcją wskazującą przejście do iz trybu Insert jest przełączanie cursorlineopcji, która odpowiada za to, czy bieżąca linia ekranu jest podświetlona (patrz :help cursorline):

:autocmd InsertEnter,InsertLeave * set cul!

lub alternatywnie

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

Zmodyfikuj CursorLinegrupę podświetlenia, aby zmienić styl linii kursora według własnych upodobań (zobacz :help :highlighti :help highlight-groups).

ib.
źródło
5
Ustawiam również cul na higlight bg zamiast domyślnego podkreślenia: hi CursorLine cterm = NONE ctermbg = black
Nikita Prokopov
Czy jest jakiś powód, dla którego to nie zadziała w Vim Cygwin? Jestem w edytorze i wszedłem w oba zestawy wierszy, i nie byłem w stanie ustawić żadnego podświetlania poza pełną kolumną lub
zaznaczaniem
@Tankor: cursorlineopcja nie zależy od możliwości specyficznych dla platformy; jest dostępny na każdej instancji Vima skompilowanej z tą +syntaxfunkcją (co zwykle ma miejsce).
ib.
Oczywiście zapisz to w swoim ~ / .vimrc na trwałość, jak zo:echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
alchemia
75

Poniższe działa w xterm, urxvt i innych emulatorach terminali w systemie Linux; iTerm2 na macOS; Git Bash z ConEmu w systemie Windows; i więcej (patrz komentarze):

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

Inne opcje (zamień numer po \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).

Kiedy używasz tmux , ważne jest, aby używać go w ten sposób (bez \<Esc>Ptmux;ucieczki). tmux będzie śledzić prawidłowy kształt kursora po przełączeniu okien / paneli.

Jeśli to nie zadziała, spróbuj ustawić TERM=xterm-256colorprzed uruchomieniem tmux lub dodaj to do swojego .tmux.conf( dzięki @Steven Lu ):

set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'
laktak
źródło
2
Działa świetnie teraz w alacritty
Steven Lu
Działa idealnie w terminalu xfce4
korst1k
@Charles O tym, dlaczego nie działa w
kitach
1
Moja aktualizacja: praca w końcu set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'w mojej konfiguracji tmux. Najwyraźniej jeśli użyjesz setfor terminal-overrideswithout -a, nadpisze to ustawienie, które już to ma tam domyślnie.
Steven Lu
1
rozwiązanie ma znaczne opóźnienie zmiany kształtu z trybu wstawiania do trybu normalnego na prostym terminalu (bez ssania)
daGo
16

Jeśli używasz tmux i iTerm2 na macOS ,
poniższy kod zmienia kursor z bloku na kursor i podświetla bieżącą linię

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

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

Intencje
źródło
1
Zauważ, że jest to specyficzne dla iTerm . Ponieważ standardowe działają również, ale działają również we wszystkich innych obsługujących terminalach, jest to prawdopodobnie zła odpowiedź. Spójrz tutaj -> stackoverflow.com/a/42118416/340947
Steven Lu
@StevenLu właściwie ten w twojej sugerowanej odpowiedzi nie działał dla iTerm2 (Mac), podczas gdy ten działał. Te rzeczy są bardziej skomplikowane, niż można by się spodziewać.
CS
Te rzeczy z kursorami są zdecydowanie jedną z bardziej skomplikowanych rzeczy. Właśnie zdałem sobie sprawę, że nawet nie sądzę, że mam odpowiednią konfigurację, ponieważ tmux nie wydaje się wykonywać śledzenia stanu kursora, co według niektórych odpowiedzi jest możliwe. Byłem wystarczająco szczęśliwy, że vim zajął się ustawieniem kursora w linii w trybie wstawiania.
Steven Lu
Wymyśliłem to. Rozwiązaniem jest poprawienie tmuxa, aby właściwie go obsłużyć, i może to być nieoczywiste. Musiałem tylko upewnić się, że moja konfiguracja tmux terminal-overridesbyła tylko dołączana, więc nie blokowała ,*:Ss=\E[%p1%d q:Se=\E[2 qczęści terminal-overrides. tak wygląda moja konfiguracja set -sa terminal-overrides ",xterm-256color-italic:Tc"(aby ustawić 24-bitowy kolor bez deptania stylów kursora Ss / Se.
Steven Lu
13

Aby zmienić kształt kursora w różnych trybach, możesz dodać do swojego .vimrcpliku następujące elementy.

W przypadku terminala GNOME (wersja 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

Jeśli używasz więcej niż jednego profilu w terminalu GNOME, być może będziesz musiał dostosować to do swoich profili.

Konsole w KDE4:

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

Działa to z wieloma kartami i oknami.

Zobacz także: „ Zmień kształt kursora w różnych trybach ” na Vim Tips Wiki .

IvanGL
źródło
13
Używam głównie vima w tmuxie zamiast ssh z kitem. Czy jest bardziej uniwersalna opcja?
lanrat
Działał jak urok. Dzięki.
Ernest
1
Zmiana ustawień gnome-terminal za pomocą polecenia gconftool-2 to bardzo zły pomysł. Wpływa nie tylko na terminal, na którym działa twój vim, ale także na wszystkie inne obecne i przyszłe zakładki gnome-terminal tego samego profilu.
egmont,
to działa dla konsoli, dziękuję. Ale jednym problemem jest to, że wychodzenie z trybu wstawiania jest powolne, nie wiem dlaczego
Hoang Tran
1
Wykorzystanie @HoangTranset ttimeoutlen=0
Bananach
10

Możesz wypróbować wtyczkę Terminus Vim :

W trybie wstawiania kształt kursora zmienia się w cienki pionowy pasek. W trybie zamiany zmienia się w podkreślenie. Po powrocie do trybu normalnego powraca do standardowego kształtu „bloku”.

Tim Gabets
źródło
Wydaje się, że jest to najbardziej rozsądne rozwiązanie. Powinien być: ustawiony bezpośrednio w VIM, standard.
user12711
Wymagania: gnome-terminal ( wiki.gnome.org/Apps/Terminal ) i inne terminale korzystające z biblioteki VTE ( github.com/GNOME/vte ): Częściowo obsługiwane (na przykład obsługuje zmiany kształtu kursora, ale nie raportowanie fokusu). W moim przypadku (gnome-terminal 3.6.2) w ogóle nie działa.
daGo
8

Uważam, że przydatne jest mruganie tylko kursora w trybie wstawiania i utrzymywanie go statycznie w innych trybach.

set guicursor+=n-v-c:blinkon0
user41365
źródło
2

Nie jestem pewien, czy ktoś inny napotyka opóźnienie po naciśnięciu Escklawisza, aby wrócić do trybu normalnego i wyświetlić kursor blokowy, ale jeśli tak, to też to naprawiam.

Właściwie używam iTerm2 i używam Vima w moim terminalu na macOS. A kiedy wchodzisz do trybu wstawiania, kursor nadal jest blokiem i jest trochę mylący, gdy jesteś w trybie wstawiania lub trybie normalnym.

Chciałem pokazać cienką linię jako kursor w trybie wstawiania iz powrotem do bloku w trybie normalnym, tak jak robi to MacVim. Aby to zrobić, jest to całkiem proste, po prostu dodałem to do mojego .vimrcpliku, jak opisano tutaj :

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

wprowadź opis obrazu tutaj

Ale jak widać, było opóźnienie po naciśnięciu przycisku, ESCaby wyjść z trybu wstawiania z powrotem do trybu normalnego i ponownie wyświetlić blok jako kursor. Aby to naprawić, znalazłem to:

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

A teraz działa całkiem nieźle, jak widać:

naprawiono opóźnienie powrotu do bloku jako kursora

Mam nadzieję, że pomoże to komukolwiek innemu! 👻

alexventuraio
źródło
1

Nie wydaje mi się, żeby to dodało wiele do odpowiedzi, których już udzieliły inne osoby, ale chciałem jakoś podsumować wszystko w jednym miejscu, a także mieć linki do odpowiednich odniesień.

Tak wygląda odpowiedni fragment z mojego .vimrcwyglądu:

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

Uwaga: '^['Znaki są w rzeczywistości jednym ESCznakiem sterującym (sekwencja ucieczki).

Zdzisław Śliwiński
źródło
0

Działa to poprawnie na terminalu xfce4:

dodaj następujący skrypt do swojego .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

Brief: Jak wiesz xfce4-końcowy utrzymuje preferencje w .config/xfce4/terminal/terminalrcpliku. Skrypt zmienia się TERMINAL_CURSOR_SHAPE_BLOCKna TERMINAL_CURSOR_SHAPE_IBEAMkiedy jesteś w trybie wstawiania i wraca do blokowania kiedy wychodzisz z trybu wstawiania lub vim'a. Krępuj się zmienić IBEAMna cokolwiek chcesz ( BLOCK, IBEAMi UNDERLINEjest dostępny).

amirali
źródło
0

Jeśli używasz nowoczesnej wersji programu nvimi chcesz to osiągnąć, możesz uniknąć niektórych z tych wymyślnych obejść wymienionych powyżej.

Poniższe ustawienia przełączą się z kursora blokowego w trybie normalnym na kursor podkreślony przy zamianie na kursor liniowy przy wstawianiu.

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

Udało mi się to uruchomić z następującymi ustawieniami pobranymi z tych dwóch źródeł.

tui-kształt-kursora

guicursor

thrgamon
źródło
-2

Zwykle mam między innymi aktualny tryb vima na statusline. Jeśli szukasz prostoty, możesz ustawić tylko te informacje w linii stanu .

Jednak zazwyczaj naprawdę szalone rzeczy zdarzają się, gdy masz wciśnięty Caps Lock i jesteś w trybie poleceń (ponieważ hjkl to teraz HJKL - wystarczy J i K, aby wyrywać włosy, gdy nie rozumiesz, co się dzieje. :h Ji :h Kzobaczyć, co mam na myśli). Tylko uważaj na klawisz Caps Lock, a przez większość czasu IMO będzie dobrze.

GmonC
źródło
46
Jak to odpowiada na pytanie?
David Rivers
1
@DavidRivers Jest to aplikacja problemu XY, w której OP prosił o rozwiązanie swojego problemu (nie wiedząc o byciu w normalnym trybie Vima i chciał, aby kursor się zmienił, aby to wskazać), ale okazał się zadowolony z alternatywy (a IMO nie świetne) rozwiązanie (zwiększenie jego statusu w państwie)
Steven Lu