Bagaimana cara mengubah kursor antara mode Normal dan Sisipkan di Vim?

107

Saya ingin tahu cara mengubah, jika memungkinkan, kursor di Vim (dalam warna, bentuk, dll.) Tergantung pada mode Anda.

Saya terus-menerus lupa bahwa saya tidak dalam mode Sisipkan dan mulai mengetik kode, yang mengakibatkan banyak hal gila terjadi. Akan sangat membantu jika ada semacam indikasi visual pada kursor.

lanrat
sumber
19
Saya menyarankan Anda untuk mempelajari satu aturan: berhenti mengetik => keluar dari mode penyisipan. Maka Anda tidak akan pernah mengamati situasi di mana Anda lupa bahwa Anda tidak dalam mode penyisipan.
ZyX
2
@ZyX kecuali jika Anda lupa untuk keluar dari mode penyisipan setelah berhenti mengetik: p
gented
3
@ZyX itu aturan yang bagus dan saya selalu melakukan itu, tetapi indikator visual tetap penting. Ganja legal sekarang dan saya lupa apa yang saya lakukan sepanjang waktu.
felwithe

Jawaban:

107

Opsi populer untuk menunjukkan peralihan ke dan dari mode Sisipkan adalah mengubah cursorlineopsi, yang bertanggung jawab atas apakah garis layar saat ini disorot (lihat :help cursorline):

:autocmd InsertEnter,InsertLeave * set cul!

atau, sebagai alternatif,

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

Ubah CursorLinegrup penyorotan untuk mengubah gaya garis kursor sesuai keinginan Anda (lihat :help :highlightdan :help highlight-groups).

ib.
sumber
5
Saya juga menyetel cul ke higlight bg alih-alih garis bawah default: hi CursorLine cterm = NONE ctermbg = hitam
Nikita Prokopov
Apakah ada alasan mengapa ini tidak berfungsi di vim cygwin? Saya berada di editor dan memasukkan kedua rangkaian baris, dan saya belum dapat mengatur sorotan apa pun, di luar kolom atau baris penuh highligting
TankorSmash
@Tankor: cursorlineOpsi ini tidak bergantung pada kemampuan khusus platform apa pun; ini tersedia pada setiap instance Vim yang dikompilasi dengan +syntaxfitur tersebut (yang biasanya terjadi).
ib.
Tentu saja, simpan itu ke ~ / .vimrc Anda untuk permanen seperti zo:echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
alchemy
75

Berikut ini bekerja di xterm, urxvt, dan emulator terminal lainnya di Linux; iTerm2 di macOS; Git Bash dengan ConEmu di Windows; dan lainnya (lihat komentar):

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

Opsi lain (ganti nomor setelah \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).

Saat Anda menggunakan tmux , penting untuk menggunakannya seperti itu (tanpa \<Esc>Ptmux;escape). tmux akan melacak bentuk kursor yang benar saat Anda beralih jendela / panel.

Jika tidak berhasil untuk Anda, coba atur TERM=xterm-256colorsebelum memulai tmux, atau tambahkan ini ke Anda .tmux.conf( terima kasih @Steven Lu ):

set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'
laktak
sumber
2
Bekerja dengan baik di alacritty sekarang
Steven Lu
Bekerja sempurna di xfce4-terminal
korst1k
@Charles Tentang mengapa tidak bekerja dalam dempul, lihat ini: superuser.com/questions/304318/…
WesternGun
1
Pembaruan Saya: akhirnya bekerja dengan set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'dalam konfigurasi tmux saya. Rupanya jika Anda menggunakan setuntuk terminal-overridestanpa -a, itu akan menimpa pengaturan, yang sudah memiliki ini di sana secara default.
Steven Lu
1
solusinya memiliki penundaan yang signifikan untuk mengubah bentuk dari mode sisipan ke mode normal pada terminal sederhana (st hisap)
daGo
16

Jika Anda menggunakan tmux dan iTerm2 di macOS ,
berikut ini mengubah kursor dari blok ke kursor dan menyorot baris saat ini

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

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

Maksud
sumber
1
Perhatikan ini khusus untuk iTerm . Karena yang standar sebenarnya juga berfungsi tetapi juga berfungsi di semua terminal pendukung lainnya, ini mungkin jawaban yang salah. Lihat di sini -> stackoverflow.com/a/42118416/340947
Steven Lu
@StevenLu sebenarnya yang ada di jawaban yang Anda sarankan tidak berfungsi untuk iTerm2 (Mac), sementara yang ini berfungsi. Hal ini lebih rumit dari yang Anda duga.
CS
Benda kursor ini jelas merupakan salah satu hal fiddlier di luar sana. Saya baru menyadari bahwa saya bahkan tidak berpikir saya memiliki pengaturan yang tepat, karena tmux tampaknya tidak melakukan pelacakan status kursor yang beberapa jawaban mengindikasikan kemungkinan. Saya cukup senang hanya untuk mendapatkan vim untuk menangani pengaturan kursor ke baris pada mode penyisipan.
Steven Lu
Saya menemukan hal ini. Solusinya adalah mengubah tmux untuk menanganinya dengan benar, dan ini bisa jadi tidak jelas. Yang perlu saya lakukan adalah memastikan bahwa konfigurasi tmux saya terminal-overrideshanya ditambahkan, jadi tidak mengganggu ,*:Ss=\E[%p1%d q:Se=\E[2 qbagian dari terminal-overrides. jadi konfigurasi saya terlihat seperti set -sa terminal-overrides ",xterm-256color-italic:Tc"(untuk mengaktifkan warna 24-bit tanpa menginjak-injak gaya kursor Ss / Se.
Steven Lu
13

Untuk mengubah bentuk kursor dalam mode yang berbeda, Anda dapat menambahkan berikut ini ke dalam .vimrcfile Anda .

Untuk Terminal GNOME (versi 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

Jika Anda menggunakan lebih dari satu profil di Terminal GNOME, Anda mungkin harus menyesuaikannya dengan profil Anda.

Untuk Konsole di KDE4:

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

Ini berfungsi dengan banyak tab dan jendela.

Lihat juga: " Mengubah bentuk kursor dalam mode berbeda " di Vim Tips Wiki .

IvanGL
sumber
13
Saya terutama menggunakan vim di tmux melalui ssh dengan dempul. Apakah ada opsi yang lebih universal?
lanrat
Bekerja seperti pesona. Terima kasih.
Ernest
1
Mengubah pengaturan gnome-terminal melalui perintah gconftool-2 adalah ide yang sangat buruk. Ini tidak hanya mempengaruhi terminal tempat vim Anda berjalan, tetapi juga semua tab gnome-terminal saat ini dan yang akan datang dari profil yang sama.
egmont
ini berfungsi untuk konsole, terima kasih. Tetapi satu masalah adalah keluar dari mode penyisipan adalah lebih lambat, tidak yakin mengapa
Hoang Tran
1
Penggunaan @HoangTranset ttimeoutlen=0
Bananach
10

Anda dapat mencoba plugin Terminus Vim :

Dalam mode sisip, bentuk kursor berubah menjadi bilah vertikal tipis. Dalam mode ganti, itu berubah menjadi garis bawah. Saat kembali ke mode normal, ini kembali ke bentuk standar "balok".

Tim Gabets
sumber
Ini sepertinya solusi yang paling masuk akal. Harus ada: ditetapkan untuk ini langsung di VIM, standar.
pengguna12711
Persyaratan: gnome-terminal ( wiki.gnome.org/Apps/Terminal ) dan terminal lain yang menggunakan perpustakaan VTE ( github.com/GNOME/vte ): Didukung sebagian (misalnya, mendukung perubahan bentuk kursor tetapi tidak mendukung pelaporan fokus). Dalam kasus saya (gnome-terminal 3.6.2) itu tidak berfungsi sama sekali.
daGo
8

Saya merasa berguna jika kursor hanya berkedip dalam mode Sisipkan dan tetap statis dalam mode lain.

set guicursor+=n-v-c:blinkon0
pengguna41365
sumber
2

Tidak yakin apakah ada orang lain yang menghadapi penundaan setelah menekan Esctombol untuk kembali ke mode normal untuk menampilkan kursor blok tetapi jika demikian, ini adalah cara saya memperbaikinya juga.

Sebenarnya saya menggunakan iTerm2 dan menggunakan Vim di dalam terminal saya di macOS. Dan saat masuk ke mode sisip, kursor masih menjadi blok dan agak membingungkan saat Anda berada di mode sisip atau mode normal.

Saya ingin menunjukkan garis tipis sebagai kursor ketika dalam mode penyisipan dan kembali untuk memblokir ketika dalam mode normal seperti yang dilakukan MacVim. Dan untuk melakukannya sangat sederhana, cukup tambahkan ini ke .vimrcfile saya seperti yang dijelaskan di sini :

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

masukkan deskripsi gambar di sini

Tetapi seperti yang Anda lihat, ada penundaan ketika menekan ESCuntuk keluar dari mode penyisipan kembali ke mode normal dan menampilkan blok sebagai kursor lagi. Jadi untuk memperbaikinya saya menemukan ini:

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

Dan sekarang berfungsi dengan baik seperti yang Anda lihat:

perbaiki penundaan kembali untuk memblokir sebagai kursor

Saya harap ini bisa membantu orang lain! 👻

alexventuraio
sumber
1

Saya tidak berpikir ini menambah banyak jawaban yang telah diberikan orang lain tetapi saya ingin meringkas berbagai hal di satu tempat dan juga memiliki tautan ke referensi yang relevan.

Seperti inilah cuplikan relevan dari .vimrcpenampilanku:

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

Catatan: '^['Karakter sebenarnya adalah satu ESCkarakter kontrol (escape sequence).

Zdzisław Śliwiński
sumber
0

Ini bekerja dengan baik di xfce4-terminal:

tambahkan skrip berikut ke .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

Singkat: Seperti yang Anda ketahui xfce4-terminal menyimpan preferensi dalam .config/xfce4/terminal/terminalrcfile. Skrip berubah TERMINAL_CURSOR_SHAPE_BLOCKmenjadi TERMINAL_CURSOR_SHAPE_IBEAMsaat Anda dalam mode penyisipan, dan kembali memblokir saat Anda keluar dari mode penyisipan atau vim. Jangan ragu untuk mengubah IBEAMapa pun yang Anda inginkan ( BLOCK, IBEAMdan UNDERLINEtersedia).

amirali
sumber
0

Jika Anda menggunakan versi modern nvimdan ingin mencapainya, Anda dapat menghindari beberapa solusi mewah yang tercantum di atas.

Pengaturan di bawah ini akan beralih dari kursor blok dalam mode normal, untuk menggarisbawahi kursor sebagai ganti ke kursor garis di sisipkan.

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

Saya berhasil mendapatkan ini bekerja dengan pengaturan berikut yang ditarik dari dua sumber ini.

tui-cursor-shape

kursor

thrgamon.dll
sumber
-2

Saya biasanya memiliki mode vim saat ini ke statusline, antara lain. Jika Anda mencari kesederhanaan, Anda hanya dapat menyetel informasi ini ke baris status .

Namun, biasanya hal-hal yang benar-benar gila terjadi ketika Anda memiliki caps lock tertekan dan berada dalam mode perintah (karena hjkl sekarang adalah HJKL - J dan K saja sudah cukup untuk membuat Anda menarik rambut Anda ketika Anda tidak mengerti apa yang terjadi. :h Jdan :h Kuntuk melihat apa yang saya maksud). Hanya berhati-hatilah tombol caps lock dan Anda akan baik-baik saja sebagian besar waktu IMO.

GmonC
sumber
46
Bagaimana ini menjawab pertanyaan?
David Rivers
1
@DavidRivers Ini adalah aplikasi dari masalah XY di mana OP meminta resolusi untuk masalahnya (tidak tahu tentang berada dalam mode normal vim dan ingin kursor berubah untuk menunjukkannya) tetapi ternyata puas dengan alternatif (dan IMO tidak solusi yang hebat (meningkatkan statusline-nya dengan negara bagian)
Steven Lu