2010-03-06 15 views
9

निम्नलिखित कोड मेरे .vimrc अंदर है बहिष्कृत करने और आम तौर पर एक फ़ाइल मैं vim के साथ खोला के अंतिम कर्सर की स्थिति को पुनर्स्थापित करता है:विम कर्सर की स्थिति बहाल करता है; विशेष फ़ाइलों

autocmd BufReadPost * 
    \ if line("'\"") > 1 && line("'\"") <= line("$") | 
    \ exe "normal! g`\"" | 
    \ endif 

मैं वास्तव में इस सुविधा की तरह है और इसके लिए छोड़कर चालू हों, तो छोड़ना चाहते हैं एक फ़ाइल: गिट के साथ आने पर, विम निकाल दिया जाता है और मैं इसके साथ प्रतिबद्ध संदेश संपादित कर सकता हूं। हालांकि vim शुरू होने से पहले प्रतिबद्ध संदेश फ़ाइल मौजूद है (और prefilled है), इसलिए vim इसे एक मौजूदा फ़ाइल के रूप में देखता है और अंतिम कर्सर स्थिति को पुनर्स्थापित करता है (जो आमतौर पर नहीं है जहां मैं टाइप करना शुरू करना चाहता हूं)।

तो क्या COMMIT_EDITMSG फ़ाइल को बाहर करने के लिए उपरोक्त स्क्रिप्ट को संशोधित करने की संभावना है?

+2

: -) वास्तव में गिट काम करने के बाद मुझे 'ggI' टाइप करने में कम समय लगा। –

+1

'जीजीआई'? वह क्या है? – poke

+1

यह एक फ़ाइल की शुरुआत में जाने के लिए एक vim कमांड है और डालने मोड में स्विच करें :-) –

उत्तर

8

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

हालांकि

, पावेल Shved द्वारा टिप्पणी के आधार पर मैंने सोचा था कि एक ही तरह से यह बस अधिलेखित करने के लिए स्थिति के प्रभाव को बहाल करने के लिए, बस द्वारा संभव हो जाना चाहिए (gg फ़ाइल के शीर्ष पर ले जाने के बारे) इसे बाद में पर ले जाया गया। तो मैं इस के साथ आया था:

autocmd BufReadPost COMMIT_EDITMSG 
    \ exe "normal! gg" 

पिछले autocmd BufReadPost बस चेन घटना निष्पादन के बाद इस रखने, तो vim, पहले क्रियान्वित करने और स्थिति को बहाल करने के बाद, इस पढ़ता है और बाहर रखा गया फ़ाइल नाम पर यह मेल खाता है और कर्सर को शीर्ष पर ले जाने के लिए gg का उपयोग करता है, मूल रूप से मूल autocmd के प्रभाव को ओवरराइट करना।

और यह बस एक ठीक काम करता है :)

1

आपको शायद मिक्शन की जांच करनी चाहिए। जब आप कमांड लाइन पर निर्दिष्ट फाइलें निर्दिष्ट करते हैं (जैसे कि गिट वीम का आह्वान करता है) तो आप VimEnter/VimLeave ऑटो कमांड को "सही चीज़" करने के लिए सेट कर सकते हैं। इस तैरने के लिए कई स्क्रिप्ट हैं, उदाहरण के लिए http://vim.wikia.com/wiki/Working_with_multiple_sessions देखें।

3

मैं समझता हूँ कि आप पहले से ही एक समाधान के साथ आए हैं, लेकिन मैं एक ही सवाल था और एक वैकल्पिक चेनिंग की आवश्यकता नहीं है कि के साथ आया था।

function! PositionCursorFromViminfo() 
    if !(bufname("%") =~ '\(COMMIT_EDITMSG\)') && line("'\"") > 1 && line("'\"") <= line("$") 
    exe "normal! g`\"" 
    endif 
endfunction 
:au BufReadPost * call PositionCursorFromViminfo() 
+0

अच्छा परिष्करण - यह डबल-कूद से साफ दिखता है! –

0

इस प्रयास करें, अंतिम स्थिति के लिए अपने कदम कर्सर

सेट छिपा

1

.vimrc में अपने लाइनों के बजाय निम्नलिखित लाइनों रखो:

au BufWinLeave * mkview 
au BufWinEnter * silent loadview 
संबंधित मुद्दे