2011-11-29 14 views
12

मैं सफेद रिक्त स्थान अनुगामी दूर करने के लिए मेरी .vimrc में निम्नलिखित समारोह जोड़ा था के लिए सफेद स्थान अनुगामी सिर्फ बचतकेवल संपादित लाइनों

fun! <SID>StripTrailingWhitespaces()            
    let l = line(".")               
    let c = col(".")                
    %s/\s\+$//e                 
    call cursor(l, c)               
endfun                   

autocmd BufWritePre *.h :call <SID>StripTrailingWhitespaces() 
autocmd BufWritePre *.cpp :call <SID>StripTrailingWhitespaces() 
autocmd BufWritePre *.c :call <SID>StripTrailingWhitespaces() 

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

diff -b अभी कोई समाधान नहीं है क्योंकि यह लाइन में कहीं से भी सफेद रिक्त स्थान को अनदेखा करता है और कभी-कभी यह परिवर्तन diff आउटपुट में शामिल होने के लिए पर्याप्त महत्वपूर्ण है।

तो मेरा सवाल यह है - क्या इस सत्र में केवल इस पंक्ति में संपादित की गई सफेद रेखाओं को पीछे हटाना संभव है? की StripTrailingWhitespaces() समारोह

s/\s\+$//e 

यह करने के लिए बदल गया है,

autocmd InsertLeave *.[ch] :call <SID>StripTrailingWhitespaces() 

और स्थानापन्न आदेश बदलने के लिए:

+1

मैं एक हाइलाइटिंग नियम यह है कि प्रकाश डाला गया है (एक बहुत कष्टप्रद रास्ते में) खाली स्थान के अनुगामी है, तो यह बहुत आसान है मुझे देखने के लिए के लिए क्या अंतरिक्ष हटा दिया जाना चाहिए; लेकिन +1 क्योंकि इसमें से अधिकांश को स्वचालित करना अच्छा लगेगा। – SingleNegationElimination

+1

क्यों नहीं, एक बंद कार्य के रूप में, अपनी सभी विरासत फ़ाइलों से सभी पिछली सफेद जगहों को पट्टी क्यों करें? –

+1

@ मैथ्यूस्ट्रॉब्रिज उस अस्पष्टता को करते हुए, जब आप गिट एनोटेट की तरह कुछ चलाते हैं तो लाइनें (या आखिरी बार बदलती हैं)। (यह अभी भी पाया जा सकता है, लेकिन इसमें अतिरिक्त कदम उठाए जाते हैं।) –

उत्तर

2

mMontu's answer सही विचार है, लेकिन यह किनारे के मामले को संभाल नहीं करता है। अर्थात्, यदि मैं कर्सर को नीचे ले जाता हूं, तो बैक अप लें, सभी संपादन मोड में, यह उन पंक्तियों में परिवर्तन नहीं उठाता है। अगर हम इसे संभालना चाहते हैं, तो हमें उपयोगकर्ता द्वारा देखी गई शीर्ष और निचली लाइनों को स्टोर करने की आवश्यकता है।

fun! <SID>SetupTrailingWhitespaces() 
    let curline = line('.') 
    let b:insert_top = curline 
    let b:insert_bottom = curline 
endfun 

fun! <SID>UpdateTrailingWhitespace() 
    let curline = line('.') 
    if b:insert_top > curline 
     let b:insert_top = curline 
    elseif b:insert_bottom < curline 
     let b:insert_bottom = curline 
    endif 
endfun 

fun! <SID>StripTrailingWhitespaces() 
    let original_cursor = getpos('.') 
    exe b:insert_top ',' b:insert_bottom 's/\s\+$//e' 
    call setpos('.', original_cursor) 
endfun 

अब हम सिर्फ सही समय पर इन कार्यों आह्वान:

autocmd InsertEnter * :call <SID>SetupTrailingWhitespaces() 
autocmd InsertLeave * :call <SID>StripTrailingWhitespaces() 
autocmd CursorMovedI * :call <SID>UpdateTrailingWhitespace() 

वैकल्पिक रूप से, मैं a plugin है कि इस अद्यतन सुविधा प्रदान करता है लिखा है के साथ सब कुछ कार्यों में बांटा यहां कुछ और अधिक मजबूत कोड है , सामान्य मोड में अलग-अलग जैसी अतिरिक्त सुविधाओं के साथ-साथ।

4

एक संभावना यह autocmd InsertLeave का उपयोग हर बार वर्तमान लाइन से सफेद रिक्त स्थान पट्टी आप डालने मोड छोड़ना होगा काम करेगा यदि आपके द्वारा शामिल सभी लाइनें सफेद रिक्त स्थान में समाप्त नहीं होती हैं, केवल अंतिम ही। यदि आप प्रविष्टि मोड (i के बाद ESC) के बाद प्रवेश करते हैं और बाहर निकलेंगे तो यह संभवतः संशोधित लाइनों को बदल देगा।

autocmd InsertEnter *.[ch] :let b:insert_start = line('.') 
autocmd InsertLeave *.[ch] :call <SID>StripTrailingWhitespaces() 

fun! StripTrailingWhitespaces() 
    let original_cursor = getpos('.') 
    exe b:insert_start . ',.s/\s\+$//e' 
    call setpos('.', original_cursor) 
endfun  

तर्ज पर प्रतिस्थापन की वजह से प्रवेश और बाहर निकलने डालने के लिए हैं:

यह समाधान काम करने के लिए यदि आप लाइनों कि (उदाहरण के लिए विरासत कोड से चिपकाया लाइनों,) सफेद स्थान में अंत करता है शामिल बदला जा सकता है मोड (iESC के बाद) एक समस्या है तो समाधान b:changedtick-variable को सम्मिलित मोड दर्ज करते समय सहेज सकता है और परिवर्तनों का पता लगाने के लिए डालने मोड को छोड़कर इसे जांच सकता है।

0

मैं कई रिक्त रेखाएं और पिछली जगहों को साफ़ करने के लिए 'vim-scavenger' नामक एक प्लगइन लिखता हूं।

बस अपनी निम्न कॉन्फ़िगरेशन जोड़ें।vimrc:

let g:scavenger_auto_clean_up_on_write = 1 

अधिक विस्तार के लिए, आपको लगता है कि Github repo को अधिक जानने के लिए आ सकते हैं। प्लगइन में सुधार करने के लिए मुझे सलाह देने के लिए स्वतंत्र महसूस करें।

+0

यह प्लगइन पहले से ही 'vim-janitor' नाम दिया गया है। कृपया [यहां] जाएं (https://github.com/KuoE0/vim-janitor)। – KuoE0

संबंधित मुद्दे