जैसे ही यह डिस्क पर बदलता है वीआईएम में एक फाइल को ऑटो-रीलोड करना


33

यह मानते हुए कि किसी फ़ाइल में VIM बफर में सहेजे नहीं गए परिवर्तन हैं, मैं चाहूंगा कि डिस्क पर फ़ाइल में परिवर्तन होने पर यह स्वतः ही पुनः लोड हो जाए। इसके लिए सबसे अधिक उपयोग मामला तब होता है जब मैं उस कार्य प्रतिलिपि को अपडेट करता हूं जिसमें फ़ाइल रहती है।

इसे कैसे प्राप्त किया जा सकता है?


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

जवाबों:


32

अपने में ~/.vimrc:

set autoread

9
आम तौर पर autoreadकेवल एक बाहरी कमांड निष्पादित करने के बाद ट्रिगर होगा। यह उत्तर समाधान का विवरण देता है।
टॉम हेल

यह काम नहीं करता है @TomHale लिंक का अनुसरण करें जो एक विस्तृत उत्तर के लिए है
जोनिरा

11

इसी से मेरा काम बना है

set autoread                                                                                                                                                                                    
au CursorHold * checktime  

पहली पंक्ति अपने आप में पर्याप्त नहीं थी। आप में डाल सकते हैं.vimrc

फान है क्वांग को श्रेय


स्वतः पूर्ण आवश्यक नहीं होना चाहिए - चेकटाइम को उसी समय आंतरिक रूप से चलाने के लिए माना जाता है जब CursorHold ईवेंट ट्रिगर होता है। दूसरे शब्दों में, आप सिर्फ दूसरी जांच कर रहे हैं।
१ '

मेरे लिए यह आवश्यक है। सबसे अच्छा समाधान मैंने बहुत शोध के बाद पाया है। @ हां, क्या आपके पास अपने दावे के लिए अध्याय और कविता है?
टॉम हेल

1
@TomHale मैंने विम डॉक्स की समीक्षा की है और यह स्पष्ट रूप से नहीं कहता है, जहां तक ​​मैं बता सकता हूं, लेकिन " :help timestamp" यह इंगित करता प्रतीत होगा कि मैं गलती से एक हूं, और विम केवल विशिष्ट घटनाओं पर जांच करता है, इसलिए आटोक्मड इसे और अधिक बार जांचने के लिए आवश्यक हो सकता है।
१६

5

ऑटोराइड सही तरीके से काम नहीं करता है। निम्नलिखित मेरे लिए काम करता है:

आपको पहले यहाँ से स्क्रिप्ट को स्थापित करने की आवश्यकता है

मुझे सेटअप फ़ंक्शन को सीधे कॉल करके सबसे अच्छा परिणाम मिला, जैसे कि।

let autoreadargs={'autoread':1} 
execute WatchForChanges("*",autoreadargs) 

इसका कारण यह है, कि मैं एक ipython / screen / vim setup चलाना चाहता हूँ।

आप इसे आसानी से वर्धित दृश्य में बदल सकते हैं।

स्क्रिप्ट की प्रक्रिया ..

mkdir -p ~/bin
cat <<`OUT` > ~/bin/vimviewer
#!/usr/bin/env sh
exec vim -n --cmd "source /home/bryan/.vim/.vimrc.watchforchanges | let autoreadargs={'autoread':1} | execute WatchForChanges('*',autoreadargs)" $@
`OUT`

chmod 755 ~/bin/vimviewer
vimview test.txt

1
यदि आप किसी भी GUI जैसे कि GVim या MacVim का उपयोग कर रहे हैं तो ऑटोरैड कमांड पर्यावरण के बाकी हिस्सों के साथ ठीक एकीकृत करता है। उदाहरण के लिए फ़ाइल को किसी अन्य प्रोग्राम में, किसी अन्य संपादक या स्रोत नियंत्रण से संपादित करना, फिर वापस विम पर स्विच करना अपडेट की गई फ़ाइलों को स्वचालित करेगा। समस्या के साथ लगता है कि विम का टर्मिनल संस्करण कैसे एकीकृत करता है। जब आप GUI में प्रोग्राम के बीच स्विच करते हैं या tmux जैसे टर्मिनल मल्टीप्लेक्सर्स का उपयोग करते हैं, तो टर्मिनल संस्करण नहीं बता सकता है, इसलिए यह प्रासंगिक समय में ऑटोराइड करने में विफल रहता है। यह अच्छा होगा यदि विम सिर्फ प्रासंगिक फाइल-सिस्टम ईवेंट की सदस्यता लेगा।
bames53

3

vim-autoread plugin ने अब तक मेरे लिए काम किया है:

vim-autoread

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


हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं। - समीक्षा से
बरगी

@ बरगी मैंने प्लगइन विवरण जोड़ा है जो बताता है कि यह समस्या को हल कैसे करता है।
वोजटेक क्रुज़्ज़स्की

मैंने इसे आजमाया लेकिन मुझे jप्रभावी अपडेट देखने के लिए एक नेविगेशन कमांड (जैसे ) टाइप करना होगा। मैंने इस बारे में एक मुद्दा बनाया: github.com/djoshea/vim-autoread/issues/3
मार्टिन डेलिले

3

इस उत्तर से ( PhanHaiQuang द्वारा एक उत्तर का उल्लेख और @flukus द्वारा एक टिप्पणी)

जरूरत पड़ने पर कोई भी इस ऑनलाइन को पूर्व (व्हिटिन विम) से चला सकता है (या जब लॉग-फाइल खोली जाती है तो प्रत्येक कमांड को vimrc में डाल सकता है।)

:set autoread | au CursorHold * checktime | call feedkeys("lh")

स्पष्टीकरण:
- ऑटोरैड : फ़ाइल को तब पढ़ा जाता है जब उसे बाहर से बदला जाता है (लेकिन यह अपने आप काम नहीं करता है, कोई आंतरिक टाइमर या ऐसा कुछ नहीं है। यह केवल फ़ाइल को पढ़ेगा जब विम एक्शन करता है, जैसे पूर्व में एक कमांड :!
- CursorHold * checktime : जब कर्सर को 'updatetime' में निर्दिष्ट समय के लिए उपयोगकर्ता द्वारा स्थानांतरित नहीं किया जाता है (जो कि डिफ़ॉल्ट रूप से 4000 मील के सेकंड है) चेकटाइम निष्पादित होता है, जो फ़ाइल के बाहर से परिवर्तन की जांच करता है
- कॉल फीडकी ("lh") : कर्सर को एक बार दाएं और बाएं घुमाया जाता है और फिर कुछ नहीं होता है (... जिसका अर्थ है, कि CursorHold ट्रिगर है, जिसका अर्थ है कि हमारे पास एक लूप है )


lhकुछ भी नहीं करता है, यदि कर्सर लाइन पर अंतिम स्थिति में है, lhतो इसका स्थान बदल जाएगा।
महमूद अल-कुद्सी

वास्तव में, यह बात है। फ़ाइल को न्यूनतम इंटरैक्शन या फ़ाइल में परिवर्तन के साथ पुनः लोड किया गया है। आप चाहें तो अंतिम या पहली पंक्ति में कूद सकते हैं (बस lh को gg या G से बदलें), लेकिन यहाँ लक्ष्य, केवल vim में फ़ाइल को पुनः लोड करने के लिए है, और इस एक-लाइनर द्वारा किए गए व्हाट्स, और कुछ नहीं। आप यहां क्या करना पसंद करते हैं?
इली

@ MahmoudAl-Qudsi ... का अर्थ है, कि "lh" सिर्फ CursorHold - कार्रवाई को चलाता है (मैंने उल्लेख किया है कि स्पष्टीकरण में), जो फिर से autoread को ट्रिगर करता है
eli

1

यहाँ कुछ प्लगइन्स सूचीबद्ध हैं जो विम के आपके संस्करण के आधार पर काम कर सकते हैं।

एक अन्य दृष्टिकोण समय-समय पर checktimeबाहरी प्रक्रिया से कमांड भेजने का है। यह करने के लिए एक ShellJS स्क्रिप्ट यहाँ है (आवश्यकता shelljs-plugin-sleep, NeoVim, और nvr)

while (true) {
  sleep(15);
  var servernames = exec('nvr --serverlist').trim().split('\n');
  if (!servernames.length || !servernames[0]) {
    continue;
  }
  servernames.forEach(
    (sn) => exec(`nvr -c "checktime" --servername ${sn}`) );
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.