क्या आटोक्मड में AND घटनाओं का कोई रास्ता है?


21

मैं autocmd दो घटनाओं पर ट्रिगर करना चाहता हूं, लेकिन एक तरह से यह आमतौर पर नहीं होता है, अर्थात यदि दोनों में से कोई भी घटना हुई है तो ट्रिगर करें autocmd। अगर दोनों घटनाएं हुईं तो मैं इसे ट्रिगर करना चाहता हूं।

उदाहरण के लिए:
इसे करने का सामान्य तरीका

autocmd BufWrite,BufRead *.c *.py *.h :call StripTrailingWhitespaces()

यह कोड StripTrailingWhiteSpaces () को BufWrite या BufRead कहेगा

मैं कुछ ऐसा करना चाहूंगा:

autocmd Filetype c,cpp,python AND BufWrite :call StripTrailingWhiteSpaces()

दूसरे शब्दों में autcmdजब एक सी, सीपीपी, अजगर में से एक है और इस बफर पर लिखना होता है ट्रिगर ।

किसी भी मदद की सराहना की है।

जवाबों:


14

जब कोई ईवेंट आता है, तो एक स्वतः पूर्ण आदेश निष्पादित किया जाता है। आप चाहते हैं कि घटनाओं के अनुक्रम के बाद एक कमांड निष्पादित हो। ऐसा करने का एक तरीका इस प्रकार है:

autocmd FileType c,cpp,python
    \ autocmd BufWritePre <buffer> call StripTrailingWhiteSpaces()

<buffer>पैटर्न जब वर्तमान बफर लिखा है autocommand शुरू किया जा जा करने के लिए कारण बनता है। देख

:help autocmd-buflocal

अद्यतन करें

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

augroup TrailSpace
    autocmd FileType c,cpp,python
        \ autocmd! TrailSpace BufWritePost <buffer> call SkipTrailingWhiteSpaces()
augroup END

Lcd047 द्वारा पोस्ट किए गए उत्तर के समान एक और समाधान, जिसे अब हटा दिया गया है, यह पहचानने के लिए कि जब फ़ाइल टाइप घटना होती है, तो 'फ़िलाटाइप' विकल्प सेट होता है। फिर आप निम्न उदाहरण के रूप में, 'filetype' के मूल्य पर BufWritePost घटना के लिए प्रतिक्रिया कर सकते हैं। अन्य समाधानों के मुकाबले यह फायदा है कि केवल एक ऑटोकॉमैंड बनाया जाता है।

autocmd BufWritePre * if count(['c','cpp','python'],&filetype)
    \ | call SkipTrailingWhiteSpaces()
    \ | endif

अगर मैं वर्तमान में खुली हुई सभी फाइलों पर इसे चलाना चाहता हूँ, तो मैं निष्पादित करता हूँ: वा?
15

यदि फ़ाइलें सही FileTypeफ़िलाटाइप के साथ खोली गई थीं, तो उत्तर में आटोक्मड ने दूसरे ऑटोकैम्ड ( BufWritePre) को आग लगा दी होगी जब आप उन्हें बचाते हैं।
वानलेसर

1
FileTypeके लिए इच्छा आग ऊपर autocmd हर आप सही फ़ाइल प्रकार के साथ फ़ाइल खोलें, और होगा सेटअप एक बफर-स्थानीय के लिए घटना प्रत्येक उन फ़ाइलों की। इसलिए यदि आप दौड़ते हैं :wa, तो फ़ाइल को सहेजने से पहले, आप प्रत्येक बफर के लिए पंजीकृत ईवेंट चलाएंगे।
वैनलेसर

1
इसलिए यदि आप 5 पायथन फाइलें खोलते हैं, तो आपके पास autocmdएक के बजाय 5 s होगा, सभी लिखने पर। फिर अगर, कहते हैं, इन फ़ाइलों में से 3 छिपी हुई हैं, तो फिर से दिखाई FileTypeजाती हैं , फिर से ट्रिगर हो जाती हैं ताकि आपको 3 और autocmdएस मिलें, लिखने के लिए भी। यह शानदार है, मुझे आश्चर्य है कि मैं इस समाधान के साथ क्यों नहीं आया। :)
lcd047

1
प्रदर्शन कोई समस्या नहीं है। stripTrailingWhiteSpaces()एक ही फ़ाइल के विरुद्ध कई बार फ़ंक्शन चलाने से अनपेक्षित परिणाम हो सकते हैं। साथ ही, autocmdआपके पास एक ही फ़ाइल के लिए एक ही ईवेंट के लिए, अधिक संभावना है कि आप वास्तव में दौड़ की स्थिति में भाग लेंगे। एक विचार प्राप्त करने के लिए vim_dev अभिलेखागार खोजने का प्रयास करें। तो फिर, मुझे क्या पता, यह सिर्फ तुम्हारे लिए काम कर सकता है, है ना?
lcd047

4

आम तौर पर, यदि आप नहीं जानते कि कौन सी घटना सबसे पहले होगी, तो आप ट्रैक करने के लिए एक सहायक का उपयोग कर सकते हैं जब हर एक फायर करता है और केवल अंतिम एक फायर होने पर आपकी कमांड निष्पादित करता है:

function StripTrailingWhiteSpacesIfReady(event) abort
  if !exists('b:events_for_whitespace')
    let b:events_for_whitespace = {}
  endif
  let b:events_for_whitespace[a:event] = 1
  if has_key(b:events_for_whitespace, 'FileType') && has_key(b:events_for_whitespace, 'Buf')
    " Strip trailing whitespace
    %s/\m\s\+$//
  endif
endfunction
autocmd Filetype c,cpp,python call StripTrailingWhiteSpacesIfReady('FileType')
autocmd BufWrite,BufRead * StripTrailingWhiteSpacesIfReady('Buf')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.