如何在Vim的正常模式和插入模式之间更改光标?

如何在Vim的正常模式和插入模式之间更改光标?,vim,Vim,如果可能的话,我想知道如何根据您所处的模式更改Vim中的光标(颜色、形状等) 我经常忘记我没有处于插入模式,开始输入代码,这导致了各种疯狂的事情发生。如果光标上有某种视觉指示,这将很有帮助。要在不同模式下更改光标的形状,可以将以下内容添加到.vimrc文件中 对于GNOME终端(版本2.26): 如果您在GNOME终端中使用多个配置文件,您可能必须将其适应您的配置文件 对于KDE4中的Konsole: let &t_SI = "\<Esc>]50;CursorSha

如果可能的话,我想知道如何根据您所处的模式更改Vim中的光标(颜色、形状等)


我经常忘记我没有处于插入模式,开始输入代码,这导致了各种疯狂的事情发生。如果光标上有某种视觉指示,这将很有帮助。

要在不同模式下更改光标的形状,可以将以下内容添加到
.vimrc
文件中

对于GNOME终端(版本2.26):

如果您在GNOME终端中使用多个配置文件,您可能必须将其适应您的配置文件

对于KDE4中的Konsole:

let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"
let&t\u SI=“\]50;光标形状=1\x7”
让&t\u EI=“\]50;光标形状=0\x7”
这适用于多个选项卡和窗口


另请参见:“on.

指示从插入模式切换到插入模式的常用方法是 切换
cursorline
选项,该选项负责 当前屏幕行高亮显示(请参见帮助光标行)

或者,或者:

:autocmd InsertEnter * set cul
:autocmd InsertLeave * set nocul
修改
光标线
突出显示组以更改样式 根据您的喜好选择光标行的位置(请参见
:帮助:突出显示

:帮助突出显示组。

除其他事项外,我通常将当前vim模式设置为statusline。如果你追求简单,你可以设置


然而,当你按下caps lock并处于命令模式时,通常会发生真正疯狂的事情(因为hjkl现在是hjkl-当你不明白发生了什么时,只要J和K就足以让你拔掉头发。做a
:hj
:hk
看看我的意思)。只要在我看来,你大部分时间都会没事的。

我发现在插入模式下只让光标闪烁,而在其他模式下保持它静止是很有用的

set guicursor+=n-v-c:blinkon0

如果您在macOS上使用tmuxiTerm2
以下内容将光标从块更改为光标,并高亮显示当前行

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
如果存在(“$TMUX”)
让&t\u SI=“\Ptmux;\\]50;光标形状=1\x7\\\”
让&t\u EI=“\Ptmux;\\]50;光标形状=0\x7\\\”
其他的
让&t\u SI=“\]50;光标形状=1\x7”
让&t\u EI=“\]50;光标形状=0\x7”
恩迪夫
:autocmd插入器*设置cul
:autocmd InsertLeave*设置nocul

信用证:

以下在xterm、urxvt和Linux上的其他终端模拟器中工作:;macOS上的iTerm2;Windows上带有ConEmu的Git Bash;以及更多(见评论):

let&t_SI=“\e[6 q”
let&t_EI=“\e[2 q”
'启动时重置光标(对于旧版本的vim,通常不需要)
augroup-myCmds
哎呀!
autocmd VIMCENTER*静音!回声-ne“\e[2 q”
螺旋端
其他选项(替换
\e[
之后的数字):

Ps=0->闪烁块。
Ps=1->闪烁块(默认)。
Ps=2->稳定块。
Ps=3->闪烁下划线。
Ps=4->稳定下划线。
Ps=5->闪烁条(xterm)。
Ps=6->稳定杆(xterm)。

当您使用tmux时,这样使用它很重要(没有
\Ptmux;
转义)。当您切换窗口/窗格时,tmux将跟踪正确的光标形状

如果它不适用于您,请尝试在启动tmux之前设置
TERM=xterm-256color
,或者将其添加到
.tmux.conf
():

set-ga终端覆盖',*:Ss=\E[%p1%d q:Se=\E[2 q'
您可以尝试以下方法:

在插入模式下,光标形状变为细竖条。在替换模式下,光标形状变为下划线。返回正常模式后,光标形状变为标准的“块”形状


这在xfce4终端上正常工作:

将以下脚本添加到
.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
简介:
正如您所知,xfce4 terminal在
.config/xfce4/terminal/terminalrc
文件中保留首选项。当您处于插入模式时,脚本将
终端光标形状块
更改为
终端光标形状块
,当您离开插入模式或vim时,脚本将返回到块。请随意更改
IBEAM
BLOCK
IBEAM
UNDERLINE
可用)。

不确定是否有其他人在按Esc键返回正常模式以显示块光标后遇到延迟,但如果是,我也会这样解决

实际上,我在macOS上的终端中使用了iTerm2和Vim。当进入插入模式时,光标仍然是一个块,当您处于插入模式或正常模式时,会有点混乱

我想在插入模式下显示一条细线作为光标,在正常模式下显示回块,就像MacVim一样。要做到这一点非常简单,只需将它添加到我的
.vimrc
文件中,如下所示:

let&t\u SI=“\]50;光标形状=1\x7”
让&t\u SR=“\]50;光标形状=2\x7”
让&t\u EI=“\]50;光标形状=0\x7”

但正如您所看到的,当点击
ESC
退出插入模式回到正常模式并再次将块显示为光标时,出现了延迟。因此,为了解决此问题,我发现:

设置ttimeout
设置ttimeoutlen=1

set listchars=tab:>-,trail:~,extends:>,prefers:如果您使用的是现代版的
nvim
,并且希望实现这一点,那么可以避免上面列出的一些奇特的解决方法

以下设置将从正常模式下的块光标切换到替换中的下划线光标,再切换到插入中的线条光标

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

我通过从这两个来源提取的以下设置成功地实现了这一点


我不认为这会给其他人已经提供的答案增加太多,但我想在一个地方总结一下,并提供相关参考资料的链接

这是my
.vimrc
中的相关代码片段的样子:

    " 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)
注意:
'^['
字符实际上是一个
ESC
(转义序列)控件c
# ~/.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
    " 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)