Làm cách nào để thay đổi con trỏ Vim trong chế độ Chèn / Thường?


105

Tôi muốn biết, nếu có thể, cách thay đổi con trỏ trong Vim (về màu sắc, hình dạng, v.v.) tùy thuộc vào chế độ bạn đang ở.

Tôi liên tục quên rằng tôi không ở chế độ chèn và bắt đầu nhập mã, điều này dẫn đến tất cả những điều điên rồ xảy ra. Sẽ rất hữu ích nếu có một số loại chỉ dẫn trực quan trên con trỏ.


19
Tôi khuyên bạn nên tìm hiểu một quy tắc: dừng nhập => thoát khỏi chế độ chèn. Sau đó, bạn sẽ không bao giờ quan sát một tình huống mà bạn quên rằng bạn không ở chế độ chèn.
ZyX

2
@ZyX ngoại trừ trường hợp bạn quên thoát khỏi chế độ chèn sau khi ngừng nhập: p
gented

3
@ZyX đó là một quy tắc tốt và tôi đã luôn làm điều đó, nhưng các chỉ số hình ảnh vẫn quan trọng. Cần sa là hợp pháp và tôi luôn quên mình đang làm gì.
felwithe

Câu trả lời:


106

Một tùy chọn phổ biến để chỉ ra việc chuyển sang và chuyển từ chế độ Chèn là bật / tắt cursorlinetùy chọn, tùy chọn này chịu trách nhiệm về việc dòng màn hình hiện tại có được đánh dấu hay không (xem :help cursorline):

:autocmd InsertEnter,InsertLeave * set cul!

Hay cách khác,

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

Sửa đổi CursorLinenhóm tô sáng để thay đổi kiểu của dòng con trỏ theo ý thích của bạn (xem :help :highlight:help highlight-groups).


5
Tôi cũng đặt cul thành higlight bg thay vì gạch chân mặc định: hi CursorLine cterm = NONE ctermbg = black
Nikita Prokopov

Có lý do gì mà điều này không hoạt động trong vim của cygwin? Tôi trong trình soạn thảo và đi vào cả hai thiết lập đường dây, và tôi đã không thể thiết lập bất kỳ loại nổi bật, ngoài cột hoặc hàng highligting đầy đủ
TankorSmash

@Tankor: cursorlineTùy chọn không phụ thuộc vào bất kỳ khả năng cụ thể của nền tảng nào; nó có sẵn trên bất kỳ phiên bản Vim nào được biên dịch với +syntaxtính năng (thường là như vậy).
ib.

Tất nhiên, hãy lưu điều đó vào ~ / .vimrc của bạn để có sự lâu dài như zo:echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
alchemy

75

Phần sau hoạt động trong xterm, urxvt và các trình giả lập đầu cuối khác trên Linux; iTerm2 trên macOS; Git Bash với ConEmu trên Windows; và hơn thế nữa (xem bình luậ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

Các tùy chọn khác (thay thế số sau \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).

Khi bạn sử dụng tmux , điều quan trọng là phải sử dụng nó như vậy (không có \<Esc>Ptmux;lối thoát). tmux sẽ theo dõi hình dạng con trỏ chính xác khi bạn chuyển đổi cửa sổ / ngăn.

Nếu nó không hiệu quả với bạn, hãy thử đặt TERM=xterm-256colortrước khi bắt đầu tmux hoặc thêm cái này vào của bạn .tmux.conf( cảm ơn @Steven Lu ):

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

2
Hiện đang hoạt động tuyệt vời trong môi trường sống
Steven Lu

Hoạt động hoàn hảo trong xfce4-thiết bị đầu cuối
korst1k

@Charles Về lý do tại sao nó không hoạt động trong putty, hãy xem điều này: superuser.com/questions/304318/…
WesternGun,

1
Cập nhật của tôi: cuối cùng cũng hoạt động với set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'cấu hình tmux của tôi. Rõ ràng nếu bạn sử dụng setcho terminal-overrideskhông -a, nó sẽ ghi đè lên các thiết lập, mà đã có này có theo mặc định.
Steven Lu

1
giải pháp có độ trễ đáng kể trong việc thay đổi hình dạng từ chế độ chèn sang chế độ bình thường trên thiết bị đầu cuối đơn giản (suckless st)
daGo

16

Nếu bạn đang sử dụng tmuxiTerm2 trên macOS , thao
tác sau sẽ thay đổi con trỏ từ một khối thành một con trỏ và đánh dấu dòng hiện tại

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

tín dụng: https://gist.github.com/andyfowler/1195581


1
Lưu ý rằng điều này dành riêng cho iTerm . Vì các thiết bị tiêu chuẩn thực sự cũng hoạt động nhưng cũng hoạt động trong tất cả các thiết bị đầu cuối hỗ trợ khác, đây có thể là câu trả lời sai. Nhìn đây -> stackoverflow.com/a/42118416/340947
Steven Lu

@StevenLu thực sự là một trong câu trả lời được đề xuất của bạn không hoạt động cho iTerm2 (Mac), trong khi cái này hoạt động. Công cụ này phức tạp hơn bạn có thể mong đợi.
CS

Công cụ con trỏ này chắc chắn là một trong những thứ khó hiểu hơn ngoài kia. Tôi chỉ nhận ra rằng thậm chí không nghĩ rằng tôi có một thiết lập thích hợp, vì tmux dường như không thực hiện theo dõi trạng thái con trỏ mà một số câu trả lời chỉ ra là có thể xảy ra. Tôi đã rất hạnh phúc chỉ để có được vim xử lý việc đặt con trỏ thành một dòng trên chế độ chèn.
Steven Lu

Tôi đã tìm ra thứ này. Giải pháp là điều chỉnh tmux để xử lý đúng cách và nó có thể không rõ ràng. Những gì tôi cần làm là đảm bảo rằng cấu hình tmux của tôi terminal-overrideschỉ được thêm vào, vì vậy nó không cản trở ,*:Ss=\E[%p1%d q:Se=\E[2 qphần của terminal-overrides. để cấu hình ngoại hình của tôi như set -sa terminal-overrides ",xterm-256color-italic:Tc"(để thiết lập màu 24-bit cho phép mà không chà đạp kiểu con trỏ Ss / Se.
Steven Lu

13

Để thay đổi hình dạng của con trỏ ở các chế độ khác nhau, bạn có thể thêm phần sau vào .vimrctệp của mình .

Đối với GNOME Terminal (phiên bản 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

Nếu bạn sử dụng nhiều cấu hình trong GNOME Terminal, bạn có thể phải điều chỉnh cấu hình này cho phù hợp với cấu hình của mình.

Đối với Konsole trong KDE4:

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

Điều này hoạt động với nhiều tab và cửa sổ.

Xem thêm: “ Thay đổi hình dạng con trỏ ở các chế độ khác nhau ” trên Vim Tips Wiki .


13
Tôi chủ yếu sử dụng vim trong tmux hơn ssh với putty. Có một lựa chọn phổ quát hơn không?
lanrat

Làm việc như người ở. Cảm ơn.
Ernest

1
Thay đổi cài đặt của gnome-terminal thông qua lệnh gconftool-2 là một ý tưởng rất tồi. Nó không chỉ ảnh hưởng đến thiết bị đầu cuối nơi vim của bạn đang chạy mà còn ảnh hưởng đến tất cả các tab thiết bị đầu cuối gnome hiện tại và tương lai của cùng một cấu hình.
egmont

điều này làm việc cho konsole, cảm ơn bạn. Nhưng có một vấn đề là thoát chế độ chèn thì bị slooow, không hiểu sao
Hoang Tran

1
@HoangTran sử dụngset ttimeoutlen=0
Bananach

10

Bạn có thể thử plugin vim ga cuối :

Trong chế độ chèn, hình dạng con trỏ thay đổi thành một thanh dọc mỏng. Trong chế độ thay thế, nó chuyển thành một gạch dưới. Khi trở về chế độ bình thường, nó sẽ trở lại hình dạng "khối" tiêu chuẩn.


Đây có vẻ là giải pháp hợp lý nhất. Cần có một: đặt cho điều này trực tiếp trong VIM, tiêu chuẩn.
user12711

Yêu cầu: gnome-terminal ( wiki.gnome.org/Apps/Terminal ) và các thiết bị đầu cuối khác sử dụng thư viện VTE ( github.com/GNOME/vte ): Được hỗ trợ một phần (ví dụ: hỗ trợ thay đổi hình dạng con trỏ nhưng không hỗ trợ báo cáo tiêu điểm). Trong trường hợp của tôi (gnome-terminal 3.6.2) nó không hoạt động chút nào.
daGo

8

Tôi thấy hữu ích khi chỉ nhấp nháy con trỏ trong chế độ Chèn và tĩnh ở các chế độ khác.

set guicursor+=n-v-c:blinkon0

2

Không chắc liệu có ai khác đang gặp phải sự chậm trễ sau khi nhấn Escphím để quay lại chế độ bình thường để hiển thị con trỏ khối hay không nhưng nếu vậy, đây cũng là cách tôi sửa nó.

Trên thực tế, tôi đang sử dụng iTerm2 và sử dụng Vim bên trong thiết bị đầu cuối của mình trên macOS. Và khi vào chế độ chèn, con trỏ vẫn là một khối và hơi khó hiểu khi bạn đang ở chế độ chèn hoặc chế độ bình thường.

Tôi muốn hiển thị một đường mảnh dưới dạng con trỏ khi ở chế độ chèn và quay lại chặn khi ở chế độ bình thường như MacVim. Và để làm như vậy, nó khá đơn giản, chỉ cần thêm nó vào .vimrctệp của tôi như được mô tả ở đây :

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

nhập mô tả hình ảnh ở đây

Nhưng như bạn có thể thấy đã có độ trễ khi nhấn ESCđể thoát khỏi chế độ chèn trở lại chế độ bình thường và hiển thị lại khối dưới dạng con trỏ. Vì vậy, để khắc phục nó, tôi tìm thấy điều này:

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

Và bây giờ nó hoạt động khá tốt như bạn có thể thấy:

sửa chữa độ trễ để quay lại chặn dưới dạng con trỏ

Tôi hy vọng nó có thể giúp bất kỳ ai khác! 👻


1

Tôi không nghĩ điều này bổ sung nhiều vào câu trả lời mà những người khác đã cung cấp nhưng tôi muốn bằng cách nào đó tóm tắt mọi thứ ở một nơi và cũng có liên kết đến các tài liệu tham khảo có liên quan.

Đây là đoạn mã có liên quan từ của tôi .vimrctrông như thế nào:

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

Lưu ý: Các '^['ký tự thực sự là một ESCký tự điều khiển (trình tự thoát).


0

Điều này hoạt động bình thường trên xfce4-terminal:

thêm tập lệnh sau vào của bạn .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

Tóm tắt: Như bạn đã biết xfce4-terminal giữ các tùy chọn trong .config/xfce4/terminal/terminalrctệp. Tập lệnh thay đổi TERMINAL_CURSOR_SHAPE_BLOCKthành TERMINAL_CURSOR_SHAPE_IBEAMkhi bạn đang ở chế độ chèn và quay lại chặn khi bạn rời khỏi chế độ chèn hoặc vim. Cảm thấy tự do để thay đổi IBEAMbất cứ điều gì bạn muốn ( BLOCK, IBEAMUNDERLINEcó sẵn).


0

Nếu bạn đang sử dụng phiên bản hiện đại của nvimvà bạn muốn đạt được điều này, bạn có thể tránh một số cách giải quyết ưa thích được liệt kê ở trên.

Các cài đặt dưới đây sẽ chuyển từ con trỏ khối ở chế độ bình thường, thay thế con trỏ gạch dưới sang con trỏ dòng trong chèn.

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

Tôi đã quản lý để làm cho điều này hoạt động với các cài đặt sau được lấy từ hai nguồn này.

tui-con trỏ-hình dạng

guicursor


-2

Tôi thường đặt chế độ vim hiện tại trên dòng trạng thái, trong số những thứ khác. Nếu bạn tìm kiếm sự đơn giản, bạn chỉ có thể đặt thông tin này vào dòng trạng thái .

Tuy nhiên, thông thường những điều thực sự điên rồ sẽ xảy ra khi bạn chán nản khóa mũ và đang ở chế độ lệnh (vì hjkl bây giờ là HJKL - chỉ cần J và K là đủ để khiến bạn sởn tóc gáy khi không hiểu chuyện gì đang xảy ra. Làm a :h J:h Kđể xem ý tôi là gì). Chỉ cần cẩn thận với phím caps lock và bạn sẽ luôn ổn IMO.


46
Làm thế nào để trả lời câu hỏi này?
David Rivers

1
@DavidRivers Đó là một ứng dụng của vấn đề XY trong đó OP đang yêu cầu giải quyết vấn đề của mình (không biết về việc đang ở chế độ bình thường và muốn con trỏ thay đổi để chỉ ra nó) nhưng hóa ra lại hài lòng với một giải pháp thay thế (và IMO thì không một giải pháp tuyệt vời (nâng cao dòng trạng thái của anh ấy với nhà nước)
Steven Lu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.