मैं विम को "पूंछ-एफ" की तरह कैसे व्यवहार करूं?


36

मैं जानना चाहूंगा कि क्या विम जैसा व्यवहार करने का कोई तरीका है tail -f
यहां तक ​​कि मैंने अब तक पाया सबसे अच्छा विम प्लगइन वह नहीं करता है जो मैं उम्मीद करता हूं।

मैं वास्तव में वास्तविक समय में फाइल अपडेट देखना चाहता हूं । यहां तक ​​कि मैं कीबोर्ड से दूर हूं, मैं चाहता हूं कि विम लगातार बफर को फिर से लोड करे और आखिरी लाइन पर कूद जाए।

यह कैसे करना है?
(मैं पूरी फ़ाइल को फिर से लोड नहीं करना चाहता, क्योंकि कुछ लॉग फाइलें बहुत बड़ी हैं। सबसे अच्छा केवल पिछली लाइनों को लोड करना है, जैसे tail -fकरता है।)


2
यह भीतर क्यों होना चाहिए vim? इसमें गलत क्या है tail -f?
स्वेन

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

आप autoread और FileChangedShell में दिलचस्पी ले सकते हैं >: autoread> मदद: FileChangedShell
gsi-frank

2
सिर्फ खोज के लिए, आप less +Fइसके बजाय कर सकते हैं tail -f। यद्यपि आप वाक्य रचना हाइलाइटिंग नहीं देते हैं।
डेनिस करसेमेकर

जवाबों:


28

आप ऐसा vimव्यवहार नहीं कर सकते tail -f। आप हालांकि और के lessसंयोजन की तरह व्यवहार कर सकते हैं ।vimtail -f

हमेशा के लिए आगे (पालन करें) मोड

lessआगे हमेशा के लिए मोड है जिसे आप एक तर्क के रूप में दबाकर Fया +Fइसे पास करके दर्ज कर सकते हैं ।

$ less +F

इस मोड में, इस lessतरह tail -fसे व्यवहार करता है कि यह फ़ाइल के अंत तक पहुंचने पर पढ़ना बंद नहीं करता है। यह लगातार फ़ाइल से नए डेटा के साथ ताज़ा करता है। इस मोड से बाहर निकलने के लिए, दबाएँ Ctrlc

वाक्य - विन्यास पर प्रकाश डालना

lessयह पढ़े गए डेटा के स्वचालित फ़िल्टरिंग का समर्थन करता है। एक कार्यक्रम है जिसे सोर्स-हाइलाइट कहा जाता है जो बुनियादी स्रोत कोड हाइलाइटिंग कर सकता है। यह एक स्क्रिप्ट के साथ आता है जो अच्छी तरह से काम करता है less। इसका उपयोग करने के लिए, बस LESSOPENपर्यावरण चर को उचित रूप से सेट करें ।

 export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"

आपको ध्वज lessको पास करके कच्चे टर्मिनल से बचने के अनुक्रम (ये आपके टर्मिनल को रंग को कैसे बताएं) को भी बताना होगा -R। आप यह बता सकते हैं कि पर्यावरणीय चर सेट करके lessहमेशा -Rध्वज को पारित किया जाता है LESS

 export LESS=' -R '

जब lessपर्याप्त नहीं है

हालाँकि lessइसमें vi- जैसी कीबाइंडिंग है, यह सिर्फ Vim जैसी नहीं है। कभी-कभी यह विदेशी लगता है और इसमें ctags एकीकरण और पाठ को संपादित करने की क्षमता जैसी महत्वपूर्ण विशेषताओं का अभाव होता है।

जिस फाइल को आप वर्तमान में दबाकर देख रहे हैं, उस पर आप lessकॉल विम (मानकर EDITOR=vim) कर सकते हैं vlessयहां तक ​​कि आपके कर्सर को विम के भीतर सही स्थान पर रखा जाएगा। जब आप विम से बाहर निकलेंगे, तो आप खुद को वापस पा लेंगे less। यदि आपने विम में रहते हुए फ़ाइल में कोई परिवर्तन किया है, तो वे परिलक्षित होंगे less


5
vim --servername TAIL_VIM /tmp/somefile

अब, एक और शेल (जैसे बैश) में, आप कर सकते हैं:

while true
do
    inotifywait --event modify /tmp/somefile \
    && vim --servername TAIL_VIM --remote-send '<C-\><C-N>:edit!<CR>G';
done

जहां <C -> <CN> सामान्य मोड में जाने के लिए बाध्य करता है, "संपादित करें!" वर्तमान फ़ाइल को पुनः लोड करने के लिए विम को बताता है (सीआर एंटर दबाकर प्रवेश करता है), और जी फ़ाइल के निचले हिस्से में जाता है। (G) को हटाने से इनपुट में आने के दौरान फ़ाइल को निष्क्रिय करना आसान हो जाता है।


मैं देखता हूं कि आदमी में "--servername" है, हालांकि मुझे निम्नलिखित त्रुटि संदेश मिला:VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Feb 10 2013 02:28:47) Option inconnue: "--servername=toto" Plus d'info avec: "vim -h"
फॉक्स

अगर आप vim --version करते हैं, तो क्या आप + क्लाइंटसर्वर को देखते हैं (न कि -क्लेवेरस, हाइपेन के साथ)? यदि नहीं, तो बहुत से लोग स्रोत का उपयोग करके विम को संकलित करते हैं ।/configure --with-features = विशाल
क्रुटक्स

हाँ, + ग्राहक है। मेरे पास उबंटू वर्जन है।
फॉक्स

1

मुझे इवान टिटेलमैन की टिप्पणी के लिए जवाब मिला । मेरा समाधान /usr/share/vim/vimcurrent/macros/less.vim से प्रेरित है ।

मैंने अपना खुद का फंक्शन बनाया, लेकिन इसमें काफी सुधार किया जा सकता था।

function! Tailf()
    e
    normal G
    redraw

    sleep 1
    call Tailf()
endfunction

और बस Tailf से बाहर निकलने के लिए CTRL + C मारा ।

टेलफ़ मोड में लॉग फ़ाइल खोलने के लिए: view -M "+call Tailf()" /path/to/logfile.log

मुझे जो पसंद नहीं है, वह sleepकॉल है, जो ऑटो-रिफ्रेश के दौरान कुछ भी करने की अनुमति नहीं देता है। सबसे अच्छा होगा यदि बफ़र स्वायत्त है और भले ही मैं दूसरी स्प्लिट-विंडो में हूं। वैसे भी, यह एक अच्छी शुरुआत है। :)


2
ऐसा लगता है कि यह पूरी फ़ाइल को भी मिटा देता है, जो कि आप नहीं चाहते थे, है ना?
बर्नहार्ड

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

हाँ, यह सच है, यह पूरी फ़ाइल को पुनः लोड करता है, इसलिए इसमें बहुत सुधार करना होगा। जब मैं कहता हूं कि मुझे यह चाहिए, तो मैं परिणाम के बारे में अधिक बात कर रहा हूं (आप स्क्रीन पर क्या देख रहे हैं: एक विम जो आपकी फ़ाइल को अकेले अपडेट करता है और अंतिम पंक्ति पर रहता है)। दुर्भाग्य से मैं एक अच्छा प्लगइन बनाने के लिए पर्याप्त ज्ञान नहीं है ...
फॉक्स

@EvanTeitelman ठीक है, मैं देखता हूं कि अब inotifywait का उपयोग कैसे करें। जब भी फाइल बदलती है मैं जान सकता हूं। लेकिन यह कैसे पता करें कि क्या इसे जोड़ा गया है (पूरी तरह से संशोधित नहीं), और कैसे पता चले कि कितनी नई लाइनें जोड़ी गई हैं?
फॉक्स

फ़ाइल में हर बार फ़ाइल में लाइनों की संख्या पढ़ें। यदि लाइनों की संख्या बढ़ जाती है, तो परिवर्तनों में पढ़ें।

1

उसी के लिए एक गैर पुनरावर्ती विधि:

cmap tailf<CR> call Tailf()<CR>
         function! Tailf()
    "Press C-c to stop tailing
        while 1
            e                                  
            normal G
            redraw
            sleep 1
        endwhile
    endfunction

1

मुझे यह छोटा और बिना हैकिंग के बहुत पसंद है। जब जरूरत हो (या लॉग-फाइल खुलने पर प्रत्येक कमांड को vimrc में डाल सकते हैं, तो आप इस ऑनलाइनर को पूर्व (whithin vim) से चला सकते हैं।)

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

(यदि आप फ़ाइल के अंत में कूदना चाहते हैं (लगभग), तो बस "एलएच" के बजाय "एल" का उपयोग करें (गदहे के साथ) करें

स्पष्टीकरण:

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

उपयोग करते समय स्क्रॉल को रोकने के लिए call feedkeys("G"), निष्पादित करें :set noautoread- अब vim बताएगा, कि फ़ाइल में परिवर्तन था ans पूछें कि क्या कोई बदलाव पढ़ना चाहता है या नहीं)

जब आप स्क्रीन / tmux के बिना ssh सत्र में काम कर रहे हों तो मुझे vim (पूंछ के बजाय) में logfiles देखना पसंद है। इसके अतिरिक्त, आप लॉगफ़ाइल से सीधे कॉपी कर सकते हैं, यदि आवश्यक हो, या सीधे आउटपुट को बचा सकते हैं या ... जो भी आप कर सकते हैं vim :)

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


0

संपादित करें: मैं माफी माँगता हूँ, पूरी तरह से बाईपास कि आप पहले से ही यह कोशिश की।

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

स्थापित करने के लिए, पूंछ खोलें-3.0.vba विम और निष्पादित करें:

:so %

पुनः प्रारंभ करें और आपको इस तरह से विम के भीतर से एक फ़ाइल को पूंछने में सक्षम होना चाहिए:

:Tail /path/to/file

0

केवल VIM 8.0+ के लिए उन्होंने टाइमर पेश किए, ताकि आप टेल फ़ंक्शन को अनुकरण करने के लिए टाइमर का उपयोग कर सकें, यह मेरे अनुभव में बहुत प्रभावी ढंग से काम करता है।

मैंने पूंछ को चालू करने के लिए F6 कुंजी को मैप किया है और पूंछ को बंद करने के लिए F7, आप नीचे दिए गए आदेशों में अनुकूलित कर सकते हैं, साथ ही मेरे अनुभाग को नीचे देखें।

निम्न को चलाएँ

exe ":function! Tail(timer) \n :exe 'normal :e!\<ENTER>G' \n endfunction"
map <F6> :exe timer_start(2000, 'Tail', {'repeat':-1})<CR> 
map <F7> :exe timer_stopall()<CR>

आप ऊपर दिए गए आदेशों को vimrc का हिस्सा भी बना सकते हैं ताकि आप हमेशा उनके पास रहें।

सावधानी के कुछ शब्द:

  • मुझे लगता है कि आपके पास कोई अन्य टाइमर नहीं है, इसलिए टाइमर_स्टॉपॉल () वास्तव में सभी टाइमर को प्रभावी ढंग से रोक देगा। आप इसे टाइमर_स्टार्ट के दौरान आईडी प्राप्त करने के लिए थोड़ा और संशोधित कर सकते हैं और फिर इसे पकड़ सकते हैं, आदि, लेकिन यह मेरे लिए थोड़ा सा काम लग रहा था और मुझे लगता है कि अधिकांश लोग टाइमर का उपयोग नहीं कर रहे होंगे।
  • जब यह पूंछ मोड में होता है, तो मैं अत्यधिक सुझाव देता हूं कि आप किसी भी कमांड को चलाने की कोशिश न करें, यह आमतौर पर विम इंस्टेंस को क्रैश करता है, इसलिए कृपया संपादन मोड में वापस जाने से पहले कृपया TURN OFF TAIL (F7) करें, यह केवल सामान्य रूप से है देखने के लोगो के लिए।

-1

विम के भीतर से, निष्पादित करें:

!tail -f 

जबकि विम को सस्पेंड कर दिया जाएगा जबकि कांटा बंद बच्चा tail -fचालू बफर पर निष्पादित होता है। हिटिंग Ctrl-Cआपको वापस विम में बफर में लौटता है।


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