ฉันต้องการทราบวิธีการเปลี่ยนเคอร์เซอร์ใน 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
ตัวเลือกนี้ไม่ได้ขึ้นอยู่กับความสามารถเฉพาะแพลตฟอร์มใด ๆ มันมีอยู่ในอินสแตนซ์ Vim ใด ๆ ที่คอมไพล์ด้วย+syntax
ฟีเจอร์ (ซึ่งโดยปกติจะเป็นเช่นนั้น)
echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
ต่อไปนี้ทำงานใน xterm, urxvt และโปรแกรมจำลองเทอร์มินัลอื่น ๆ บน Linux iTerm2 บน macOS; Git Bash กับ ConEmu บน Windows; และอื่น ๆ (ดูความคิดเห็น):
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'
set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'
การกำหนดค่า tmux ของฉัน เห็นได้ชัดว่าถ้าคุณใช้set
สำหรับการterminal-overrides
ได้โดยไม่ต้อง-a
ก็จะแทนที่การตั้งค่าที่มีอยู่แล้วนี้โดยมีการเริ่มต้น
หากคุณใช้tmuxและiTerm2บนMacOS ,
ต่อไปนี้การเปลี่ยนแปลงเคอร์เซอร์จากบล็อกที่จะเคอร์เซอร์และไฮไลต์บรรทัดปัจจุบัน
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
. ดังนั้น config ของฉันจึงดูเหมือนset -sa terminal-overrides ",xterm-256color-italic:Tc"
(เพื่อตั้งค่าการเปิดใช้งานสี 24 บิตโดยไม่ต้องเหยียบย่ำรูปแบบเคอร์เซอร์ Ss / Se
หากต้องการเปลี่ยนรูปร่างของเคอร์เซอร์ในโหมดต่างๆคุณสามารถเพิ่มสิ่งต่อไปนี้ลงใน.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 คุณอาจต้องปรับให้เข้ากับโปรไฟล์ของคุณ
สำหรับ Konsole ใน KDE4:
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"
ใช้ได้กับหลายแท็บและหน้าต่าง
ดูเพิ่มเติม:“ รูปร่างเปลี่ยนเคอร์เซอร์ในโหมดที่แตกต่าง ” ในกลุ่มเคล็ดลับวิกิพีเดีย
set ttimeoutlen=0
คุณสามารถลองใช้ปลั๊กอิน Terminus Vim :
ในโหมดแทรกรูปร่างเคอร์เซอร์จะเปลี่ยนเป็นแถบแนวตั้งแบบบาง ในโหมดแทนที่มันจะเปลี่ยนเป็นขีดเส้นใต้ เมื่อกลับสู่โหมดปกติระบบจะเปลี่ยนกลับเป็นรูปทรง "บล็อก" มาตรฐาน
ฉันพบว่ามีประโยชน์เพียงให้เคอร์เซอร์กะพริบในโหมดแทรกและคงที่ในโหมดอื่น ๆ
set guicursor+=n-v-c:blinkon0
ไม่แน่ใจว่ามีใครกำลังเผชิญกับความล่าช้าหลังจากกดปุ่มEscเพื่อกลับสู่โหมดปกติเพื่อแสดงเคอร์เซอร์บล็อก แต่ถ้าเป็นเช่นนั้นนี่เป็นวิธีที่ฉันแก้ไขด้วย
จริงๆแล้วฉันใช้ iTerm2 และใช้ Vim ภายในเทอร์มินัลบน macOS และเมื่อเข้าสู่โหมดแทรกเคอร์เซอร์ยังคงเป็นบล็อกและสร้างความสับสนเมื่อคุณอยู่ในโหมดแทรกหรือโหมดปกติ
ฉันต้องการแสดงเส้นบาง ๆ เป็นเคอร์เซอร์เมื่ออยู่ในโหมดแทรกและกลับไปที่บล็อกเมื่ออยู่ในโหมดปกติเหมือนที่ 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
เมื่อคุณอยู่ในโหมดแทรกและกลับไปที่บล็อกเมื่อคุณออกจากโหมดแทรกหรือกลุ่ม รู้สึกอิสระที่จะเปลี่ยน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 ปัจจุบันในสเตตัสไลน์เหนือสิ่งอื่นใด ถ้าคุณแสวงหาความเรียบง่ายคุณสามารถตั้งค่าเฉพาะข้อมูลนี้ลง statusline
อย่างไรก็ตามโดยปกติแล้วสิ่งที่บ้าคลั่งจริงๆจะเกิดขึ้นเมื่อคุณกดแคปล็อคและอยู่ในโหมดคำสั่ง (เนื่องจากตอนนี้ hjkl เป็น HJKL - แค่ J และ K ก็เพียงพอแล้วที่จะทำให้คุณดึงผมออกเมื่อคุณไม่เข้าใจว่าเกิดอะไรขึ้น:h J
และ:h K
เพื่อดูว่าฉันหมายถึงอะไร) เพียงแค่ระวังปุ่ม caps lockและคุณจะสามารถใช้ได้เกือบตลอดเวลา IMO