मैं वर्तमान फ़ाइल को कैसे पुनः लोड करूं?


145

काफी बार मैं उन फ़ाइलों के साथ काम कर रहा हूं जो संस्करण नियंत्रित हैं, इसलिए विम के बाहर उन पर किए जाने वाले परिवर्तनों के लिए संभव है।

फ़ाइल को फिर से बंद करने और विम को फिर से खोलने के बिना एक त्वरित तरीका क्या है? और क्या स्वचालित रूप से ऐसा करने का कोई तरीका है?


" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
टॉम हेल

यदि आपने vim-faq स्थापित किया है , तो आप वहां ऑफ़लाइन उत्तर प्राप्त कर सकते हैं: :h vim-faqऔर खोज करें /reload। टैग को याद रखना कठिन है :h faq-5.8
होट्सचेक

जवाबों:


172

आप जो कमांड चाहते हैं, वह है :e(संक्षिप्त रूप से :edit)। यदि आप इसका उपयोग करते हैं तो :edit!यह स्थानीय परिवर्तन और पुनः लोड को छोड़ देगा।

आप set autoreadअपने vimrc में स्वतः ही ऐसा कर सकते हैं ।


5
के बारे में caveats और समाधान के लिए इस जवाब को देखें autoread
टॉम हेल 3

4
सभी बफ़र्स के लिए ऐसा करने के लिए, का उपयोग करें :bufdo :eया:bufdo :e!
हारून एच

1
@AaronH। उसके लिये आपका धन्यवाद! मेरे पास आमतौर पर एक समय में सैकड़ों बफ़र खुले होते हैं और शाखाओं को स्विच करते समय, मैं आमतौर पर विम को बंद कर देता हूं और नई सामग्री के साथ सभी बफ़र्स को ताज़ा करने के लिए पुनरारंभ करता हूं। यह एक प्रमुख समय होगा!
g19fanatic

1
@AaronH। दूसरा :वैकल्पिक है: :bufdo eवही काम करेगा।
जोएल

19

कई मामलों में, set autoreadकाम नहीं करेगा क्योंकि यह उत्तर बताता है:

जब तक आप बाहरी कमांड चलाने (जैसे !lsया !shआदि) की तरह कुछ नहीं करते ऑटोरैड फाइल को फिर से लोड नहीं करता है

फोकस ईवेंट ट्रिगर हो जाएंगे autoread, लेकिन जब तक उपयोग नहीं किया जाता है, तब तक इन्हें कैप्चर नहीं किया जाएगा gvim। इसलिए, यदि vimटर्मिनल विंडो या tmux के अंदर सादा चल रहा है, तो प्लगइन vim-tmux-focus-इवेंट्स स्थापित करें

Tmux संस्करण> 1.9 पर, आपको इसमें जोड़ना होगा .tmux.conf:

set -g focus-events on

अतिरिक्त अच्छाई के लिए, निम्नलिखित को जोड़ना आपके vimrcलिए ट्रिगर होगा autoreadजब vim के अंदर अंदर बफ़र्स बदलते समय :

au FocusGained,BufEnter * :checktime

यह मुझे वर्षों से परेशान कर रहा है। एक संपूर्ण समाधान के लिए धन्यवाद! Long
नाथन लॉन्ग

9

यदि आपने कभी भी विम से एक बाहरी कमांड चलाया है जो वर्तमान बफर को संशोधित करता है, तो आपने देखा होगा कि डिस्क में परिवर्तन किए जाने के बाद से यह आपको फ़ाइल को फिर से लोड करने के लिए प्रेरित करता है। आप वास्तव में :checktimeकमांड का उपयोग करके इस संकेत को लागू कर सकते हैं ।


3

Https://github.com/djoshea/vim-autoread को बेहतर बनाने के लिए अच्छा प्लगइनautoread

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


Vi स्टैक एक्सचेंज में आपका स्वागत है। यह एक लिंक-ओनली उत्तर है। आप प्लगइन का वर्णन करके इस पर सुधार कर सकते हैं (जैसे कि यह क्या करता है? ओपी के लक्ष्यों को पूरा करने के लिए इसका उपयोग कैसे किया जाएगा?)
जेन ओएमएम।

0

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


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

vim --servername JABBERWOCKY /tmp/alice.log

मान लें कि फ़ाइल को बाहरी रूप से बदल दिया गया है, उदाहरण के लिए a echo "Curiouser and curiouser" >> /tmp/alice.log। जब आवश्यक हो, फ़ाइल को फिर से लोड करने के लिए सर्वर उदाहरण के लिए एक कमांड भेजें। यह आदेश शीघ्रता से समाप्त होगा और एक नया संपादक नहीं होगा।

vim --servername JABBERWOCKY --remote-send ":e<CR>"

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


--remote-sendऊपर दिए गए कमांड को मैनुअल रीलोडिंग की आवश्यकता है। हालाँकि, उस आदेश को एक साधारण लूप से बांधा जा सकता है, बश के for/ whileका उपयोग करके, या लिनक्स के यूनिक में एक-एक लाइनर का उपयोग करके:

watch -n 1 'vim --servername JABBERWOCKY --remote-send ":e<CR>"'

यद्यपि परीक्षण नहीं किया गया है, लेकिन मुझे यकीन है कि ऐसा कुछ PowerShell में भी महसूस किया जा सकता है।

लिनक्स / यूनिक्स पर ईवेंट-संचालित दृष्टिकोण को महसूस किया जा सकता है , उदाहरण के लिए फ़ाइल सिस्टम ईवेंट्स का उपयोग करके लाइब्रेरी को inotify करें , यदि आपका बहुत क्रेज़ी फाइल सिस्टम उपयोग नहीं कर रहा है। व्यक्तिगत तौर पर मैं उपकरण का उपयोग कर की तरह entr एक बहुत है, जो प्रमुख लिनक्स वितरण में शामिल किया जा रहा है। फिर मुझे मिलता है:

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.