İmleci Vim'de Normal ve Ekle modları arasında nasıl değiştiririm?


108

Mümkünse, hangi modda olduğunuza bağlı olarak Vim'deki imleci (renk, şekil vb.) Nasıl değiştireceğimi bilmek istiyorum.

Ekleme modunda olmadığımı sürekli unutuyorum ve kod yazmaya başladım, bu da her türlü çılgınca şeyin olmasına neden oluyor. İmleç üzerinde bir çeşit görsel gösterge olsaydı faydalı olurdu.


20
Size bir kural öğrenmenizi öneririm: yazmayı durdurdu => ekleme modundan çık. O zaman ekleme modunda olmadığınızı unuttuğunuz bir durumu asla gözlemlemeyeceksiniz.
ZyX

2
@ZyX hariç durdurulmuş yazarak yaptıktan sonra ekleme modundan çıkmak unuttuğunuzda: p
gented

3
@ZyX bu iyi bir kural ve bunu her zaman yaptım, ancak görsel göstergeler hala önemli. Esrar artık yasal ve her zaman ne yaptığımı unutuyorum.
felwithe

Yanıtlar:


108

Ekle moduna geçişi belirtmek için popüler bir seçenek cursorline, mevcut ekran satırının vurgulanıp vurgulanmadığından sorumlu olan seçeneği değiştirmektir (bkz. :help cursorline):

:autocmd InsertEnter,InsertLeave * set cul!

Veya alternatif olarak:

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

CursorLineİmleç çizgisinin stilini beğeninize göre değiştirmek için vurgulama grubunu değiştirin (bkz. :help :highlightVe :help highlight-groups).


6
Ayrıca cul'u varsayılan alt çizgi yerine higlight bg olarak ayarladım: merhaba CursorLine cterm = HİÇBİRİ ctermbg = siyah
Nikita Prokopov

Bunun cygwin'in vim'inde işe yaramamasının bir nedeni var mı? Editördeyim ve her iki satır kümesine de girdim ve tam sütun veya satır vurgulamanın ötesinde herhangi bir vurgulama ayarlayamadım
TankorSmash

@Tankor: Bu cursorlineseçenek, platforma özgü herhangi bir özelliğe bağlı değildir; +syntaxözellikle (genellikle böyledir) derlenen herhangi bir Vim örneğinde mevcuttur .
ib.

Elbette, zo gibi kalıcılık için ~ / .vimrc dosyanıza kaydedin:echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
simya

76

Aşağıdakiler, Linux'ta xterm, urxvt ve diğer terminal emülatörlerinde çalışır; macOS'ta iTerm2; Windows üzerinde ConEmu ile Git Bash; ve daha fazlası (yorumlara bakın):

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

Diğer seçenekler (ardından numarayı değiştirin \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).

Tmux kullandığınızda , onu bu şekilde ( \<Esc>Ptmux;kaçış olmadan ) kullanmak önemlidir . tmux, pencereleri / bölmeleri değiştirdiğinizde doğru imleç şeklini takip edecektir.

Sizin için işe yaramazsa, tmux'uTERM=xterm-256color başlatmadan önce ayarlamayı deneyin veya bunu .tmux.conf( teşekkürler @Steven Lu ):

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

2
Şimdi alacritty'de harika çalışıyor
Steven Lu


@Charles Macun içinde neden işe yaramadığı hakkında,
şuna

1
Güncellemem: nihayet set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'tmux yapılandırmamda çalışıyor. Görünüşe göre set, terminal-overridesonsuz kullanırsanız -a, varsayılan olarak zaten buna sahip olan ayarı geçersiz kılar.
Steven Lu

1
Çözüm, basit terminalde (suckless st) şekil değiştirme modundan normal moda geçişte önemli bir gecikmeye sahip
daGo

16

Eğer kullanıyorsanız tmux ve iTerm2 üzerinde MacOS ,
şu bir imleç ve ışıklı geçerli satır için bir blok imleci

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

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


1
Bunun iTerm'e özgü olduğunu unutmayın . Standart olanlar aslında çalıştığından, ancak diğer tüm destekleyici terminallerde de çalıştığından, bu muhtemelen yanlış cevaptır. Buraya bak -> stackoverflow.com/a/42118416/340947
Steven Lu

@StevenLu aslında sizin önerdiğiniz yanıt iTerm2 (Mac) için işe yaramadı, ancak bu çalıştı. Bu şeyler beklediğinizden daha zahmetli.
CS

Bu imleç işi kesinlikle oradaki daha ilginç şeylerden biri. Tmux bazı cevapların bir olasılık olduğunu gösterdiği imleç durumu izleme yapıyor gibi görünmediğinden, düzgün bir kurulumum olduğunu bile düşünmediğimi anladım. Sadece imleci ekleme modunda bir satıra ayarlamayı başarmaya yetecek kadar mutlu oldum.
Steven Lu

Bu şeyleri çözdüm. Çözüm, tmux'u düzgün bir şekilde ele almak için ince ayar yapmaktır ve bu açık olmayabilir. Yapmam gereken şey, tmux yapılandırmalarımın terminal-overridesyalnızca eklenmiş olmasını sağlamaktı, böylece bir ,*:Ss=\E[%p1%d q:Se=\E[2 qkısmını bozmadı terminal-overrides. bu yüzden yapılandırmam şöyle görünüyor set -sa terminal-overrides ",xterm-256color-italic:Tc"(24-bit rengi etkinleştirmeyi Ss / Se imleç stillerini ayaklar altına almadan ayarlamak için.
Steven Lu

13

İmlecin şeklini farklı modlarda değiştirmek için, aşağıdakileri .vimrcdosyanıza ekleyebilirsiniz .

GNOME Terminali için (sürüm 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

GNOME Terminalinde birden fazla profil kullanıyorsanız, bunu profillerinize uyarlamanız gerekebilir.

KDE4'teki Konsole için:

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

Bu, birden çok sekme ve pencerede çalışır.

Ayrıca bkz: Vim Tips Wiki'de " Farklı modlarda imleç şeklini değiştirme " .


13
Ben öncelikle macunla ssh yerine tmux'ta vim kullanıyorum. Daha evrensel bir seçenek var mı?
lanrat

Bir cazibe gibi çalıştı. Teşekkürler.
Ernest

1
Gnome-terminalin ayarlarını bir gconftool-2 komutuyla değiştirmek çok kötü bir fikirdir. Yalnızca vim'inizin çalıştığı terminali değil, aynı profilin diğer tüm mevcut ve gelecekteki gnome-terminal sekmelerini de etkiler.
egmont

bu konsole için çalışıyor, teşekkürler. Ancak sorunlardan biri, ekleme modundan çıkmanın yavaş olması, nedenini bilmiyorum
Hoang Tran

1
@HoangTran kullanımıset ttimeoutlen=0
Bananach

10

Terminus Vim eklentisini deneyebilirsiniz :

Ekleme modunda, imleç şekli ince bir dikey çubuğa dönüşür. Değiştirme modunda, alt çizgiye dönüşür. Normal moda dönüldüğünde, standart "blok" şekline geri döner.


Bu en mantıklı çözüm gibi görünüyor. Bunun için doğrudan VIM'de standart bir: set olmalıdır.
user12711

Gereksinimler: gnome-terminal ( wiki.gnome.org/Apps/Terminal ) ve VTE kitaplığını kullanan diğer terminaller ( github.com/GNOME/vte ): Kısmen desteklenir (örneğin, imleç şekli değişikliklerini destekler ancak odak raporlamasını desteklemez). Benim durumumda (gnome-terminal 3.6.2) hiç çalışmıyor.
Dago

8

İmlecin yalnızca Ekle modunda yanıp sönmesini ve diğer modlarda sabit kalmasını yararlı buluyorum.

set guicursor+=n-v-c:blinkon0

2

EscBlok imlecini göstermek için normal moda dönmek için tuşa bastıktan sonra başka birinin bir gecikmeyle karşılaşıp karşılaşmadığından emin değilim, ancak öyleyse, ben de bunu düzeltiyorum.

Aslında iTerm2 kullanıyorum ve macOS'taki terminalimin içinde Vim kullanıyorum. Ve ekleme moduna girerken, imleç hala bir bloktur ve ekleme modunda veya normal moddayken biraz kafa karıştırıcı olur.

Ekleme modundayken imleç olarak ince bir çizgi göstermek ve MacVim'in yaptığı gibi normal moddayken engellemeye geri dönmek istedim. Ve bunu yapmak oldukça basit, sadece bunu dosyama burada açıklandığı.vimrc gibi ekledim :

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

görüntü açıklamasını buraya girin

Ancak gördüğünüz gibi, ESCekleme modundan normal moda geri dönmek ve bloğu tekrar imleç olarak göstermek için basıldığında bir gecikme oldu . Bu yüzden düzeltmek için şunu buldum:

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

Ve şimdi gördüğünüz gibi oldukça iyi çalışıyor:

imleç olarak bloğa geri dönme gecikmesini düzelt

Umarım başka birine yardımcı olabilir! 👻


1

Bunun, diğer insanların zaten vermiş olduğu cevaplara pek bir şey kattığını sanmıyorum, ancak bir şekilde bir yerde bir şeyleri özetlemek ve ilgili referanslara bağlantılara sahip olmak istedim.

Benimle ilgili snippet şu şekilde .vimrcgörünüyor:

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

Not: '^['Karakterler aslında bir ESC(kaçış dizisi) kontrol karakteridir.


0

Bu, xfce4 terminalinde düzgün çalışır:

aşağıdaki komut dosyasını ekleyin .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

Özet: Bildiğiniz gibi xfce4-terminal tercihleri .config/xfce4/terminal/terminalrcdosyada tutar . Komut değiştirir TERMINAL_CURSOR_SHAPE_BLOCKiçin TERMINAL_CURSOR_SHAPE_IBEAMsize ekleme modunda olduğunuzda ve modu veya vim eki ayrılırken geri engellemek için. Değiştirmek için çekinmeyin IBEAMbir şey istediğiniz ( BLOCK, IBEAMve UNDERLINEmevcut).


0

Modern bir sürümünü kullanıyorsanız nvimve bunu başarmak istiyorsanız, yukarıda listelenen bu geçici çözümlerden bazılarından kaçınabilirsiniz.

Aşağıdaki ayarlar, normal modda blok imlecinden, imlecin yerine altı çizili imleci, eklemede satır imlecine geçecektir.

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

Bunu, bu iki kaynaktan alınan aşağıdaki ayarlarla çalıştırmayı başardım.

tui-imleç-şekli

kılavuz


-2

Diğer şeylerin yanı sıra genellikle mevcut vim modunu statusline üzerinde kullanırım. Basitlik arıyorsanız, sadece bu bilgiyi durum satırına koyabilirsiniz .

Bununla birlikte, genellikle gerçekten çılgın şeyler, büyük harf kilidi basılıyken ve komut modundayken olur (çünkü hjkl artık HJKL'dir - sadece J ve K, ne olduğunu anlamadığınızda saçınızı çekmeniz için yeterlidir. :h Jve :h Kne demek istediğimi görmek için). Sadece büyük harf kilidi anahtarına dikkat edin ve IMO'nun çoğu zaman iyi olacaksınız.


46
Bu soruya nasıl cevap veriyor?
David Rivers

1
@DavidRivers OP'nin problemine bir çözüm istediği (vim normal modunda olduğunu bilmeden ve imlecin bunu belirtmek için değiştirmesini istemediği), ancak bir alternatiften memnun olduğu (ve IMO'nun değil) XY probleminin bir uygulamasıdır. harika bir çözüm (devletle olan statüsünü güçlendiriyor)
Steven Lu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.