如何在插入/正常模式下更改vim光标?

时间:2011-06-27 04:49:15

标签: vim

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

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

11 个答案:

答案 0 :(得分:86)

一种流行的选项,表示切换到插入模式(并返回正常 模式)切换负责是否的cursorline选项 当前屏幕行突出显示。

:autocmd InsertEnter,InsertLeave * set cul!

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

答案 1 :(得分:43)

以下适用于xterm / urxvt / ...(Linux),iTerm2(Mac),Git Bash和ConEmu(Windows)等(见评论):

let &t_SI = "\e[6 q"
let &t_EI = "\e[2 q"

" optional reset cursor on start:
augroup myCmds
au!
autocmd VimEnter * silent !echo -ne "\e[2 q"
augroup END

当你使用 tmux 时,你必须像这样使用它(没有\<Esc>Ptmux;转义) - 当你切换窗口/窗格时,tmux会跟踪正确的光标形状。如果它不起作用,您可能需要在启动tmux之前设置TERM=xterm-256color

其他选项(替换\ _ [后)的数字:

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

答案 2 :(得分:14)

如果您在 OSX 上使用 tmux iTerm2 , 以下内容将光标从块更改为光标并突出显示当前行

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

答案 3 :(得分:13)

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

对于Gnome-Terminal(版本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-terminal中使用多个配置文件,则可能需要根据配置文件进行调整。

对于KDE4Edit中的Konsole

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

这适用于多个标签和窗口。

http://vim.wikia.com/wiki/Change_cursor_shape_in_different_modes

答案 4 :(得分:7)

我发现只有光标在插入模式下闪烁而静态在其他模式下才有用。

set guicursor+=n-v-c:blinkon0

答案 5 :(得分:7)

您可以尝试terminus vim plugin

  

在插入模式下,光标形状变为细垂直条。在替换模式下,它会变为下划线。返回正常模式后,它将恢复为标准&#34;块&#34;形状

答案 6 :(得分: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(转义序列)控制字符。

答案 7 :(得分:0)

这在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文件中。当您处于插入模式时,脚本会将TERMINAL_CURSOR_SHAPE_BLOCK更改为TERMINAL_CURSOR_SHAPE_IBEAM,而当您离开插入模式或vim时,脚本将返回至阻塞状态。随时将IBEAM更改为所需的任何内容(BLOCKIBEAMUNDERLINE可用)。

答案 8 :(得分:0)

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

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

我想在插入模式下显示细线作为光标,而在正常模式下像MacVim那样返回到块。这样做非常简单,只需将其作为described here添加到我的.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"

enter image description here

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

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

现在您可以看到它工作得很好:

fix delay going back to block as cursor

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

答案 9 :(得分: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

我设法通过从这两个来源获取的以下设置来实现此目的。

enter image description here

tui-cursor-shape

答案 10 :(得分:-2)

我通常将当前的vim模式放在状态行上,等等。如果您寻求简洁,可以设置only this information onto the statusline

然而,通常真正疯狂的事情发生在你已经沮丧并且处于命令模式时(因为hjkl现在是HJKL - 当你不明白发生了什么时,只有J和K足以让你脱掉头发做一个:h J:h K看看我的意思。只需beware the caps lock key,大部分时间IMO都会很好。