ফিম ফোকাস না থাকাকালীন আমি কীভাবে ভিমকে একটি ফাইল পুনরায় স্বনির্ধারণ করতে পারি?


29

আমি কোনও ফাইলে লিখিত মনিটরিং আউটপুট সহ সমস্ত ধরণের জিনিস (বা এই ক্ষেত্রে জিভিম) জন্য ভিএম ব্যবহার করছি; আমি autoreadভিম ফাইলটি পুনরায় পঠন করতে ব্যবহার করি যা আমি যখনই কীবোর্ড ফোকাসটিতে স্যুইচ করি তখন তা করে।

আমি কিবোর্ড ফোকাসটি স্যুইচ না করলেও ভিমকে বাফার আপডেট করার কোনও উপায় আছে কি? আমি সেটিংস চেষ্টা করেছি checktimeকিন্তু কীবোর্ড ফোকাস অন্য কোথাও থাকাকালীন এটির কোনও প্রভাব আছে বলে মনে হচ্ছে না।

আমি যে আউটপুটটি পর্যবেক্ষণ করছি তা আউটপুট ফাইলটিকে পুরোপুরি প্রতিস্থাপন করছে; এবং আমি tail -fএটি খুঁজছি না। অন্যান্য বিকল্প রয়েছে যেমন প্রতিবার একটি নতুন উদাহরণে পাইপ করা, বা পাইপিং করা lessবা কোনও কিছু করা, তবে এটি VIm এর সাহায্যে সম্পন্ন করা সম্ভব হলে শান্ত হবে।


@ কার্পেটসমোকার কীভাবে এই CursorHoldঅনুষ্ঠানের কথা বলছেন ? যদি ভিমের ফোকাস না থাকে তবে এটি প্রতি এন সেকেন্ডে ট্রিগার করা উচিত।
মুড়ু

1
@ মুরু না, CursorHoldকেবল একবার মৃত্যুদন্ড কার্যকর করা হবে, এটি স্পষ্টভাবে এই হিসাবে নথিভুক্ত করা হয়েছে: "আপনি যদি কোনও কফি তৈরির জন্য ভিম ছেড়ে যান তবে প্রতিটি 'আপডেটটাইম' এমএস চালায় না :) :)"
মার্টিন টর্নিজ

1
আমি মুছে gvim ট্যাগ আবার আমি আশা করি যে ঠিক আছে ;-) আমি এটা দেখতে, এই প্রশ্ন করা হয়, না সত্যিই সম্পর্কে , যেমন ফোকাস পরিবর্তন শুধু একটা ঘটনা যার উপর তেজ চেক যদি ফাইল পরিবর্তন করা হয় (সেখানে আভা হয়, gVim বিশদ জন্য আমার উত্তর দেখুন)। বেশিরভাগ, সব কিছু না হলেও, এর উন্নতির উপায়গুলি ভিম এবং জিভিম উভয় ক্ষেত্রেই কার্যকর হবে work
মার্টিন টর্নোইজ

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

উত্তর:


20

আপডেট 2015-06-25 :

  • আমি "শেল" পদ্ধতিটি স্ক্র্যাপ করে ফেলেছি, কারণ এটি খুব অকার্যকর ছিল। এটি সন্নিবেশ মোড এবং বাম জোম্বি প্রক্রিয়াগুলি বন্ধ করে দিয়েছে। এ এই পোস্ট এর পুনর্বিবেচনা ইতিহাস আপনি কি সত্যিই যাহাই হউক না কেন এটা দেখতে চাই হয়।
  • আমি এর থেকে একটি প্লাগইন তৈরি করেছি: অটো_আউটোরাদ.ভিম । এই মুহুর্তে, এটি কার্যকরভাবে নীচের কোডের মতো একই, তবে আমি আপনাকে সুপারিশ করব প্লাগইনটি ব্যবহার করার কারণে এটি আপডেটগুলি পেতে পারে।

কি করে autoread?

এই প্রশ্নের উত্তর দেওয়ার জন্য, আমাদের প্রথমে বুঝতে হবে autoreadবিকল্পটি কী করে এবং আরও গুরুত্বপূর্ণভাবে, এটি কী করে না

দুর্ভাগ্যক্রমে :help 'autoread' এই সম্পর্কে অনেক তথ্য নেই, এটি কেবল "একটি ফাইল ভিমের বাইরে পরিবর্তন করা হয়েছে বলে সনাক্ত করা হয়েছে" বলেছে । উইম কীভাবে সনাক্ত করতে পারে যে একটি ফাইল পরিবর্তিত হয়েছে? নির্দিষ্ট কিছু ক্রিয়াকলাপে, ভিম ফাইলটির পরিবর্তনের সময় পরীক্ষা করে।

কখন:

  • :checktime ব্যবহৃত হয়;
  • একটি বাফার প্রবেশ করা হয়েছে;
  • :diffupdate ব্যবহৃত হয়;
  • :e ইতিমধ্যে একটি বাফার রয়েছে এমন একটি ফাইলের জন্য জারি করা হয়;
  • এর সাথে একটি বাহ্যিক কমান্ড কার্যকর করা !;
  • ফোরগ্রাউন্ড ফিরে ( ^Z, fg, শেল কাজ নিয়ন্ত্রণ আছে শুধুমাত্র যদি);

gVim এর জন্য, এটিও করা হয় যখন:

  • "ডান ক্লিক" মেনু বন্ধ (হয় কিছু নির্বাচন করে, বা কেবল এটি বন্ধ করে);
  • ফোকাস পরিবর্তন করা হয়েছে (এটি আপনি ইতিমধ্যে লক্ষ্য করেছেন);
  • ফাইল ব্রাউজারগুলির ডায়লগটি বন্ধ করে যা আপনি মেনু থেকে "ফাইল -> খুলুন", "ফাইল -> সংরক্ষণ করুন" ব্যবহার করেন (পাশাপাশি কিছু অন্যান্য স্থান) ব্যবহার করে।

আমি ভিএম উত্স থেকে এই কলটি buf_check_timestamp(), check_timestamps()ফাংশন এবং যেখানে need_check_timestampsসেট করা আছে সেগুলিতে সমস্ত কল সনাক্ত করে তথ্য সংগ্রহ করেছি TRUE

আমি কিছু ইভেন্ট মিস করতে পারি, তবে মনে রাখার মূল বিষয়টি হ'ল ভিম কেবলমাত্র ফাইলটিকে খুব সীমাবদ্ধ সংস্থায় সংশোধন করা হয়েছে কিনা তা পরীক্ষা করে । এটি অবশ্যই কখনও এন সেকেন্ডের পরিবর্তনের জন্য ফাইলটিকে "পোল" দেয় না , যা মূলত আপনি যা করছেন।

সুতরাং, আপনার প্রয়োজনের জন্য, set autoreadযথেষ্ট নয়।

পাইথন ব্যবহার করা

এটি ব্যাকগ্রাউন্ডে চালুর জন্য পাইথন থ্রেডকে শিডিউল :checktimeকরে , এটি প্রতি এন সেকেন্ডে চলবে । যদি 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

আমি একটি ছোট প্লাগইন ভিম-অটোরেড তৈরি করেছি যা tail -fব্যাকগ্রাউন্ডে বাফারটিকে সংযোজনীয়ভাবে আপডেট করতে ব্যবহার করে। এটি স্পষ্টতই ভিম সংস্করণ 8 এর কাজের বৈশিষ্ট্য প্রয়োজন।

:AutoReadএটি চালু করতে এবং :AutoRead!এটি বন্ধ করতে ব্যবহার করুন ।


একটি নিওভিম-সামঞ্জস্যপূর্ণ সংস্করণ দুর্দান্ত হবে!
অ্যান্ড্রু

@ অ্যান্ড্রুম্যাকফি আমি দেখতে পাচ্ছি না, কেন এটি নিওভিমের কাজ করবে না।
ক্রিশ্চিয়ান ব্রাবাঁট

নিওভিমে ভিম 8 জব সাপোর্টের অভাব কি ভেবেছিলাম?
অ্যান্ড্রু

@ অ্যান্ড্রুম্যাকফি ওহ সম্ভবত এটি সত্য। যেহেতু আমি নিওভিম ব্যবহার করি না, তাই আমি এটি নিওভিমকে সামঞ্জস্য করতে পারি না। তবে একটি জনসংযোগ স্বাগত হবে :)
ক্রিশ্চিয়ান ব্র্যাব্যান্ড

যথেষ্ট ন্যায্য:)
অ্যান্ড্রু

1

নিওভিমে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন যা টেল কমান্ডটি চালিয়ে একটি টার্মিনাল বাফার খুলবে।

: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

এই উত্তর থেকে ( ফানহাইকিউআং এর উত্তর এবং ফ্লুকাসের একটি মন্তব্যে উল্লেখ করা )

যখন প্রয়োজন হয় তখন প্রাক্তন (whithin vim) থেকে কেউ এই অনেলাইনারটি চালাতে পারেন (বা লগ-ফাইলগুলি যখন খোলা হয় তার জন্য প্রতিটি কমান্ডটি ভিআইএমআরসিতে রাখুন))

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

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

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