如何在插入/普通模式下更改Vim光标?


106

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

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


19
我建议您学习一条规则:停止键入=>退出插入模式。这样一来,您将永远不会忘记忘记您​​未处于插入模式的情况。
ZyX 2011年

2
@ZyX 除外当你忘记有停止打字后退出插入模式:P
gented

3
@ZyX是一个很好的规则,我一直都这样做,但是视觉指示器仍然很重要。大麻现在合法了,我忘记了我一直在做什么。
felwithe

Answers:


107

指示切换到插入模式和从插入模式切换的流行选项是切换该cursorline选项,该选项负责当前屏幕行是否突出显示(请参阅参考资料:help cursorline):

:autocmd InsertEnter,InsertLeave * set cul!

或者,

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

修改CursorLine突出显示组以将光标线的样式更改为您喜欢的样式(请参阅:help :highlight:help highlight-groups)。


5
我还将cul设置为higlight bg而不是默认下划线:hi CursorLine cterm = NONE ctermbg = black
Nikita Prokopov

有没有理由在Cygwin的vim中不起作用?我在编辑器中并输入了两组行,而且除了整列或整行高亮显示之外,我都无法设置任何一种突出显示功能
TankorSmash 2012年

@Tankor:该cursorline选项不依赖于任何特定于平台的功能;它可以在任何使用该+syntax功能编译的Vim实例上使用(通常是这种情况)。
ib。

当然,将其保存到您的〜/ .vimrc中以使其永久存在,如zo:echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
alchemy

75

以下在Linux上的xterm,urxvt和其他终端仿真器中起作用;macOS上的iTerm2;Windows上的带有ConEmu的Git Bash;以及更多(请参阅评论):

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

其他选项(在后面替换数字\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时,像这样使用它(不进行\<Esc>Ptmux;转义)很重要。切换窗口/窗格时,tmux会跟踪正确的光标形状。

如果对您不起作用,请尝试TERM=xterm-256color在启动tmux之前进行设置,或将其添加到您的菜单中.tmux.conf感谢@Steven Lu):

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

2
现在可以出色地播放运动了
史蒂文·卢

在xfce4终端中完美工作
korst1k

@Charles关于它为什么不能在腻子中起作用的信息,请参见:superuser.com/questions/304318/…–
WesternGun

1
我的更新:终于可以set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'在我的tmux配置中使用了。显然,如果将setfor用作terminal-overrides不带-a,它将覆盖设置,默认情况下该设置已经存在。
史蒂文·卢

1
该解决方案在简单终端(无吸st)
上将

16

如果在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

信用:https//gist.github.com/andyfowler/1195581


1
请注意,这特定于iTerm。由于标准端子实际上也可以工作,但也可以在所有其他支持终端中工作,因此这可能是错误的答案。看这里-> stackoverflow.com/a/42118416/340947
史蒂芬·卢

@StevenLu实际上,您建议的答案中的一个不适用于iTerm2(Mac),而这个有效。这些东西比您预期的要怪。
CS CS

这些游标绝对是其中的一种较轻浮的东西。我只是意识到,甚至认为我没有正确的设置,因为tmux似乎没有执行光标状态跟踪,某些答案表明这是可能的。我很高兴能让vim在插入模式下处理将光标设置为一行。
史蒂文·卢

我知道了这个东西。解决方案是调整tmux以正确处理它,这可能不是很明显。我需要做的是确保terminal-overrides仅将tmux配置附加到其后,从而不会破坏的,*:Ss=\E[%p1%d q:Se=\E[2 q一部分terminal-overrides。所以我的配置看起来像set -sa terminal-overrides ",xterm-256color-italic:Tc"(设置24位色可实现无践踏光标风格SS / SE。
史蒂芬路

13

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

对于GNOME终端(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终端中使用多个配置文件,则可能必须使它适应您的配置文件。

对于KDE4中的Konsole:

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

这适用于多个选项卡和窗口。

另请参见:Vim Tips Wiki上的“ 在不同模式下更改光标形状 ” 。


13
我主要在tmux中使用vim在腻子上而不是ssh上。还有更通用的选择吗?
lanrat 2011年

像魅力一样工作。谢谢。
欧内斯特(Ernest)2012年

1
通过gconftool-2命令更改gnome-terminal的设置是一个非常糟糕的主意。它不仅会影响运行vim的终端,还会影响同一配置文件的所有其他当前和将来的gnome-terminal选项卡。
egmont

这适用于Konsole,谢谢。但是一个问题是退出插入模式的时间很短,不确定为什么
晃陈德良

1
@HoangTran使用set ttimeoutlen=0
Bananach

10

您可以尝试一下terminus vim插件

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


这似乎是最明智的解决方案。在VIM标准中应直接为此设置一个:set。
user12711

要求:gnome-terminal(wiki.gnome.org/Apps/Terminal)和其他使用VTE库的终端(github.com/GNOME/vte):部分受支持(例如,支持更改光标形状但不支持焦点报告)。就我而言(gnome终端3.6.2),它根本不起作用。
daGo

8

我发现仅在插入模式下使光标闪烁而在其他模式下使光标闪烁是很有用的。

set guicursor+=n-v-c:blinkon0

2

不知道其他人在击中后是否面临延迟 Esc按下键返回到正常模式以显示块光标但是如果是这样,我也是通过这种方式修复它。

实际上,我在macOS的终端中使用iTerm2和Vim。而且,当进入插入模式时,光标仍然是一个障碍,当您处于插入模式或普通模式时,会造成混淆。

我想在插入模式下显示细线作为光标,而在正常模式下像MacVim那样返回到块。这样做非常简单,只需按以下说明将其添加到我的.vimrc文件中即可

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

在此处输入图片说明

但是如您所见,单击ESC以退出插入模式回到正常模式并再次将块显示为光标时存在延迟。因此,要解决此问题,我发现了这一点:

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

现在,您可以看到它运行良好:

修复延迟返回到作为光标的块

我希望它可以帮助其他任何人!👻


1

我认为这不会给其他人已经提供的答案增加太多,但我想以某种方式总结一下内容,并提供指向相关参考资料的链接。

这是我.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(转义序列)控制字符。


0

这在xfce4-terminal上可以正常工作:

将以下脚本添加到您的 .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文件中。当您处于插入模式时,脚本将更TERMINAL_CURSOR_SHAPE_BLOCK改为TERMINAL_CURSOR_SHAPE_IBEAM;当您离开插入模式或vim时,脚本将返回至阻止状态。随意更改IBEAM到任何你想要的(BLOCKIBEAMUNDERLINE可用)。


0

如果您使用的是的现代版本,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

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

我设法通过从这两个来源获取的以下设置来使其工作。

指针形

游标


-2

通常,我通常会将当前的vim模式放到statusline上。如果您寻求简单性,则只能将此信息设置在状态行上

但是,通常最疯狂的事情是在您按下大写锁定并处于命令模式时发生的(因为hjkl现在是HJKL-仅J和K足以使您在不了解正在发生的情况时拔掉头发。):h J:h K了解我的意思)。只要当心大写锁定键,您在大多数情况下都会没事的。


46
这如何回答这个问题?
大卫·里弗斯

1
@DavidRivers这是XY问题的一种应用,其中OP要求解决他的问题(不知道处于vim正常模式并希望更改光标以指示它),但对其他选择感到满意(而IMO则不满意)解决方案(增强国家地位)
史蒂芬·卢
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.