मैं विम फाइल को कैसे फोकस कर सकता हूं जबकि इसमें फोकस नहीं है?


29

मैं सभी प्रकार की चीजों (या इस मामले में gVim) के लिए VIm का उपयोग कर रहा हूं, जिसमें फ़ाइल में लिखे गए आउटपुट को मॉनिटर करना भी शामिल है; मैं autoreadविम फ़ाइल को फिर से बनाने के लिए उपयोग करता हूं, जो कि जब भी मैं कीबोर्ड फोकस को स्विच करता हूं, तो यह होता है।

क्या वीम को बफर अपडेट करने का कोई तरीका है, भले ही मैं कीबोर्ड फोकस स्विच न करूं? मैंने सेटिंग की कोशिश की है, checktimeलेकिन कीबोर्ड का ध्यान कहीं और है, जबकि इसका कोई प्रभाव नहीं दिखता है।

मैं जो आउटपुट देख रहा हूँ वह आउटपुट फाइल को पूरी तरह से बदल रहा है; और मैं इसे नहीं देख रहा हूँ tail -f। अन्य विकल्प हैं, जैसे हर बार एक नए उदाहरण में पाइपिंग lessकरना, या कुछ में पाइप करना, लेकिन यह अच्छा होगा यदि इसे VIm के साथ किया जा सकता है।


@Carpetsmoker CursorHoldघटना के बारे में कैसे ? यदि विम का ध्यान केंद्रित नहीं है, तो इसे हर n सेकंड में ट्रिगर किया जाना चाहिए।
मुरु

1
@ मुरु नहीं, CursorHoldकेवल एक बार निष्पादित किया जाता है, यह स्पष्ट रूप से प्रलेखित है: "यदि आप कुछ कॉफी बनाने के लिए विम को छोड़ते हैं तो हर 'अपडाउनटाइम' को आग नहीं लगाते हैं। :)"
मार्टिन टूरनोइज

1
मैंने फिर से gvim टैग हटा दिया , मुझे आशा है कि यह ठीक है ;; जैसा कि मैंने देखा है, यह प्रश्न वास्तव में gVim के बारे में नहीं है , क्योंकि फोकस परिवर्तन सिर्फ एक घटना है, जिस पर Vim जाँचता है कि क्या फ़ाइल बदली गई है (पूरे गुच्छा हैं,) विवरण के लिए मेरा जवाब देखें)। अधिकांश, यदि सभी नहीं, तो इस पर सुधार करने के तरीके विम और जीवीम दोनों में ठीक काम करेंगे।
मार्टिन टूरनोइज

@Carpetsmoker आह, मैं इस धारणा के तहत था कि जीवीएम नियमित रूप से जाँच करता था जबकि इसमें कीबोर्ड फ़ोकस था (इस प्रकार यह एक जीवीएम प्रश्न बना रहा था), लेकिन ऐसा लगता है कि मुझसे गलती हुई थी। इसे साफ करने के लिए धन्यवाद।
बाजीगर

जवाबों:


20

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करते हुए ( जैसे) पृष्ठभूमि में नहीं चलते हैं, इसलिए मैं इसे काम करने में सक्षम नहीं था (शायद एक और तरीका है, हालांकि?)


2

मैंने थोड़ा प्लगइन vim-autoread बनाया tail -fजो पृष्ठभूमि में बफर को अतुल्यकालिक रूप से अपडेट करने के लिए उपयोग करता है। यह स्पष्ट रूप से विम संस्करण 8 की नौकरी की जरूरत है।

:AutoReadइसे चालू करने और :AutoRead!इसे बंद करने के लिए उपयोग करें ।


एक NeoVim- संगत संस्करण बहुत अच्छा होगा!
एंड्रयू

@AndrewMacFie मैं नहीं देखता, क्यों यह Neovim पर काम नहीं करेगा।
क्रिश्चियन ब्रेबांट

NeoVim में Vim 8 नौकरियों के समर्थन की कमी के बारे में मैंने सोचा था?
एंड्रयू

@AndrewMacFie ओह, जो शायद सच है। चूंकि मैं नवविराम का उपयोग नहीं करता, इसलिए मैं इसे NeoVim के अनुकूल नहीं बना सकता। हालाँकि एक पीआर का स्वागत होगा :)
क्रिश्चियन ब्रेबांट

निष्पक्ष पर्याप्त
एंड्रयू

1

Neovim में आप निम्न कमांड का उपयोग कर सकते हैं जो टेल कमांड चलाने वाले टर्मिनल बफर को खोलेगा।

:enew | call termopen('tail --follow=name --retry /path/to/file.log')

यह तब भी काम करता रहेगा जब फ़ाइल को हटा दिया जाता है और फिर से बनाया जाता है।

या निम्नलिखित को अपने में जोड़ें $MYVIMRC

" :Tail /path/to/file
function! Tail(file)
  enew
  call termopen('tail --follow=name --retry ' . fnameescape(a:file))
endfunction
command! -nargs=1 Tail call Tail(<f-args>)

1

इस से जवाब (द्वारा एक जवाब की बात कर PhanHaiQuang और द्वारा एक टिप्पणी flukus )

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.