vi (m) में खोली गई फ़ाइल की ताज़ा परिवर्तित सामग्री


362

मेरे पास एक कॉन्फ़िगर-फाइल है जिसे मैं खुले में रखता हूं, लेकिन कभी-कभी यह डिस्क पर बदल जाता है, इन परिवर्तनों को टर्मिनल पर प्रतिबिंबित किए बिना। क्या मैं फ़ाइल को बंद किए और फिर से खोलने के बिना स्क्रीन पर सामग्री को ताज़ा कर सकता हूं? यदि हां, तो कैसे?



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

जवाबों:


464

आप :editएक फ़ाइल नाम निर्दिष्ट किए बिना, वर्तमान फ़ाइल को फिर से लोड करने के लिए कमांड का उपयोग कर सकते हैं । यदि आपने फ़ाइल में संशोधन किया है, तो आप :edit!वर्तमान फ़ाइल को पुनः लोड करने के लिए उपयोग कर सकते हैं (आप अपने संशोधनों को खो देंगे)।

कमांड :editद्वारा संक्षिप्त किया जा सकता है :e। बल-संपादन इस प्रकार किया जा सकता है:e!


2
"!" मुझे ट्रिप कर रहा था, लेकिन अब यह स्पष्ट है।
twan163

107
नोट: यह आमतौर पर संक्षिप्त है :e!
स्टीफन चेज़लस 12

31
@StephaneChazelas: के बजाय: हाँ, यह सही :) @ twan163 है :editऔर :edit!आप उपयोग कर सकते हैं :eऔर :e!क्रमशः।
तुशी 12

11
संशोधन खोएं, हां और नहीं। महत्वपूर्ण रूप से, आप अभी भी undo कर सकते हैं :e!
जेरिट सेप

5
इसके अलावा, यदि आप अपने सभी बफ़र्स को फिर से लोड करना चाहते हैं, तो दौड़ें::bufdo e
pkout

193

फ़ाइल को मैन्युअल रूप से ताज़ा करने के अलावा :edit, आप अपने में डाल सकते हैं~/.vimrc

:set autoread

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


2
खरीदार सावधान - यदि आप नए कोड पर काम कर रहे हैं और git pullजानते हैं कि आप अनजाने में स्क्रीन पर अपने सहेजे न गए बदलावों को खो सकते हैं।
अज़ंतर

5
@toszter नहीं, विम केवल अपरिवर्तित बफ़र्स को ताज़ा करेगा । परिवर्तनों के मामले में, अभी भी एक प्रश्न होगा: रखें, या लोड करें?
इंगो करकट

10
एनबी ऑटोरैड बिल्कुल अपने आप काम नहीं करता है । आपको या तो gvimबाहरी कमांड का उपयोग करना होगा , या चलाना होगा।

3
Tmux के अंदर विम का उपयोग करने वाले लोग github.com/tmux-plugins/vim-tmux-focus-events का उपयोग करके फ़ोकस इवेंट प्राप्त कर सकते हैं । अन्यथा ऑटोरैड टर्मिनल में मदद नहीं करेगा जब तक कि आप किसी तरह से कॉल न करें:checktime
कार्ल बार्टल

3
autoreadकर्सर के रुकने के बाद एक्स-ट्रिगर ऑटो सेकंड हो सकता है, इस उत्तर को देखें ।
टॉम हेल

57

टी एल; डॉ

पर जाएं Wrap-upशीर्षक के लिए vimrcलाइनों में अपने जीवन को बेहतर बनाने में क्या करने के लिए जोड़ने के लिए।

मैन्युअल

Daud :checktime

जांचें कि क्या किसी बफ़र्स को विम के बाहर बदल दिया गया है। यदि आप किसी फ़ाइल के दो संस्करणों के साथ समाप्त होते हैं तो यह आपको चेक और चेतावनी देता है।

खुद ब खुद

अपने आप लोड परिवर्तन करने के लिए, अपने में जोड़ें vimrc:

set autoread

जब विम के बाहर किसी फ़ाइल को बदल दिया गया है और उसे विम के अंदर नहीं बदला गया है, तो स्वचालित रूप से उसे फिर से पढ़ें। जब फ़ाइल को हटा दिया गया है तो ऐसा नहीं किया जाता है।

यह उत्तर एक चेतावनी जोड़ता है:

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

समाधान के लिए आगे पढ़ें।

ट्रिगर बंद होने पर ट्रिगर

अपने में जोड़ें vimrc:

au CursorHold,CursorHoldI * checktime

डिफ़ॉल्ट रूप से, कर्सर के 4 सेकंड तक बने रहने के बाद CursorHold चालू हो जाता है, और updatetime के माध्यम से कॉन्फ़िगर करने योग्य होता है

बफर परिवर्तन या टर्मिनल फ़ोकस पर ट्रिगर

विम के अंदर बफ़र्स बदलते समय vimrcट्रिगर करने के लिए अपने को निम्न जोड़ें :autoread

au FocusGained,BufEnter * :checktime

सादे विम के अंदर कैचिंग टर्मिनल विंडो फोकस

करवाने के लिए FocusGained(ऊपर) सादे vim में काम करते हैं, एक टर्मिनल एमुलेटर (xterm, tmux, आदि) के अंदर स्थापित प्लगइन: vim-tmux फोकस-घटनाओं

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

set -g focus-events on

लपेटें

autoreadट्रिगर होने पर सूचनाएं भी संभव हैं

vimrcउपरोक्त सभी को लागू करने के लिए यहां मेरी लाइनें हैं :

" Triger `autoread` when files changes on disk
" https://unix.stackexchange.com/questions/149209/refresh-changed-content-of-file-opened-in-vim/383044#383044
" https://vi.stackexchange.com/questions/13692/prevent-focusgained-autocmd-running-in-command-line-editing-mode
autocmd FocusGained,BufEnter,CursorHold,CursorHoldI * if mode() != 'c' | checktime | endif
" Notification after file change
" https://vi.stackexchange.com/questions/13091/autocmd-event-for-autoread
autocmd FileChangedShellPost *
  \ echohl WarningMsg | echo "File changed on disk. Buffer reloaded." | echohl None

मेरे साथ सही दिशा में इशाराau CursorHold करने के लिए एरचबस्चुलज़ को धन्यवाद ।


2
उत्कृष्ट पोस्ट! उन चीजों में से एक की तरह महसूस करता है जहां यह डिफ़ॉल्ट व्यवहार होना चाहिए
जोनिरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.