가능한 경우 어떤 모드에 있는지에 따라 Vim의 커서 (색상, 모양 등)를 변경하는 방법을 알고 싶습니다.
나는 삽입 모드에 있지 않다는 것을 끊임없이 잊고 코드를 입력하기 시작합니다. 그 결과 모든 종류의 미친 일이 발생합니다. 커서에 일종의 시각적 표시가 있으면 도움이 될 것입니다.
가능한 경우 어떤 모드에 있는지에 따라 Vim의 커서 (색상, 모양 등)를 변경하는 방법을 알고 싶습니다.
나는 삽입 모드에 있지 않다는 것을 끊임없이 잊고 코드를 입력하기 시작합니다. 그 결과 모든 종류의 미친 일이 발생합니다. 커서에 일종의 시각적 표시가 있으면 도움이 될 것입니다.
답변:
삽입 모드 전환을 나타내는 인기있는 옵션 cursorline은 현재 화면 행이 강조 표시되는지 여부를 담당 하는 옵션을 전환하는 것입니다 (참조 :help cursorline).
:autocmd InsertEnter,InsertLeave * set cul!
또는,
:autocmd InsertEnter * set cul
:autocmd InsertLeave * set nocul
CursorLine강조 표시 그룹을 수정하여 커서 선의 스타일을 원하는대로 변경합니다 ( :help :highlight및
참조 :help highlight-groups).
cursorline옵션은 플랫폼 별 기능에 의존하지 않습니다. 이 +syntax기능으로 컴파일 된 모든 Vim 인스턴스에서 사용할 수 있습니다 (일반적으로 그렇습니다).
echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
다음은 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'
set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'내 tmux 구성에서 마지막으로 작업 합니다. 만약 당신 set이 terminal-overrideswithout 를 사용한다면 -a, 그것은 이미 기본적으로있는 설정을 재정의 할 것입니다.
macOS 에서 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
terminal-overrides그렇지 소지품 않았다, 그래서에만 추가되고 있었다 ,*:Ss=\E[%p1%d q:Se=\E[2 q의 일부를 terminal-overrides. 그래서 내 구성은 다음과 같습니다 set -sa terminal-overrides ",xterm-256color-italic:Tc"(커서 스타일 Ss / Se를 짓밟 지 않고 활성화하는 24 비트 색상을 설정합니다.
다른 모드에서 커서 모양을 변경하려면 다음을 .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의 " 다른 모드에서 커서 모양 변경 " .
set ttimeoutlen=0
Terminus Vim 플러그인을 사용해 볼 수 있습니다 .
삽입 모드에서는 커서 모양이 얇은 수직 막대로 변경됩니다. 바꾸기 모드에서는 밑줄로 바뀝니다. 일반 모드로 돌아 가면 표준 "블록"모양으로 돌아갑니다.
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
이제 보시다시피 꽤 잘 작동합니다.
다른 사람에게 도움이되기를 바랍니다. 👻
이것은 다른 사람들이 이미 제공 한 답변에 많은 것을 추가한다고 생각하지 않지만 어떻게 든 한곳에 요약하고 관련 참조에 대한 링크를 갖고 싶었습니다.
내 관련 스 니펫은 .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(이스케이프 시퀀스) 제어 문자입니다.
이것은 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당신이 원하는 무엇이든에 ( BLOCK, IBEAM그리고 UNDERLINE가능).
의 최신 버전을 사용 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
이 두 소스에서 가져온 다음 설정으로이 작업을 수행했습니다.
저는 보통 상태 표시 줄에 현재 vim 모드가 있습니다. 단순성을 추구 하는 경우이 정보 만 상태 표시 줄에 설정할 수 있습니다 .
그러나 일반적으로 대문자 잠금이 눌려져 있고 명령 모드에있을 때 정말 미친 일이 발생합니다 (이제 hjkl이 HJKL이므로 J와 K 만 있으면 무슨 일이 일어나고 있는지 이해할 수 없을 때 머리카락을 뽑을 수 있습니다. :h J그리고 :h K내가 의미하는 바를 보려면). 그냥 캡 키 잠금 조심 당신은 IMO 잘 대부분의 시간을 수 있습니다.