2015-06-25 अपडेट करें :
- मैंने "शेल" विधि को समाप्त कर दिया है, क्योंकि यह बहुत अधिक खराब था। इसने इन्सर्ट मोड को छोड़ दिया और ज़ोंबी प्रक्रियाओं को छोड़ दिया। देखो इस पोस्ट के संशोधन इतिहास क्या तुम सच में वैसे भी यह देखने के लिए चाहते हैं।
- मैंने इसका एक प्लगइन बनाया है: auto_autoread.vim । फिलहाल, यह प्रभावी रूप से नीचे दिए गए कोड के समान है, लेकिन मैं आपको प्लगइन का उपयोग करने की सलाह दूंगा क्योंकि इससे अपडेट प्राप्त होने की संभावना है।
क्या करता autoread
है?
इस प्रश्न का उत्तर देने के लिए, हमें पहले यह समझना चाहिए कि autoread
विकल्प क्या करता है, और इससे भी महत्वपूर्ण बात यह है कि यह क्या नहीं करता है।
दुर्भाग्य से :help 'autoread'
इस पर बहुत अधिक जानकारी नहीं है, यह सिर्फ कहता है "विम के बाहर एक फ़ाइल का पता चला है" । विम कैसे पता लगाता है कि फ़ाइल बदली गई है? कुछ कार्यों पर, विम फ़ाइल के संशोधन समय की जाँच करता है।
कब:
:checktime
प्रयोग किया जाता है;
- एक बफर दर्ज किया गया है;
:diffupdate
प्रयोग किया जाता है;
:e
एक फ़ाइल के लिए जारी किया गया है जिसमें पहले से ही एक बफर है;
- के साथ एक बाहरी कमांड निष्पादित
!
;
- अग्रभूमि में वापस आना (
^Z
और fg
, केवल तभी जब शेल में नौकरी नियंत्रण हो);
जीवीएम के लिए, यह तब भी किया जाता है जब:
- "राइट-क्लिक" मेनू को बंद करना (या तो कुछ का चयन करके, या बस इसे बंद करके);
- फ़ोकस बदल दिया गया है (यह वही है जो आपने पहले ही देखा था);
- यदि आप "फाइल -> ओपन", "फाइल -> मेन्यू से" (साथ ही कुछ अन्य स्थानों पर) "सेव" का उपयोग करते हैं तो फाइल ब्राउजर डायलॉग को बंद कर दें।
मैंने यह जानकारी विम स्रोत से उन सभी कॉलों को एकत्रित की है
buf_check_timestamp()
, check_timestamps()
जहाँ
need_check_timestamps
पर सेट किया गया है TRUE
।
मैं कुछ घटनाओं को याद कर सकता हूं, लेकिन याद रखने वाली महत्वपूर्ण बात यह है कि विम केवल यह जांचता है कि फ़ाइल को बहुत सीमित सेटस्मार्ट्स में संशोधित किया गया है या नहीं । यह निश्चित रूप से कभी n सेकंड में परिवर्तन के लिए फ़ाइल को "पोल" नहीं करता है , जो कि मूल रूप से आपके बाद है।
तो, आपके उद्देश्य के लिए, set autoread
पर्याप्त नहीं है।
अजगर का उपयोग करना
यह बैकग्राउंड में चलने के लिए पायथन धागे को शेड्यूल करता है, यह :checktime
हर n सेकंड में चलेगा
। अगर autoread
है सक्षम , इस डिस्क से बफर पुनः लोड होगा, और यह सिर्फ चेतावनी देगा।
इसके लिए यह आवश्यक है कि विम के पास +python
या +python3
अंदर है :version
। यह सभी प्लेटफार्मों (विंडोज सहित) पर काम करना चाहिए।
fun! AutoreadPython()
python << EOF
import time, vim
try: import thread
except ImportError: import _thread as thread # Py3
def autoread():
vim.command('checktime') # Run the 'checktime' command
vim.command('redraw') # Actually update the display
def autoread_loop():
while True:
time.sleep(1)
autoread()
thread.start_new_thread(autoread_loop, ())
EOF
endfun
आप इसे बंद करके शुरू कर सकते हैं :call AutoreadPython()
; आप निश्चित रूप से एक ऑटोकैड में ऐसा कर सकते हैं; उदाहरण के लिए:
autocmd *.c call AutoreadPython()
अंतभाषण
वास्तव में अधिक विधियां हैं, उदाहरण के लिए आप बदलाव के लिए फ़ाइल की निगरानी के लिए एक उपकरण जैसे entr
कि पायथन inotify
या gamin
मॉड्यूल का उपयोग कर सकते हैं
, :checktime
सभी बफ़र्स की भी जांच करते हैं यदि इसे कोई तर्क नहीं दिया जाता है, तो इसे केवल एक बफर या चेक करके सुधार किया जा सकता है एक निश्चित फ़ाइल।
हालाँकि, यह उत्तर पहले से ही लंबे समय से है :-) इन पद्धतियों (उम्मीद है!) अधिकांश परिदृश्यों के लिए ठीक काम करना चाहिए, या आसानी से अपने परिदृश्य के अनुकूल होना चाहिए।
पुनश्च। मैंने रूबी का उपयोग करने की भी कोशिश की, लेकिन दुर्भाग्य से रूबी थ्रेड्स का उपयोग Thread
करते हुए ( जैसे) पृष्ठभूमि में नहीं चलते हैं, इसलिए मैं इसे काम करने में सक्षम नहीं था (शायद एक और तरीका है, हालांकि?)
CursorHold
घटना के बारे में कैसे ? यदि विम का ध्यान केंद्रित नहीं है, तो इसे हर n सेकंड में ट्रिगर किया जाना चाहिए।