2012-02-02 6 views
17

में एचजेकेएल आंदोलन कुंजियों के बार-बार उपयोग को रोकने से रोकें क्योंकि मैं अक्सर उत्कृष्ट गति और टेक्स्ट ऑब्जेक्ट्स का उपयोग नहीं करता जो कि वीम प्रदान करता है, (और "Holding down 'j' is a vim anti-pattern," से) मैं चाहता हूं कि इसका उपयोग करने के बजाय इनका उपयोग करने के लिए मुझे प्रशिक्षण में सहायता करें एक पंक्ति में कुछ बार से अधिक hjklविम

जब मैंने विम का उपयोग करना शुरू किया, तो मुझे नाराज था कि मैंने hjkl का उपयोग नहीं किया था बल्कि इसके बजाय तीर कुंजियों का उपयोग किया था। एक अनुस्मारक के रूप में ऐसा करने के लिए, मैंने तीर कुंजियों को अपने आप को उपयोग करने से रोकने के लिए रीमेप किया - मुझे पता था कि नेविगेट करने के लिए होम पंक्ति का उपयोग करना एक बेहतर दीर्घकालिक योजना होगी, इसलिए मैंने सकारात्मक तीरंदाजी काट दिया जो मुझे काम करने वाले तीर से प्राप्त होगा चांबियाँ।

map <left> <nop> 
map <right> <nop> 
# I quickly removed nop's for up and down because using 
# the mouse wheel to scroll is sometimes useful 

मैं अब क्योंकि यह बहुत अच्छी तरह से काम किया मेरी .vimrc में इन मैपिंग की जरूरत है, और मैं जल्दी, बंद ऐसा करने के लिए एक सचेत प्रयास करने की ज़रूरत नहीं। इसी तरह, मैं अब मूल आंदोलन कुंजी hjkl के बार-बार उपयोग को काटना चाहता हूं। मैं कुछ इस तरह envisioning गया था:

let g:last_mov_key = 'none' 
let g:times_mov_key_repeated = 0 
function! MovementKey(key) 
    if (g:last_mov_key == a:key) 
     let g:times_mov_key_repeated = g:times_mov_key_repeated + 1 
    else 
     let g:last_mov_key = a:key 
     let g:times_mov_key_repeated = 0 
    endif 
    if g:times_mov_key_repeated > 3 
     echo "Negative Reinforcement!"        
    endif 
endfunction 

noremap j :call MovementKey('j')<CR>gj 
noremap k :call MovementKey('k')<CR>gk 
noremap h :call MovementKey('h')<CR>h 
noremap l :call MovementKey('l')<CR>l 

लेकिन इस दृश्य मोड में टूट जाता है, और मैं जहां कुछ के बीच में vim कमांड लाइन का उपयोग कर अन्य मामलों की टन में सोच भी बदल जाता है जब राज्य ऐसा नहीं होना चाहिए। मैं खुद को अधिक जटिल गति का उपयोग करने के लिए कैसे बाध्य कर सकता हूं?

संपादित करें: स्पष्टता के लिए पहले दो उत्तरों के बाद प्रश्न संपादित किया गया, पैराग्राफ पुन: व्यवस्थित। मैं रोमैन के "स्तर 0" से आगे बढ़ने से विम से कुछ सहायता चाहता हूं। अब तक जवाब मुझे सलाह देते हैं कि मेरा समय बर्बाद न करें, लेकिन क्या होगा यदि हम मानते हैं कि मैं सीखने की तकनीक का प्रशंसक हूं जहां मैं अपने पर्यावरण को प्रोत्साहनों को बदलने के लिए अपनी आदतों को बदलकर बदलता हूं? इस मॉडल में मैं एक कार्य को पूरा करना चाहता हूं, कहें, एक पृष्ठ को स्क्रॉल करना, और जब तक मैं उस कार्य को प्राप्त नहीं करता तब तक मैं यादृच्छिक रूप से महत्वपूर्ण संयोजनों का प्रयास करूंगा। मेरे मस्तिष्क में डोपामाइन सिग्नलिंग इत्यादि उस क्रिया को मजबूत करेगी जो अंततः इस परिणाम को प्राप्त करेगी। मैं hjkl का उपयोग न करने की याद रखने पर ध्यान केंद्रित कर सकता हूं, या मैं जिस काम को मूल रूप से करने की कोशिश कर रहा था उस पर ध्यान केंद्रित कर सकता था, पाठ संपादित कर सकता था, और वास्तव में इसके बारे में सोचने के बिना खुद को अधिक कुशल संपादन तकनीकों का उपयोग करके ढूंढ सकता था।

+0

रिकॉर्ड सेटिंग के लिए 'माउस = ए' आपको पर ऊपर/नीचे मैप करने देता है और अभी भी एक काम करने वाली स्क्रोलव्हील है (यदि आपको वह चीज़ चाहिए तो माउस चयन भी सक्षम करता है)। – Holloway

उत्तर

2

मैं ऐसे समाधान का प्रस्ताव देना चाहता हूं जो ओपी के सोचने के तरीके के अनुरूप है।

मैंने यह भी तय किया कि यदि कुछ गिनती से पहले नहीं है तो कुछ गतियों को अवरुद्ध करना एक अच्छा विचार था, जैसा कि here पर चर्चा की गई थी। मैंने भी एक सीधी रीमेपिंग की कोशिश की, लेकिन ओपी द्वारा वर्णित अनुसार, यह कई संदर्भों में काम नहीं करता था।

लेकिन मैं अंत में एक दृष्टिकोण है कि key maps that returned an expression का उपयोग कर काम किया साथ आया था:

function! DisableIfNonCounted(move) range 
    if v:count 
     return a:move 
    else 
     " You can make this do something annoying like: 
     " echoerr "Count required!" 
     " sleep 2 
     return "" 
    endif 
endfunction 

function! SetDisablingOfBasicMotionsIfNonCounted(on) 
    let keys_to_disable = get(g:, "keys_to_disable_if_not_preceded_by_count", ["j", "k", "l", "h", "gj", "gk"]) 
    if a:on 
     for key in keys_to_disable 
      execute "noremap <expr> <silent> " . key . " DisableIfNonCounted('" . key . "')" 
     endfor 
     let g:keys_to_disable_if_not_preceded_by_count = keys_to_disable 
     let g:is_non_counted_basic_motions_disabled = 1 
    else 
     for key in keys_to_disable 
      try 
       execute "unmap " . key 
      catch /E31:/ 
      endtry 
     endfor 
     let g:is_non_counted_basic_motions_disabled = 0 
    endif 
endfunction 

function! ToggleDisablingOfBasicMotionsIfNonCounted() 
    let is_disabled = get(g:, "is_non_counted_basic_motions_disabled", 0) 
    if is_disabled 
     call SetDisablingOfBasicMotionsIfNonCounted(0) 
    else 
     call SetDisablingOfBasicMotionsIfNonCounted(1) 
    endif 
endfunction 

command! ToggleDisablingOfNonCountedBasicMotions :call ToggleDisablingOfBasicMotionsIfNonCounted() 
command! DisableNonCountedBasicMotions :call SetDisablingOfBasicMotionsIfNonCounted(1) 
command! EnableNonCountedBasicMotions :call SetDisablingOfBasicMotionsIfNonCounted(0) 

DisableNonCountedBasicMotions 

ध्यान दें कि कोड यहाँ सुविधा के लिए शामिल किया गया है, लेकिन मैं यह देखने के लिए के रूप में अच्छी gist साथ की जाँच करेगा वहाँ अद्यतन/फिक्सेस रहे हैं।

आप क्षैतिज गति के लिए बाधा आराम कर सकते हैं, या जोड़ें/कुंजी की सूची निर्धारित करके अन्य प्रस्तावों को दूर/आदेशों कि प्रभावित होते हैं, g:keys_to_disable_if_not_preceded_by_count, अपने ~/.vimrc में। उदाहरण के लिए, निम्न केवल गिनती-उपसर्ग के गतियों "j" और "कश्मीर" के लिए लागू करता है:

let g:keys_to_disable_if_not_preceded_by_count = ["j", "k"] 

इसके अलावा, जैसा gist में बताया गया है, तो आप इसे वास्तव में उपयोगी अपने ~/.vimrc में कुछ इस तरह जोड़ने के लिए मिल सकती है साथ ही उपरोक्त कोड के रूप में:

set number 
if has('autocmd') 
augroup vimrc_linenumbering 
    autocmd! 
    autocmd WinLeave * 
       \ if &number | 
       \ set norelativenumber | 
       \ endif 
    autocmd BufWinEnter * 
       \ if &number | 
       \ set relativenumber | 
       \ endif 
    autocmd VimEnter * 
       \ if &number | 
       \ set relativenumber | 
       \ endif 
augroup END 

या एक प्लगइन लाइन vim-numbers स्थापित करें।

भले ही इस प्रश्न (ओपी) को वैकल्पिक दृष्टिकोण के साथ ओपी की संतुष्टि का उत्तर दिया गया हो, फिर भी अगर कोई कुछ अलग खोज रहा है तो मैं अपना समाधान जोड़ रहा हूं।

+0

यह बहुत ही भयानक है, मैंने अभी इसे जोड़ा है! यदि आप यहां कोड शामिल करेंगे तो यह बहुत अच्छा होगा, लेकिन मैं जिस्ट के साथ संतुष्ट हूं। धन्यवाद! – Thomas

+1

मैंने कोड जोड़ा, लेकिन लिंक को गस्ट में रखा क्योंकि मैं ग्रिस्ट को एन्हांसमेंट/फिक्स के साथ अपडेट कर रहा हूं। – Jeet

9

आप अन्य लोगों को बहुत ज्यादा सुनते हैं। आंदोलन के लिए बस जो भी चाबियाँ आप सबसे अच्छी पसंद करते हैं, और अकेले अन्य चाबियाँ छोड़ दें। hjkl कुंजी को रीमेप करना कुछ हद तक परेशान है, और सर्वोत्तम नहीं किया गया है, क्योंकि ऐतिहासिक कारणों से वे hardcoded विम में हैं।

+0

मैं स्वयं निष्कर्ष पर आया, और अगर कोई दिलचस्पी लेता है तो मुझे एक लिंक प्रदान किया जाए तो मुझे ऐसा क्यों लगता है। कुछ गहरे अवचेतन वृत्ति के कारण दस्तावेज़ के एक अलग हिस्से में होने का इंतजार करते समय मैं अक्सर जे कुंजी को पकड़ता हूं, और मैं इस आदत को खत्म करना चाहता हूं। लेकिन यह सुनकर मददगार है कि एचपीकेएल कुंजी को रीमेप करना विशेष रूप से कठिन है, मुझे बस इसके बारे में सोचने के लिए कठिन तरीका, अभ्यास और परेशान करना सीखना पड़ सकता है। – Thomas

+0

@ थॉमस - ठीक है, अगर आप प्रतीक्षा करने की तरह महसूस नहीं करते हैं, तो आपको पूरी स्क्रीन नीचे ले जाने के लिए, एचजेकेएल कुंजी के साथ कुछ संशोधक कुंजी को रीमेप करें। या कुछ समान है। विम वास्तव में चलने के लिए बहुत सारे विकल्प हैं। – Rook

+0

मेरा (स्वीकार्य रूप से छोटा) मुद्दा यह है कि क्योंकि मैं सिर्फ जम्मू रखने और इंतजार कर सकता था, मैं अन्य चीजों को आजमाने के लिए पर्याप्त रूप से प्रेरित नहीं होगा। मुझे लगता है कि मैं कुछ (अनुत्पादक) दिनों के लिए बस hjkl अक्षम कर सकता हूं। – Thomas

6

संपादित

यहाँ संपादित करें और अपनी टिप्पणी को पढ़ने के बाद है कट्टरपंथी समाधान मेरा प्रस्ताव है: पुन: मैप hjkl सुपर कष्टप्रद काम करने के लिए:

nnoremap h $ 
nnoremap l 0 
nnoremap j gg 
nnoremap k G 
" and so on for other modes 

hjkl के चरम विपरीत करने के लिए मैप की जाती हैं उनके मूल व्यवहार, अनिवार्य रूप से उन्हें पूरी तरह से अनुपयोगी बनाते हैं। आपको उनके समानार्थी (:h h, :h j, :h k, :h l) पूर्णता के लिए भी ऐसा ही करना चाहिए, लेकिन ऐसे मामले हैं जब चरित्र-दर-चरित्र/रेखा-दर-रेखा आंदोलन उपयोगी होता है। ऐसे मामलों में आपको + या - या <Space> होने में खुशी होगी।

मुझे वास्तव में उस तरह की पावलोवियन विधि पसंद नहीं है। मुझे यह बहुत क्रूर लगता है और जो जोखिम आप वास्तव में इन अजीब मैपिंग्स में उपयोग करते हैं, वह काफी अधिक लगता है।

अंत संपादित

लघु संस्करण:

न तो तीर कुंजी है और न ही hjkl का उपयोग कर के लायक हैं तो अपने remappings अंततः बेकार हैं। थोड़ी देर के बाद आप विम के गति और टेक्स्ट-ऑब्जेक्ट्स में उपयोग करेंगे। इस दौरान आप के लिए और अधिक प्राकृतिक लगता है का प्रयोग करें। इसे मत करो। यह आ जाएगा। सहज रूप में।

लांग संस्करण:

आप एक स्पर्श टाइपिस्ट हैं? या आप टच टाइपिंग सीखने की योजना बना रहे हैं?

मैं टच टाइपिस्ट नहीं हूं और मैं कभी भी एक बनने की योजना नहीं बना रहा हूं: मैं hjkl का उपयोग केवल INSERT मोड में hjkl इनपुट करने के लिए करता हूं।

जब मुझे किसी विशेष "लक्ष्य" के बिना ऊपर या नीचे 1 या 2 पंक्तियों को स्थानांतरित करने की आवश्यकता होती है तो मैं तीर कुंजियों का उपयोग करता हूं, जब मुझे बाईं ओर या दाईं ओर दो अक्षर ले जाने की आवश्यकता होती है तो मैं तीर कुंजियों का उपयोग करता हूं। ऐसा करने में कोई शर्म नहीं है।

कोई समस्या है, तथापि, जब आप jjjjjjjjjj लिखें या 10 लाइनों नीचे ले जाने के लिए कुंजी नीचे तीर मारा 10 गुना: jjjjjjjjjjj स्पष्ट रूप से बस के रूप में बुरा रूप ↓↓ है

"तीर कुंजियों का उपयोग न करें" का यह बेवकूफ मंत्र केवल जंगल को छुपाता है: यह बार-बार दोहराया जाता है कि यह आपको अधिक शक्तिशाली तरीकों को सीखने के बजाय बेकार पैटर्न/एंटीपार्टर्न पर ध्यान केंद्रित करता है।

मैं सुंदर Your problem with Vim is that you don't grok vi. व्याख्या नहीं करना चाहते हैं, लेकिन आप के रूप में "ज्ञान का स्तर" यह देख सकते हैं:

  • स्तर 0

    jjjjjjjjjjj या ↓ होगा तो सभी आवश्यक क्षैतिज आंदोलनों अपने लक्ष्य तक पहुँचने के लिए।

    ऊपर लाइन पढ़ना, ना बल्कि स्पष्ट है कि hjkl बनाम बहस बिल्कुल बेवकूफ है?

    चाहे आप एक विधि का उपयोग करते हैं या दूसरा जो आप अपने कुंजीपटल को लंबवत और क्षैतिज रूप से आगे बढ़ने के लिए जोड़ते हैं, उस मूल्य तक पहुंचने के लिए जिसे आप संपादित करना चाहते हैं। कितना बेकार है। और एक और तरीके से एक विधि का उपयोग करने के लिए खुद को मजबूर करने के लिए समय और ऊर्जा का अपशिष्ट क्या है क्योंकि दोनों समान रूप से खराब हैं।

  • स्तर 1

    10j22l 10 लाइनों नीचे जाने के लिए और सही करने के लिए अपने लक्ष्य 22 वर्णों तक पहुँचने के लिए किया जाएगा। हालांकि यह बहुत कम टाइपिंग है, अब आपको लाइनों और पात्रों की गिनती करना है जो विशेष रूप से बेहतर नहीं हैं।

  • स्तर 2

    10jwww 10 लाइनों नीचे जाने के लिए और सही करने के लिए अपने लक्ष्य 3 शब्द तक पहुँचने के लिए या 10jf# 10 लाइनों नीचे जाना और अपने लक्ष्य के पहले अक्षर के लिए कूद करने (एक हेक्स होगा रंग मूल्य)।

    हम्म, यह बहुत बेहतर है।

  • स्तर 3

    /#<CR> (, के रूप में पहले एक हेक्स रंग मान) अपने लक्ष्य पर प्रत्यक्ष रूप से करने के लिए किया जाएगा। यदि यह आपकी वर्तमान स्थिति से ऊपर है तो आप ?#<CR> करेंगे।

आप एक स्पर्श टाइपिस्ट हैं, या एक बन गया प्रशिक्षण रहे हैं, तो बहस बसे है: hjkl त्वरित और प्राकृतिक रहे हैं (या jkl; कुछ के रूप में उन्हें पुन: मैप चाहते) और आप पर तीर कुंजी की जरूरत नहीं है सभी और यदि आप नहीं कर रहे हैं, के उपयोग के लाभ hjklसे अधिक ← पर सबसे अच्छा बहुत कम हैं।

eEbBwWfFtT/?} और इसके बजाय कंपनी पर फ़ोकस करें। एक बार में केवल एक बिट। खुद को "मजबूर" न करें।

+0

इस प्रश्न के साथ मेरा लक्ष्य स्तर 0 से आगे बढ़ना है - मैं पूरी तरह से सहमत हूं कि तीर कुंजियों पर hjkl वास्तव में बिंदु नहीं है - मैं एक तकनीक का उपयोग न करने के लिए अनुस्मारक के एक सामान्य उदाहरण के रूप में तीर कुंजी को बंद करने का उल्लेख करता हूं, जिसे मैं साल पहले इस्तेमाल किया जब मैंने विम का उपयोग शुरू किया। अब मुझे एक समान अनुस्मारक पसंद है जो बार बार बार नहीं दबाएगा, लेकिन दुर्भाग्यवश तीर कुंजियों की तुलना में एचजेकेएल को पुनर्जीवित करना अधिक कठिन लगता है। – Thomas

+0

ठीक है, मुझे आपकी प्रक्रिया का विवरण पसंद है। हमारे दिमाग एक ही तरीके से काम नहीं कर रहे हैं;)। वैसे भी, मैंने एक प्रस्ताव के साथ अपना जवाब संपादित कर दिया है। वैसे, मैं "स्तर 0" को अपमानजनक नहीं करना चाहता था, मुझे उम्मीद है कि आपने इसे गलत नहीं लिया है। – romainl

+0

अच्छा, धन्यवाद। मैंने सोचा था कि मुझे अभी भी कुछ एचजेकेएल का उपयोग करने की आवश्यकता होगी, लेकिन यदि मैं सीधे नेविगेट करने के लिए खोज छोड़ देता हूं तो मुझे लगता है कि कम से कम संक्षिप्त प्रशिक्षण अवधि के लिए मैं नहीं जाऊंगा। चिंता न करें, मैंने नकारात्मक स्तर "स्तर 0" नहीं लिया - "ज्ञान के स्तर" बहुत उपयोगी हैं। – Thomas

2

एक चीज़ जो मैंने पाया है वह काम :noremap jj <nop> है। विम j गति में देरी करेगा क्योंकि ऐसा लगता है कि आप इसे विस्तारित कर सकते हैं, जो आपको कुछ और करने की कोशिश करने के लिए पर्याप्त धीमा कर देता है। आप j कुंजी को और भी नीचे नहीं रख सकते हैं क्योंकि यह इसके बजाय nop को ट्रिगर करता है। आप अभी भी आपात स्थिति में बटन का उपयोग कर सकते हैं, लेकिन यह दिन-प्रति-दिन संपादन में आपको इससे बचने के लिए पर्याप्त निराशाजनक है।