Vim에서 일반 모드와 삽입 모드 사이에서 커서를 어떻게 변경합니까?


106

가능한 경우 어떤 모드에 있는지에 따라 Vim의 커서 (색상, 모양 등)를 변경하는 방법을 알고 싶습니다.

나는 삽입 모드에 있지 않다는 것을 끊임없이 잊고 코드를 입력하기 시작합니다. 그 결과 모든 종류의 미친 일이 발생합니다. 커서에 일종의 시각적 표시가 있으면 도움이 될 것입니다.


19
한 가지 규칙을 배우는 것이 좋습니다. 입력 중지 => 삽입 모드 종료. 그러면 삽입 모드에 있지 않다는 것을 잊은 상황을 결코 관찰 할 수 없습니다.
ZyX 2011-06-28

2
@ZyX 를 제외시켰다 당신이 중지 입력을 가진 후 삽입 모드를 종료하는 것을 잊지 때 : P
gented

3
@ZyX는 훌륭한 규칙이며 저는 항상 그렇게 해왔지만 시각적 표시기는 여전히 중요합니다. 마리화나는 이제 합법적이며 항상 내가하는 일을 잊어 버립니다.
felwithe

답변:


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

@Tankor :이 cursorline옵션은 플랫폼 별 기능에 의존하지 않습니다. 이 +syntax기능으로 컴파일 된 모든 Vim 인스턴스에서 사용할 수 있습니다 (일반적으로 그렇습니다).
ib.

물론 zo와 같은 영구성을 위해 ~ / .vimrc에 저장하십시오.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-256colortmux를 시작하기 전에 설정 하거나 다음을 추가하십시오 .tmux.conf( @Steven Lu 감사합니다 ).

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

2
지금 alacritty 큰 작품
스티븐 루에게

xfce4 터미널에서 완벽하게 작동
korst1k

: 그것은 퍼티에서 작동하지 않는 이유에 대해 @Charles이 볼 superuser.com/questions/304318/...
WesternGun

1
내 업데이트 : set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'내 tmux 구성에서 마지막으로 작업 합니다. 만약 당신 setterminal-overrideswithout 를 사용한다면 -a, 그것은 이미 기본적으로있는 설정을 재정의 할 것입니다.
Steven Lu

1
솔루션이 단순 터미널에서 삽입 모드에서 일반 모드로 모양을 변경하는 데 상당한 지연이 있습니다 (suckless st)
daGo

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
Steven Lu

@StevenLu는 실제로 제안 된 답변의 하나가 iTerm2 (Mac)에서 작동하지 않았지만 이것이 작동했습니다. 이 물건은 당신이 예상하는 것보다 더 이상합니다.
CS

이 커서 물건은 확실히 거기에있는 이상한 것들 중 하나입니다. tmux가 일부 답변이 가능성을 나타내는 커서 상태 추적을 수행하지 않는 것처럼 보이기 때문에 적절한 설정이 없다고 생각조차하지 않습니다. 삽입 모드에서 커서를 한 줄로 설정하는 작업을 vim이 처리하도록하는 것만으로도 충분히 행복했습니다.
Steven Lu

나는 이것을 알아 냈다. 해결책은 tmux를 조정하여 적절하게 처리하는 것이며 명확하지 않을 수 있습니다. 내가 할 필요가 나의 TMUX의 설정의가 있음을 확인했다 terminal-overrides그렇지 소지품 않았다, 그래서에만 추가되고 있었다 ,*:Ss=\E[%p1%d q:Se=\E[2 q의 일부를 terminal-overrides. 그래서 내 구성은 다음과 같습니다 set -sa terminal-overrides ",xterm-256color-italic:Tc"(커서 스타일 Ss / Se를 짓밟 지 않고 활성화하는 24 비트 색상을 설정합니다.
Steven Lu

13

다른 모드에서 커서 모양을 변경하려면 다음을 .vimrc파일에 추가 할 수 있습니다 .

그놈 터미널 (버전 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

그놈 터미널에서 둘 이상의 프로파일을 사용하는 경우이를 프로파일에 맞게 조정해야 할 수 있습니다.

KDE4의 Konsole :

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

이것은 여러 탭과 창에서 작동합니다.

참조 : Vim Tips Wiki의 " 다른 모드에서 커서 모양 변경 " .


13
나는 주로 퍼티와 함께 ​​ssh보다 tmux에서 vim을 사용합니다. 더 보편적 인 옵션이 있습니까?
lanrat

매력처럼 작동했습니다. 감사.
Ernest

1
gconftool-2 명령을 통해 gnome-terminal의 설정을 변경하는 것은 매우 나쁜 생각입니다. Vim이 실행되는 터미널뿐만 아니라 동일한 프로필의 다른 모든 현재 및 향후 그놈 터미널 탭에도 영향을 미칩니다.
egmont

이것은 konsole에서 작동합니다. 감사합니다. 그러나 하나의 문제는 삽입 모드를 종료하면, slooow하지 않도록 이유이다
호앙 트란

1
사용 @HoangTranset ttimeoutlen=0
Bananach

10

Terminus Vim 플러그인을 사용해 볼 수 있습니다 .

삽입 모드에서는 커서 모양이 얇은 수직 막대로 변경됩니다. 바꾸기 모드에서는 밑줄로 바뀝니다. 일반 모드로 돌아 가면 표준 "블록"모양으로 돌아갑니다.


이것은 가장 현명한 해결책 인 것 같습니다. VIM, standard에서 직접 설정해야합니다.
user12711

요구 사항 : gnome-terminal ( wiki.gnome.org/Apps/Terminal ) 및 VTE 라이브러리를 사용하는 기타 터미널 ( github.com/GNOME/vte ) : 부분적으로 지원됩니다 (예 : 커서 모양 변경은 지원하지만 포커스보고는 지원하지 않음). 제 경우에는 (그놈 터미널 3.6.2) 전혀 작동하지 않습니다.
daGo

8

삽입 모드에서만 커서를 깜박이고 다른 모드에서는 고정 상태로 유지하는 것이 유용합니다.

set guicursor+=n-v-c:blinkon0

2

Esc블록 커서를 표시하기 위해 일반 모드로 돌아 가기 위해 키를 누른 후 다른 사람이 지연을 겪고 있는지 확실하지 않지만 그렇다면 이것이 내가 수정하는 방법입니다.

사실 저는 iTerm2를 사용하고 있으며 macOS의 터미널에서 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_BLOCKTERMINAL_CURSOR_SHAPE_IBEAM있을 때로 변경 되고 삽입 모드 또는 vim을 종료하면 다시 차단됩니다. 변경 자유롭게 IBEAM당신이 원하는 무엇이든에 ( BLOCK, IBEAM그리고 UNDERLINE가능).


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

이 두 소스에서 가져온 다음 설정으로이 작업을 수행했습니다.

tui-cursor-shape

Guicursor


-2

저는 보통 상태 표시 줄에 현재 vim 모드가 있습니다. 단순성을 추구 하는 경우이 정보 만 상태 표시 줄에 설정할 수 있습니다 .

그러나 일반적으로 대문자 잠금이 눌려져 있고 명령 모드에있을 때 정말 미친 일이 발생합니다 (이제 hjkl이 HJKL이므로 J와 K 만 있으면 무슨 일이 일어나고 있는지 이해할 수 없을 때 머리카락을 뽑을 수 있습니다. :h J그리고 :h K내가 의미하는 바를 보려면). 그냥 캡 키 잠금 조심 당신은 IMO 잘 대부분의 시간을 수 있습니다.


46
이것은 질문에 어떻게 대답합니까?
David Rivers

1
@DavidRivers OP가 문제에 대한 해결책을 요청하고 있었지만 (vim 일반 모드에있는 것에 대해 모르고 커서를 변경하여 표시하기를 원함) 대안에 만족하는 것으로 판명 된 XY 문제의 응용 프로그램입니다. 큰) 용액 (주 그의 statusline) 강화
스티븐 루
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.