কোনও ফাইলের রিয়েলটাইম পরিবর্তনগুলি মনিটরিং করতে পারে


104

আমার প্রশ্নটি কীভাবে রিয়েলটাইমে কোনও পাঠ্য ফাইল পর্যবেক্ষণ করতে পারে তার অনুরূপ তবে আমি এটি ভিমে করতে চাই। আমি জানি আমি একটি খোলা ফাইল ব্যবহার tail -f sample.xmlফাইল পড়তে পারি এবং যখন ফাইলটিতে নতুন সামগ্রী লেখা হয় তখন এটি আমার স্ক্রিনে নতুন সামগ্রীটিও লিখতে পারে। কোনও ফাইল আপডেট হলে আমি কী ভিএম স্বয়ংক্রিয়ভাবে নতুন ডেটা পূরণ করতে পারি?

উত্তর:


101

আপনি :set autoreadযখন ভিএম ফাইলটি পরিবর্তন করেন তখন এটি পড়তে পারেন । তবে (আপনার প্ল্যাটফর্মের উপর নির্ভর করে) আপনাকে এটিকে ফোকাস দিতে হবে।

সহায়তা থেকে:

যখন কোনও ফাইল ভিমের বাইরে পরিবর্তন করা হয়েছে এবং এটি ভিমের অভ্যন্তরে পরিবর্তন করা হয়নি, তখন স্বয়ংক্রিয়ভাবে এটি আবার পড়ুন। ফাইলটি মোছা হয়ে গেলে এটি করা হয় না।


5
ইঙ্গিতটির জন্য ধন্যবাদ! এটি দেখতে বেশ আশাব্যঞ্জক, তবে এটি আমার সিস্টেমে কাজ করে না :( আমি ম্যাকভিমের সাথে সংকলিত ভিএম সংস্করণ .2.২.৩০৩ সহ ম্যাক ১০..2.২ আইটির্ম ব্যবহার করছি I আমি যে কোনও অতিরিক্ত মন্তব্য চেষ্টা করতে পারি?
প্যাট্রিক

এরম, এটা বেশ অদ্ভুত। আপনি কি ম্যাকভিম গুই বা টার্মিনাল সংস্করণ ব্যবহার করছেন? এটি ম্যাকভিম গুই ডাউনলোড করা প্রাকম্পম্পাইল সহ আমার পক্ষে কাজ করে। (যদিও আমি উল্লেখ করেছি ঠিক তেমন ফোকাস দেওয়ার জন্য আমাকে অ্যাপে ক্লিক করতে হবে)
পিটার

1
আমি টার্মিনালে পরীক্ষা করছিলাম, আমি gvim (ম্যাকভিম জিইউআই) ব্যবহার করার পরে ফাংশনটি কাজ শুরু করল! আপনি যদিও উল্লেখ করেছেন, কন্টেন্ট আপডেট করার জন্য আমার gvim ফোকাস করা প্রয়োজন। এটিকে কেন্দ্রীভূত না করেও আপডেট করার কোনও কৌশল আছে? আবারও আপনার সাহায্যের জন্য ধন্যবাদ।
প্যাট্রিক 4

3
দুর্ভাগ্যক্রমে আমি এর কোনও সমাধান জানি না। ফোকাস পরিবর্তন না করে যদি ভিআইএম এটি করতে পারে তবে আমি হতবাক হয়ে যাব - এটি কখন পরিবর্তিত হয় তা দেখার জন্য ফাইল সিস্টেমটি পোল করার জন্য ভিআইএমের প্রয়োজন হবে। আমি মনে করি এর জন্য আপনার একটি প্লাগইন লাগবে।
পিটার

2
@ পিটার আমি এর আগে একটি প্লাগইন তৈরি করেছি । এছাড়াও এই প্রশ্ন এবং এটিতে আমার উত্তর দেখুন । কীভাবে autoreadকাজ করে এবং এর সীমাবদ্ধতা সম্পর্কে আরও তথ্যের জন্য ।
মার্টিন টর্নোইজ

63

স্বয়ংক্রিয়ভাবে সম্পর্কে জানেন না, তবে আপনি টাইপ করতে পারেন:

:e!

ফাইলটি পুনরায় লোড করতে


যদিও এই পদ্ধতির সামগ্রীটি স্বয়ংক্রিয়ভাবে আপডেট হয় না তবে এটি আপডেট হওয়া সামগ্রীটি প্রদর্শন করে। আপনার উত্তরের জন্য ধন্যবাদ!
প্যাট্রিক

31

আপনার মধ্যে নিম্নলিখিত রাখুন .vimrc:

"স্বাভাবিক মোডে 4s নিষ্ক্রিয়তার পরে একবার পরীক্ষা করুন
অটোরেড সেট করুন                                                                                                                                                                                    
অউ কার্সারহোল্ড * চেকটাইম                                                                                                                                                                       

গ্রেট! আপনি যদি পুনরায় লোড করার পরে সেই ফাইলটি পরিবর্তন করে থাকেন তবে কোনও সতর্কতার সাথেও ভাল কাজ করে।
zoujyjs

1
প্রথম উত্তরটি আমার পক্ষে কার্যকর হয়নি, তবে এটি কাজ করে! :-)
আয়নিক বিজাউ

4
"প্রতি 4 সেকেন্ড" সত্য নয়। এটি কেবলমাত্র চেক করবে এক স্বাভাবিক মোডে নিষ্ক্রিয়তা 4S পর সময়। সুতরাং আপনি যদি দীর্ঘ সময়ের জন্য অন্য কোনও বাফারে কিছু না করেন তবে তা আপডেট হবে না, তবে আপনি যদি কেবল কার্সারটি সরান এবং 4s অপেক্ষা করেন it আরেকটি বিকল্প হ'ল ম্যানুয়ালি ": চেকটাইম" আপডেট করার জন্য কল করুন (স্বতঃআপনার সেট করার পরে)। দুর্ভাগ্যক্রমে ভিমে কোনও ধরণের পোলিং সমর্থন বলে মনে হচ্ছে না, সুতরাং ওপিএস প্রশ্নের সঠিক উত্তর নেই।
ডেভিড লাজং ম্যাডিসন স্টেলার lar

1
সবেমাত্র এদিকে এসেছিল। যদি আপনি কোনও কাস্টম ফাংশন কল করতে চেকটাইম পরিবর্তন করেন এবং ফাংশনটির শেষে "কল ফিডকি (" lh ")" যুক্ত করেন তবে প্রতি 4 সেকেন্ডে এটি চালিত হবে।
ফ্লুকাস

@ ডেভিডলজং ম্যাডিসন আপনি ঠিক বলেছেন, এই ভুল এড়াতে আমি পোস্টটি সম্পাদনা করতে যাচ্ছি
ফান হাই কোয়াং

9

যেমন @ ফ্লুকাস পূর্ববর্তী উত্তরের একটি মন্তব্যে বলেছিলেন যে আপনি করতে পারেন call feedkeys["lh"](এটি কার্সারটিকে ডানে এবং বামে ফিরে যায়, যা লগ ফাইল দেখার সময় সাধারণত ক্ষতি করে না)

সুতরাং, যদি আপনি বাকী উত্তরটি একত্রিত করেন তবে আপনার যখন অননলাইনার রয়েছে আপনি প্রয়োজনের সময় প্রাক্তন (whithin vim) থেকে চালাতে পারেন:

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


(যদি আপনি ফাইলটির শেষে প্রায় (প্রায়) ঝাঁপিয়ে পড়তে চান তবে কেবল ফিডকি দিয়ে "lh" এর পরিবর্তে "G" ব্যবহার করুন)

ব্যাখ্যা:
- অটোরেড : বাইরের থেকে পরিবর্তিত হয়ে ফাইলটি পড়ে (তবে এটি নিজে থেকে কাজ করে না, কোনও অভ্যন্তরীণ টাইমার বা এর মতো কিছু নেই It এটি কেবল তখনই ফাইলটি পড়বে যখন ভিআইএম কোনও কমান্ডের মতো প্রাক্তন কমান্ডের মতো করে :!
- কার্সারহোল্ড * চেকটাইম : যখন 'আপডেটটাইম' (যা ডিফল্টরূপে 4000 মিলিয়ন সেকেন্ড) নির্দিষ্ট সময়ের জন্য ব্যবহারকারীর দ্বারা কার্সারটি সরানো হয় না তখন চেকটাইম কার্যকর করা হয়, যা ফাইলের বাইরের পরিবর্তনগুলি পরীক্ষা করে
- কল ফিডকি ("lh") : কার্সারটি একবার, ডান এবং পিছনে বামে সরানো হয় এবং তারপরে কিছুই হয় না (... যার অর্থ, কার্সারহোল্ডটি ট্রিগার হয়েছে, যার অর্থ আমাদের একটি লুপ রয়েছে )

অতিরিক্তভাবে আপনি :set syntax=logtalkলগ রঙ করতে পারেন

স্ক্রোলিংটি ব্যবহার করার সময় থামানোর জন্য call feedkeys("G"), এক্সিকিউট করুন :set noautoread- এখন ভিআইএম বলবে যে ফাইলটি পরিবর্তন হয়েছিল উত্তরগুলি জিজ্ঞাসা করুন যে কেউ পরিবর্তনগুলি পড়তে চায় কিনা)

(এটির কি কোনও পার্শ্ব প্রতিক্রিয়া রয়েছে?)

সম্পাদনা: আমি একটি পার্শ্ব-প্রতিক্রিয়া দেখছি: যদি কেউ "জি" এস ফিডকি ব্যবহার করে তবে এটি বর্তমানে খোলার প্রতিটি বাফার নীচে স্ক্রোল করবে ?! সুতরাং, ডান বাফারটি একটি লগফাইলে স্বয়ংক্রিয়ভাবে স্ক্রল করে নেওয়ার সময় একটি বিভাজন উইন্ডোর বাম বাফারে কাজ করা সম্ভব নয়


4

এটি আপনার .vimrc এ আটকে দিন এবং এটি কোনও বসের মতো কাজ করা উচিত। (গৃহীত: http://vim.wikia.com/wiki/ হ্যাভ_ভিম_চেক_আউটমেটিক_ফ_এই_ফাইলে_হাস_চেনা_ বহিরাগত )

" Function to Watch for changes if buffer changed on disk
function! WatchForChanges(bufname, ...)
  " Figure out which options are in effect
  if a:bufname == '*'
    let id = 'WatchForChanges'.'AnyBuffer'
    " If you try to do checktime *, you'll get E93: More than one match for * is given
    let bufspec = ''
  else
    if bufnr(a:bufname) == -1
      echoerr "Buffer " . a:bufname . " doesn't exist"
      return
    end
    let id = 'WatchForChanges'.bufnr(a:bufname)
    let bufspec = a:bufname
  end
  if len(a:000) == 0
    let options = {}
  else
    if type(a:1) == type({})
      let options = a:1
    else
      echoerr "Argument must be a Dict"
    end
  end
  let autoread    = has_key(options, 'autoread')    ? options['autoread']    : 0
  let toggle      = has_key(options, 'toggle')      ? options['toggle']      : 0
  let disable     = has_key(options, 'disable')     ? options['disable']     : 0
  let more_events = has_key(options, 'more_events') ? options['more_events'] : 1
  let while_in_this_buffer_only = has_key(options, 'while_in_this_buffer_only') ? options['while_in_this_buffer_only'] : 0
  if while_in_this_buffer_only
    let event_bufspec = a:bufname
  else
    let event_bufspec = '*'
  end
  let reg_saved = @"
  "let autoread_saved = &autoread
  let msg = "\n"
  " Check to see if the autocommand already exists
  redir @"
    silent! exec 'au '.id
  redir END
  let l:defined = (@" !~ 'E216: No such group or event:')
  " If not yet defined...
  if !l:defined
    if l:autoread
      let msg = msg . 'Autoread enabled - '
      if a:bufname == '*'
        set autoread
      else
        setlocal autoread
      end
    end
    silent! exec 'augroup '.id
      if a:bufname != '*'
        "exec "au BufDelete    ".a:bufname . " :silent! au! ".id . " | silent! augroup! ".id
        "exec "au BufDelete    ".a:bufname . " :echomsg 'Removing autocommands for ".id."' | au! ".id . " | augroup! ".id
        exec "au BufDelete    ".a:bufname . " execute 'au! ".id."' | execute 'augroup! ".id."'"
      end
        exec "au BufEnter     ".event_bufspec . " :checktime ".bufspec
        exec "au CursorHold   ".event_bufspec . " :checktime ".bufspec
        exec "au CursorHoldI  ".event_bufspec . " :checktime ".bufspec
      " The following events might slow things down so we provide a way to disable them...
      " vim docs warn:
      "   Careful: Don't do anything that the user does
      "   not expect or that is slow.
      if more_events
        exec "au CursorMoved  ".event_bufspec . " :checktime ".bufspec
        exec "au CursorMovedI ".event_bufspec . " :checktime ".bufspec
      end
    augroup END
    let msg = msg . 'Now watching ' . bufspec . ' for external updates...'
  end
  " If they want to disable it, or it is defined and they want to toggle it,
  if l:disable || (l:toggle && l:defined)
    if l:autoread
      let msg = msg . 'Autoread disabled - '
      if a:bufname == '*'
        set noautoread
      else
        setlocal noautoread
      end
    end
    " Using an autogroup allows us to remove it easily with the following
    " command. If we do not use an autogroup, we cannot remove this
    " single :checktime command
    " augroup! checkforupdates
    silent! exec 'au! '.id
    silent! exec 'augroup! '.id
    let msg = msg . 'No longer watching ' . bufspec . ' for external updates.'
  elseif l:defined
    let msg = msg . 'Already watching ' . bufspec . ' for external updates'
  end
  echo msg
  let @"=reg_saved
endfunction

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

1
টার্মিনাল স্বতঃবর্ধিত ত্রুটিগুলি সমাধান করার পক্ষে এটি পছন্দসই উত্তর।
এমকেনফিল্ড

3
@ এমকেনফিল্ড না এটি এখনও এটি "পরিবর্তনের জন্য নজর রাখেনি" হিসাবে নেই। আপনার এখনও ভিম সক্রিয় থাকা দরকার এবং এটি এখনও সীমিত ইভেন্টের পোলিং (দেখছেন না)। একবারCursorHold চালানো হয় । সুতরাং আপনি যদি যান এবং একটি কফি পান, বা অন্য উইন্ডোতে কিছু করছেন এটি আপডেট হবে না
মার্টিন টর্নোইজ

4
সেই স্ক্রিপ্টটি একটি ভিম প্লাগইন হিসাবেও বান্ডিল রয়েছে: ভিম -অটোরেড
স্টিফেন.হ্যানসন

1
@ স্টিফেন.হ্যানসন লিঙ্কটির জন্য ধন্যবাদ, প্লাগইনটি আমার পক্ষে ভাল কাজ করছে!
ট্রপিলিও


2

যদি ইউনিক্স + নিওভিম

:term tail -f <filename>

অবশ্যই এটি সবার জন্য কাজ করবে না, তবে আমি এটি কীভাবে করব।



0

কোনও ফাইল আপডেট হওয়ার পরে ভিআইএম আপনাকে সতর্ক করে দেবে যাতে আপনি এটি খোলার পর থেকে যে পরিবর্তনগুলি হয়েছে সেগুলি ওভাররাইট না করে। এটি আপনাকে সেই সময়ে ফাইলটি পুনরায় লোড করার অনুরোধ জানাবে।


1
আপনার উত্তরের জন্য ধন্যবাদ, তবে আমার সিস্টেমে ফাইলটি পরিবর্তন করার সময় ভিম আমাকে সতর্ক করেনি :(
প্যাট্রিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.