मैं विम में नॉर्मल और इंसर्ट मोड के बीच कर्सर कैसे बदलूं?


106

मैं जानना चाहता हूं कि कैसे बदलना है, यदि संभव हो तो, विम में कर्सर (रंग, आकार, आदि) आप किस मोड में हैं इसके आधार पर।

मैं लगातार यह भूल रहा हूं कि मैं इन्सर्ट मोड में नहीं हूं और कोड लिखना शुरू कर रहा हूं, जिसके परिणामस्वरूप सभी प्रकार की पागल चीजें हो रही हैं। यदि कर्सर पर किसी प्रकार का दृश्य संकेत होता है तो यह मददगार होगा।


19
मैं आपको एक नियम सीखने का सुझाव देता हूं: टाइप करना बंद करें => निकास डालें मोड। तब आप कभी भी ऐसी स्थिति का निरीक्षण नहीं करेंगे जहाँ आप भूल गए हैं कि आप इन्सर्ट मोड में नहीं हैं।
ZyX

2
@ZyX सिवाय जब आप बंद कर दिया टाइपिंग के बाद डालने मोड से बाहर निकलने के लिए भूल जाते हैं: पी
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
मैंने डिफ़ॉल्ट अंडरलाइन के बजाय higlight bg पर भी कार्य निर्धारित किया: hi CursorLine cterm = NON ctermbg = black
Nikita Prokopov

वहाँ एक कारण है कि यह साइबर के विम में काम नहीं करेगा? मैं संपादक में हूं और दोनों पंक्तियों के सेट में प्रवेश कर गया हूं, और मैं किसी भी प्रकार का हाइलाइटिंग सेट करने में सक्षम नहीं हुआ हूं, पूर्ण स्तंभ या पंक्ति से अधिक
हाइलाइटिंग

@ टिप्पणी: cursorlineविकल्प किसी भी प्लेटफ़ॉर्म-विशिष्ट क्षमता पर निर्भर नहीं करता है; यह +syntaxसुविधा के साथ संकलित किसी भी उदाहरण पर उपलब्ध है (जो आमतौर पर मामला है)।
ib।

बेशक, अपने ~ / .vimrc को zo जैसे स्थायित्व के लिए सहेजें:echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
कीमिया

75

लिनक्स पर xterm, urxvt और अन्य टर्मिनल एमुलेटर में निम्नलिखित कार्य करता है; MacOS पर iTerm2; विंडोज पर ConEmu के साथ गिट बैश; और अधिक (टिप्पणियां देखें):

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 ( धन्यवाद @ @ Luven Lu ):

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

2
अब क्षार में महान काम करता है
स्टीवन लू


@Charles के बारे में क्यों यह पोटीन में काम नहीं करता है, यह देखें: superuser.com/questions/304318/…
WesternGun

1
मेरा अद्यतन: अंत set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'में मेरे tmux विन्यास के साथ काम करना । जाहिरा तौर पर यदि आप बिना उपयोग setकरते हैं , तो यह सेटिंग को ओवरराइड करेगा, जो पहले से ही डिफ़ॉल्ट रूप से वहां मौजूद है। terminal-overrides-a
स्टीवन लू

1
सॉल्यूशन में आकार बदलने के लिए एक महत्वपूर्ण विलम्ब होता है सरल टर्मिनल (सकलेस सेंट) पर इन्सर्ट मोड से सामान्य मोड तक
daGo

16

आप उपयोग कर रहे हैं 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

साभार: https://gist.github.com/andyfowler/1195581


1
ध्यान दें कि यह iTerm के लिए विशिष्ट है । चूंकि मानक वास्तव में काम करते हैं, लेकिन अन्य सभी सहायक टर्मिनलों में भी काम करते हैं, यह शायद गलत उत्तर है। यहां देखें -> stackoverflow.com/a/42118416/340947
स्टीवन लू

@StevenLu वास्तव में आपके सुझाए गए उत्तर में से एक iTerm2 (Mac) के लिए काम नहीं करता था, जबकि यह एक काम करता था। यह सामान आपकी अपेक्षा से अधिक काल्पनिक है।
सीएस

इस कर्सर सामान निश्चित रूप से वहाँ से बाहर की चीजों में से एक है। मुझे बस एहसास हुआ कि मेरे पास भी उचित सेटअप नहीं है, क्योंकि tmux कर्सर स्थिति पर नज़र रखने के लिए प्रकट नहीं होता है, जो कुछ उत्तरों से संकेत मिलता है कि यह एक संभावना है। मैं काफी खुश था बस डालने के मोड पर एक लाइन के लिए कर्सर सेट करने के लिए vim पाने के लिए बहुत खुश था।
स्टीवन लू

मैंने इस सामान का पता लगा लिया। समाधान tmux को ठीक से संभालना है, और यह गैर-स्पष्ट हो सकता है। मुझे यह सुनिश्चित करने की आवश्यकता थी कि मेरे tmux config का terminal-overridesकेवल संलग्न किया जा रहा है, इसलिए इसने उस ,*:Ss=\E[%p1%d q:Se=\E[2 qहिस्से को बंद नहीं किया terminal-overrides। इसलिए मेरा विन्यास ऐसा लगता है set -sa terminal-overrides ",xterm-256color-italic:Tc"(24-बिट रंग सेट करने के लिए ट्रामप्लिंग कर्सर शैलियों एस एस / से को सक्षम करने के लिए सेट करें।
स्टीवन लू

13

विभिन्न मोड में कर्सर के आकार को बदलने के लिए, आप निम्नलिखित को अपने में जोड़ सकते हैं .vimrc फ़ाइल ।

गनोम टर्मिनल के लिए (संस्करण २.२६):

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 में कोंसोल के लिए:

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

यह कई टैब और विंडो के साथ काम करता है।

यह भी देखें: " विभिन्न मोड में कर्सर आकार बदलें " विक टिप्स विकी पर


13
मैं मुख्य रूप से पोटीन के साथ ssh पर tmux में विम का उपयोग करता हूं। क्या अधिक सार्वभौमिक विकल्प है?
lanrat

एक जादू की तरह काम किया। धन्यवाद।
अर्नेस्ट

1
एक gconftool-2 कमांड के माध्यम से सूक्ति-टर्मिनल की सेटिंग बदलना बहुत बुरा विचार है। यह न केवल उस टर्मिनल को प्रभावित करता है जहां आपकी विम चल रही है, बल्कि एक ही प्रोफाइल के अन्य सभी वर्तमान और भविष्य के गनोम-टर्मिनल टैब भी हैं।

यह konsole के लिए काम करता है, धन्यवाद। लेकिन एक मुद्दा यह है कि एक्सट्रेक्ट इन्सर्ट मोड स्लो है, निश्चित नहीं कि क्यों
होआंग ट्रान

1
@HoangTran उपयोगset ttimeoutlen=0
Bananach

10

आप टर्मिनस विम प्लगइन की कोशिश कर सकते हैं :

सम्मिलित मोड में, कर्सर का आकार एक पतली ऊर्ध्वाधर पट्टी में बदलता है। प्रतिस्थापित मोड में, यह एक रेखांकन में बदल जाता है। सामान्य मोड पर लौटने पर, यह मानक "ब्लॉक" आकार में बदल जाता है।


यह सबसे समझदार समाधान की तरह लगता है। वीआईएम में सीधे इसके लिए एक सेट होना चाहिए: मानक।
user12711

आवश्यकताएँ: gnome- टर्मिनल ( 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 पर अपने टर्मिनल के अंदर विम का उपयोग कर रहा हूं। और इन्सर्ट मोड में प्रवेश करते समय, कर्सर तब भी ब्लॉक होता है और जब आप इन्सर्ट मोड या नॉर्मल मोड पर होते हैं तो यह एक तरह का कन्फ्यूज़िंग होता है।

मैं एक पतली लाइन को कर्सर के रूप में दिखाना चाहता था जब इन्सर्ट मोड में और सामान्य मोड में जब मैकविम करता है तब ब्लॉक करने के लिए वापस। और ऐसा करने के लिए यह बहुत आसान है, बस इसे यहाँ वर्णित के.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- टर्मिनल पर ठीक से काम करता है:

अपने लिए निम्नलिखित स्क्रिप्ट जोड़ें .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- टर्मिनल .config/xfce4/terminal/terminalrcफ़ाइल में प्राथमिकताएं रखता है । जब आप इंसर्ट मोड में होते हैं, और जब आप इंसर्ट मोड या विम छोड़ते हैं, तो ब्लॉक करने के TERMINAL_CURSOR_SHAPE_BLOCKलिए स्क्रिप्ट बदल जाती है TERMINAL_CURSOR_SHAPE_IBEAMIBEAMजो कुछ भी आप चाहते हैं 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

मैं इन दो स्रोतों से खींची गई निम्न सेटिंग्स के साथ यह काम करने में कामयाब रहा।

टुइ-कर्सर आकार

guicursor


-2

मैं आमतौर पर अन्य चीजों के अलावा, स्टेटसलाइन पर वर्तमान विम मोड रखता हूं। यदि आप सादगी चाहते हैं, तो आप केवल इस जानकारी को स्टेटसलाइन पर सेट कर सकते हैं ।

हालाँकि, आमतौर पर वास्तव में पागल चीजें तब होती हैं जब आपके पास कैप्स लॉक उदास होते हैं और कमांड मोड में होते हैं (क्योंकि hjkl अब HJKL हैं - बस J और K आपके बालों को खींचने के लिए पर्याप्त हैं जब आप समझ नहीं पाते कि क्या हो रहा है। :h Jऔर :h Kयह देखने के लिए कि मेरा क्या मतलब है)। बस कैप्स लॉक कुंजी से सावधान रहें और आप ज्यादातर समय आईएमओ के लिए ठीक रहेंगे।


46
यह प्रश्न का उत्तर कैसे देता है?
डेविड रिवर

1
@DavidRivers यह XY समस्या का एक आवेदन है जहाँ ओपी अपनी समस्या के समाधान के लिए पूछ रहा था (विम सामान्य मोड में होने के बारे में नहीं जानता और इसे इंगित करने के लिए कर्सर को बदलना चाहता था), लेकिन एक विकल्प से संतुष्ट हो गया (और IMO नहीं) एक महान) समाधान (राज्य के साथ अपने statusline) को बढ़ाने
स्टीवन लू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.