Ftplugin এ একটি অটোকএমডির জন্য, আমি কি প্যাটার্ন ম্যাচিং বা <বাফার> ব্যবহার করব?


14

ফাইলটি স্বয়ংক্রিয়ভাবে সংরক্ষণ করার জন্য আমার কাছে টেক্স এবং মার্কডাউন ফাইলের জন্য একটি অটোকিমডি আছে। অস্বাভাবিক কিছু নয়:

autocmd CursorHold *.tex,*.md w

যাইহোক, এই ফাইলগুলির জন্য কাস্টম সেটিংস বাড়ার সাথে সাথে আমি এগুলিকে বিভক্ত করে ftplugin/tex.vimএবং ftplugin/markdown.vim:

" ftplugin/tex.vim
autocmd CursorHold *.tex w
" ftplugin/markdown.vim
autocmd CursorHold *.md w

এখন, এই ফাইলগুলি কেবল উপযুক্ত ফাইলগুলির জন্য উত্সাহিত করা হয়, সুতরাং প্যাটার্নটির মিলটি অপ্রয়োজনীয়। স্পষ্টতই, autocmds গুলি বাফার-লোকাল হতে পারে। থেকে :h autocmd-buffer-local:

Buffer-local autocommands are attached to a specific buffer.  They are useful
if the buffer does not have a name and when the name does not match a specific
pattern.  But it also means they must be explicitly added to each buffer.

Instead of a pattern buffer-local autocommands use one of these forms:
        <buffer>        current buffer
        <buffer=99>     buffer number 99
        <buffer=abuf>   using <abuf> (only when executing autocommands)
                        <abuf>

এটি এমন ব্যবহারের জন্য বোঝানো বলে মনে হচ্ছে। এখন ftplugin/tex.vimএবং উভয়ই ftplugin/markdown.vimথাকতে পারে:

autocmd CursorHold <buffer> w

আমি সত্যিই, তাই এই আমার জন্য চিন্তা করা থেকে রক্ষা করে যতদিন filetype: সঠিক যেমন প্রকৃত এক্সটেনশন সম্পর্কে উদ্বিগ্ন *.mdএবং *.markdownএবং যাই হোক না কেন অন্য এক্সটেনশন Markdown জন্য বৈধ।

এই ব্যবহার কি <buffer>সঠিক? আমার কি এমন কোনও সমস্যা রয়েছে যা সম্পর্কে সচেতন হওয়া উচিত? আমি কোনও বাফার মুছলে এবং অন্যটি খুললে কী জিনিসগুলি অগোছালো হবে (আশা করি সংখ্যাগুলি সংঘর্ষে না ঘটবে, তবে…)?


1
আমি নিশ্চিত আপনি যদি কোনও বাফার মুছেন তবে যে কোনও বাফার-লোকাল অটোক্যাম্ডসও মুছে যাবে।
গলদলে

@ টাম্বলার 41 সত্যিই এটি সাহায্যে কিছু অনুচ্ছেদে বলে দেয়।
মুড়ু

1
আপনি যা চেয়েছিলেন ঠিক তেমন নয়, তবে up(অল্প সংক্ষেপে :update) wআপনার অটোসিএমডির চেয়ে ভাল হবে (অপ্রয়োজনীয় লেখাগুলি এড়িয়ে চলুন)।
এমমন্টু

@ এম মন্টু নিস এমনকি গিট ইতিহাস থেকে পরীক্ষা করা একটি ফাইলের জন্য যখন অটোকএমডি সক্রিয় করা হয়েছিল তখন এটি আমার একটি সমস্যাও সমাধান করে। বাফারটি কেবল পঠনযোগ্য ছিল এবং wব্যর্থ হয়েছিল। পুনঃপুনঃ. :upসেক্ষেত্রে কিছুই করবেন না। :)
মুড়ু

আপনি পছন্দ করেছেন খুশি :) ঘটনাক্রমে, আপনি 'অটোরেইট' বিকল্পটিও দরকারী খুঁজে পেতে পারেন (আপনার প্রেরণার উপর নির্ভর করে আপনি অটোমডিএস ফেলে দিতে পারেন)।
এম মন্টু

উত্তর:


11

<বাফার> এর এই ব্যবহারটি কি সঠিক?

আমি মনে করি এটি সঠিক, তবে আপনাকে কেবল এটি একটি অগ্রুপের মধ্যে আবদ্ধ করতে হবে এবং পরবর্তীটি পরিষ্কার করতে হবে তা নিশ্চিত করার জন্য যে প্রতিবার আপনি একই আদেশে একই বাফারটি পুনরায় লোড করে এমন কোনও আদেশ প্রয়োগ করলে অটোক্যাম্পটি নকল হবে না।

আপনি যেমন ব্যাখ্যা করেছেন, বিশেষ প্যাটার্ন <buffer>আপনাকে ফাইলের ভিতরে প্রয়োগ করা বিল্ট-ইন ফাইল টাইপ সনাক্তকরণ ব্যবস্থার উপর নির্ভর করতে দেয় $VIMRUNTIME/filetype.vim

এই ফাইলে, আপনি ভিমের অন্তর্নির্মিত অটোকিম্ডসটি খুঁজে পেতে পারেন যা কোনও প্রদত্ত বাফারের জন্য সঠিক ফাইল টাইপ সেট করার জন্য দায়বদ্ধ। উদাহরণস্বরূপ, মার্কডাউন করার জন্য:

" Markdown
au BufNewFile,BufRead *.markdown,*.mdown,*.mkd,*.mkdn,*.mdwn,*.md  setf markdown

আপনার ফাইল টাইপ প্লাগইনের ভিতরে, আপনি ইনস্টল করা প্রতিটি স্বতঃআ.সি.এম. জন্য একই প্যাটার্নগুলি অনুলিপি করতে পারেন। উদাহরণস্বরূপ, যখন আপনার কার্সারটি কয়েক সেকেন্ডের মধ্যে সরানো হয়নি তখন স্বয়ংক্রিয়ভাবে বাফারটি সংরক্ষণ করতে:

au CursorHold *.markdown,*.mdown,*.mkd,*.mkdn,*.mdwn,*.md  update

তবে <buffer>উপায়টি কম কম:

au CursorHold <buffer> update

তদ্ব্যতীত, যদি কোনও দিন অন্য এক্সটেনশন বৈধ হয় এবং $VIMRUNTIME/filetype.vimএটি অন্তর্ভুক্ত করার জন্য আপডেট করা হয়, তবে আপনার অটোকমিডগুলি অবহিত হবে না। এবং আপনার ফাইল টাইপ প্লাগইনগুলির মধ্যে তাদের সমস্ত নিদর্শন আপডেট করতে হবে।


আমি যদি একটি বাফার মুছতে এবং অন্যটি খুলি তবে কি জিনিসগুলি অগোছালো হবে (আশা করি সংখ্যাগুলি সংঘর্ষে না ঘটবে, তবে…)?

আমি নিশ্চিত নই তবে আমি মনে করি না যে ভিম মুছে যাওয়া বাফারের বাফার নম্বরটি আবার ব্যবহার করতে পারে। সহায়তা থেকে প্রাসঙ্গিক বিভাগটি আমি খুঁজে পাইনি, তবে আমি এই অনুচ্ছেদটি vim.wikia.com থেকে পেয়েছি :

না। ভিম কোনও নতুন বাফারের জন্য মুছে ফেলা বাফারের বাফার নম্বরটি পুনরায় ব্যবহার করবে না। ভিম সর্বদা একটি নতুন বাফার জন্য পরবর্তী ক্রমিক নম্বর বরাদ্দ করবে।

এছাড়াও, @ টাম্বলার 41 যেমন ব্যাখ্যা করেছেন, আপনি যখন একটি বাফার মুছবেন তখন এর অটোকিম্ডস সরানো হবে। থেকে :h autocmd-buflocal:

যখন কোনও বাফারটি নিশ্চিহ্ন হয়ে যায় তখন অবশ্যই তার বাফার-স্থানীয় অটোকম্যান্ডগুলি অবশ্যই চলে যায়।

আপনি যদি নিজের যাচাই করতে চান, আপনি ভিমের ভার্বোসটি স্তরটি 6-এ বাড়িয়ে এটি করতে পারেন আপনি কেবলমাত্র একটি আদেশের জন্য, :verboseমোডিফায়ারটি ব্যবহার করে এটি সাময়িকভাবে করতে পারেন । সুতরাং, আপনার মার্কডাউন বাফারের ভিতরে আপনি কার্যকর করতে পারেন:

:6verbose bwipe

তারপরে, আপনি যদি ভিমের বার্তাটি পরীক্ষা করেন:

:messages

আপনার দেখতে এমন একটি লাইন দেখা উচিত:

auto-removing autocommand: CursorHold <buffer=42>

42আপনার মার্কডাউন বাফারের নম্বরটি কোথায় ছিল।


আমার কি এমন কোনও সমস্যা রয়েছে যা সম্পর্কে সচেতন হওয়া উচিত?

3 পরিস্থিতিতে যা আমি ফাঁদ যেমন বিবেচনা করবে এবং যা বিশেষ প্যাটার্ন জড়িত আছে <buffer>। এর মধ্যে দুটি ক্ষেত্রে, <buffer>এটি একটি সমস্যা হতে পারে, অন্যটিতে এটি একটি সমাধান।

বিপত্তি ঘ

প্রথমত, আপনি আপনার বাফার-লোকাল অটোকমিডসের অগ্রুপগুলি কীভাবে সাফ করবেন সে সম্পর্কে আপনার সাবধানতা অবলম্বন করা উচিত। আপনার অবশ্যই এই স্নিপেটের সাথে পরিচিত হতে হবে:

augroup your_group_name
    autocmd!
    autocmd Event pattern command
augroup END

সুতরাং, আপনি এটি আপনার বাফার-স্থানীয় অটোমডিএসের জন্য, মোডবিহীন পরিবর্তনের জন্য ব্যবহার করার জন্য প্রলুব্ধ হতে পারেন:

augroup my_markdown
    autocmd!
    autocmd CursorHold <buffer> update
augroup END

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

এখন, ধরুন আপনি একটি ২ য় মার্কডাউন বাফার লোড করেন B, এটি একটি দ্বিতীয় উইন্ডোতে কল করুন call অগ্রুপের সমস্ত স্বতঃআরঙ্কগুলি সাফ হয়ে যাবে: এটি হ'ল অটোকোমড Aএবং এর একটি B। তারপরে, এর জন্য একটি সিঙ্গেল অটোকিমডি ইনস্টল করা হবে B

সুতরাং, আপনি যখন কিছু পরিবর্তন করেন Bএবং CursorHoldবহিস্কারের জন্য কয়েক সেকেন্ড অপেক্ষা করেন , এটি স্বয়ংক্রিয়ভাবে সংরক্ষণ করা হবে। তবে আপনি যদি আবার Aএকই জিনিসটি করেন এবং বাফারটি সংরক্ষণ করা হবে না। এটি কারণ আপনি শেষবার মার্কডাউন বাফারটি লোড করেছিলেন, আপনি কী সরিয়েছেন এবং কী যুক্ত করেছেন তার মধ্যে ভারসাম্যহীনতা ছিল। আপনি যা যুক্ত করেছেন তার চেয়ে বেশি আপনি সরিয়ে দিয়েছেন।

সমাধানটি হ'ল সমস্ত অটোক্যাম্ডস সরিয়ে না দেওয়া, কেবলমাত্র বর্তমান বাফারগুলির মধ্যে বিশেষ প্যাটার্নটি এখানে <buffer>রেখে :autocmd!:

augroup my_markdown
    autocmd! CursorHold <buffer>
    autocmd CursorHold <buffer> update
augroup END

নোট করুন যে আপনি CursorHoldঅটোকিম্ডস সরিয়ে রেখার যে কোনও ইভেন্টের সাথে মেলে তারার সাথে প্রতিস্থাপন করতে পারেন :

augroup my_markdown
    autocmd! * <buffer>
    autocmd CursorHold <buffer> update
augroup END

আপনি যখন অগ্রুপটি সাফ করতে চান তখন আপনাকে নিজের ইভেন্টগুলি শোনার জন্য সমস্ত ইভেন্ট নির্দিষ্ট করতে হবে না।


পিটফল 2

আরও একটি সমস্যা রয়েছে, তবে এই সময়টি <buffer>সমস্যা নয়, এটি সমাধান।

আপনি যখন কোনও ফাইল টাইপ প্লাগইনে কোনও স্থানীয় বিকল্প অন্তর্ভুক্ত করেন, আপনি সম্ভবত এটি এটি করেন:

setlocal option1=value
setlocal option2

এটি বাফার-স্থানীয় বিকল্পগুলির জন্য প্রত্যাশার মতো কাজ করবে তবে উইন্ডো-স্থানীয়গুলির ক্ষেত্রে সর্বদা নয়। সমস্যাটি বর্ণনা করার জন্য, আপনি নিম্নলিখিত পরীক্ষার চেষ্টা করতে পারেন। ফাইলটি তৈরি করুন ~/.vim/after/ftdetect/potion.vimএবং এর ভিতরে লিখুন:

autocmd BufNewFile,BufRead *.pn setfiletype potion

potionযার এক্সটেনশন হ'ল এই ফাইলটি স্বয়ংক্রিয়ভাবে ফাইল টাইপ সেট করবে .pn। আপনাকে এটিকে একটি অগ্রুপের মধ্যে আবদ্ধ করার দরকার নেই কারণ এই বিশেষ ধরণের ফাইলের জন্য, ভিম এটি স্বয়ংক্রিয়ভাবে করবে (দেখুন :h ftdetect)।

যদি আপনার সিস্টেমে মধ্যবর্তী ডিরেক্টরি উপস্থিত না থাকে তবে আপনি সেগুলি তৈরি করতে পারেন।

এরপরে, ফাইল টাইপ প্লাগইন তৈরি করুন ~/.vim/after/ftplugin/potion.vimএবং এর ভিতরে লিখুন:

setlocal list

ডিফল্টরূপে, একটি potionফাইলে, এই সেটিংটি ট্যাব অক্ষরগুলি হিসাবে প্রদর্শিত হবে ^Iএবং লাইনগুলির শেষ হিসাবে $

এখন, একটি ন্যূনতম তৈরি করুন vimrc; ভিতরে /tmp/vimrcলিখুন:

filetype plugin on

... ফাইল টাইপ প্লাগইন সক্ষম করতে।

এছাড়াও, একটি দমন ফাইল /tmp/pn.pnএবং একটি এলোমেলো ফাইল তৈরি করুন /tmp/file। দোহাই ফাইলটিতে কিছু লিখুন:

foo
bar
baz

এলোমেলো ফাইলে, দাহ ফাইলে যাওয়ার পথটি লিখুন /tmp/pn.pn:

/tmp/pn.pn

এখন, সর্বাধিক সরিসিং করে, সর্বনিম্ন সূচনা দিয়ে ভিম শুরু করুন vimrcএবং উভয় ফাইল উল্লম্ব ভিউপোর্টে খুলুন:

$ vim -Nu /tmp/vimrc -O /tmp/pn.pn /tmp/file

আপনার 2 টি উল্লম্ব ভিউপোর্টগুলি দেখতে হবে। বাম দিকের দমন ফাইলটি ডলারের চিহ্ন সহ লাইনগুলির শেষ প্রদর্শন করে, ডানদিকে এলোমেলো ফাইল এগুলি একেবারেই প্রদর্শন করে না।

এলোমেলো ফাইলটিতে ফোকাস দিন এবং gfদমন ফাইলটি প্রদর্শন করতে টিপুন যার কার্সারের অধীনে রয়েছে। আপনি এখন একই ভিউ বাফারটি সঠিক ভিউপোর্টে দেখতে পাচ্ছেন, তবে এবার ডলারের চিহ্ন সহ লাইনগুলির শেষ প্রদর্শিত হবে না। এবং আপনি যদি টাইপ করেন তবে :setlocal list?ভিমের সাথে উত্তর দেওয়া উচিত nolist:

এখানে চিত্র বর্ণনা লিখুন

ইভেন্টগুলির সম্পূর্ণ শৃঙ্খলা:

BufRead event → set 'filetype' option → load filetype plugins

... ঘটেনি, কারণ BufReadআপনি যখন চাপ দিয়েছিলেন তখন তাদের মধ্যে প্রথমটি ঘটেনি gf। বাফারটি ইতিমধ্যে লোড হয়েছে।

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

সমস্যাটি এই নতুন potionফাইল টাইপের সাথে সুনির্দিষ্ট নয় । আপনি এটি একটি markdownফাইলের সাথেও অভিজ্ঞতা করতে পারেন ।

এটি 'list'বিকল্পের সাথে নির্দিষ্টও নয় । আপনি অন্য উইন্ডো-স্থানীয় সেটিংস সঙ্গে এটি অনুভব করতে পারেন, মত 'conceallevel', 'foldmethod', 'foldexpr', 'foldtitle', ...

এটি gfকমান্ডের সাথেও নির্দিষ্ট নয় । আপনি এটি অন্যান্য কমান্ডের সাহায্যে অনুভব করতে পারেন যা বর্তমান উইন্ডোতে প্রদর্শিত বাফারকে বদলে দিতে পারে: বিশ্বব্যাপী চিহ্ন, C-o(উইন্ডো-স্থানীয় জাম্পলিস্টে পিছনে সরানো) :b {buffer_number}, ...

সংক্ষিপ্তসার হিসাবে, উইন্ডো-স্থানীয় বিকল্পগুলি সঠিকভাবে সেট করা হবে, যদি এবং কেবল যদি:

  • ফাইলটি বর্তমান ভিম সেশনের সময় পড়েনি (কারণ BufReadবহিষ্কার করতে হবে)
  • ফাইলটি একটি উইন্ডোতে প্রদর্শিত হচ্ছে যেখানে উইন্ডো-স্থানীয় বিকল্পগুলি ইতিমধ্যে সঠিকভাবে সেট করা ছিল
  • নতুন উইন্ডোটি একটি কমান্ড দিয়ে তৈরি করা হয়েছে যেমন :split(এই ক্ষেত্রে, এটি উইন্ডোটি যেখানে উইন্ডোটি কমান্ডটি কার্যকর হয়েছিল তার উইন্ডো-স্থানীয় বিকল্পগুলির উত্তরাধিকারী হওয়া উচিত)

অন্যথায়, উইন্ডো-স্থানীয় বিকল্পগুলি সঠিকভাবে সেট নাও হতে পারে।

এগুলির সম্ভাব্য সমাধান হ'ল এগুলি সরাসরি কোনও ফাইল টাইপ প্লাগইন থেকে নয়, তবে পরবর্তীকালে ইনস্টল করা একটি অটোক্যাসিড থেকে, যা শুনবে BufWinEnter। এই ইভেন্টটি যখনই একটি উইন্ডোতে কোনও বাফার প্রদর্শিত হবে তখনই তা বরখাস্ত করা উচিত।

সুতরাং, উদাহরণস্বরূপ, এটি লেখার পরিবর্তে:

setlocal list

আপনি এই লিখতে হবে:

augroup my_potion
    au! * <buffer>
    au BufWinEnter <buffer> setlocal list
augroup END

এবং এখানে, আপনি আবার বিশেষ প্যাটার্নটি খুঁজে পাবেন <buffer>

এখানে চিত্র বর্ণনা লিখুন


পিটফল 3

আপনি যদি নিজের বাফারের ফাইল টাইপ পরিবর্তন করেন তবে অটোকিম্ডগুলি থাকবে। আপনি যদি এগুলি সরাতে চান, আপনার কনফিগার করতে হবে b:undo_ftplugin(দেখুন :h undo_ftplugin) এবং এতে এই আদেশটি অন্তর্ভুক্ত করুন:

exe 'au! my_markdown * <buffer>'

তবে, অগ্রুপটি নিজেই সরিয়ে দেওয়ার চেষ্টা করবেন না, কারণ এরপরে এখনও কিছু মার্কডাউন বাফার থাকতে পারে যার অভ্যন্তরে অটোকিম্ড রয়েছে।

এফডাব্লুআইডাব্লু, এটি হ'ল আলটিসনিপস স্নিপেট যা আমি সেট করতে ব্যবহার করছি b:undo_ftplugin:

snippet undo "undo ftplugin settings" bm
" teardown {{{1

let b:undo_ftplugin =         get(b:, 'undo_ftplugin', '')
\                     .(empty(get(b:, 'undo_ftplugin', '')) ? '' : '|')
\                     ."${1:
\                          setl ${2:option}<}${3:
\                        | exe '${4:n}unmap <buffer> ${5:lhs}'}${6:
\                        | exe 'au! ${7:group_name} * <buffer>'}${8:
\                        | unlet! b:${9:variable}}${10:
\                        | delcommand ${11:Cmd}}
\                      "
$0
endsnippet

এবং এখানে আমি মূল্য আছে যা একটি উদাহরণ ~/.vim/after/ftplugin/awk.vim:

let b:undo_ftplugin =         get(b:, 'undo_ftplugin', '')
                    \ .(empty(get(b:, 'undo_ftplugin', '')) ? '' : '|')
                    \ ."
                    \   setl cms< cocu< cole< fdm< fdt< tw<
                    \|  exe 'nunmap <buffer> K'
                    \|  exe 'au! my_awk * <buffer>'
                    \|  exe 'au! my_awk_format * <buffer>'
                    \  "

পার্শ্ব নোট হিসাবে, আপনি কেন প্রশ্নটি জিজ্ঞাসা করেছেন তা আমি বুঝতে পেরেছি, কারণ যখন আমি সমস্ত রেখার সন্ধান করলাম যেখানে <buffer>ভিমের ডিফল্ট ফাইলগুলিতে বিশেষ প্যাটার্ন ব্যবহৃত হয়েছিল:

:vim /au\%[tocmd!].\{-}<buffer>/ $VIMRUNTIME/**/*

আমি কেবল 9 টি ম্যাচ পেয়েছি (আপনি কম বেশি খুঁজে পেতে পারেন, আমি ভিচ সংস্করণ 8.0 ব্যবহার করছি, প্যাচগুলি পর্যন্ত 134) with 9 টি ম্যাচের মধ্যে 7 টি ডকুমেন্টেশনের মধ্যে রয়েছে, কেবল 2 টি আসলে স্রোসযুক্ত। আপনি তাদেরকে খুঁজে উচিত $ VIMRUNTIME / সিনট্যাক্স / dircolors.vim :

autocmd CursorMoved,CursorMovedI <buffer> call s:preview_color('.')
autocmd CursorHold,CursorHoldI   <buffer> call s:reset_colors()

আমি যদি এটা একটি বিষয় হতে পারে জানি না, কিন্তু তারা একটি augroup, যা প্রত্যেক সময় আপনি একটি বাফার যার filetype: হয় পুনরায় লোড মানে ভিতরে নয় dircolors(এটা কিছু ঘটে তাহলে আপনি নামের একটি ফাইল সম্পাদনা .dircolors, .dir_colorsবা যার সাথে পথ প্রান্ত /etc/DIR_COLORS), সিনট্যাক্স প্লাগইন একটি নতুন বাফার-লোকাল অটোমোডি যোগ করবে।

আপনি এটি এটি পরীক্ষা করতে পারেন:

$ vim ~/.dir_colors
:au * <buffer>

শেষ কমান্ড এটি প্রদর্শিত হবে:

CursorHold
    <buffer=1>
              call s:reset_colors()
CursorHoldI
    <buffer=1>
              call s:reset_colors()
CursorMoved
    <buffer=1>
              call s:preview_color('.')
CursorMovedI
    <buffer=1>
              call s:preview_color('.')

এখন, বাফারটি পুনরায় লোড করুন এবং বর্তমান বাফারের জন্য বাফার-স্থানীয় অটোমকডগুলি আবার কী তা জিজ্ঞাসা করুন:

:e
:au * <buffer>

এবার আপনি দেখতে পাবেন:

CursorHold
    <buffer=1>
              call s:reset_colors()
              call s:reset_colors()
CursorHoldI
    <buffer=1>
              call s:reset_colors()
              call s:reset_colors()
CursorMoved
    <buffer=1>
              call s:preview_color('.')
              call s:preview_color('.')
CursorMovedI
    <buffer=1>
              call s:preview_color('.')
              call s:preview_color('.')

ফাইল প্রতিটি পুনরায় লোড পর s:reset_colors()এবং s:preview_color('.')একটি অতিরিক্ত সময় বলা হবে, ঘটনা প্রতিটি সময় এক CursorHold, CursorHoldI, CursorMoved, CursorMovedIবহিস্কার করা হয়।

এটি সম্ভবত কোনও বড় সমস্যা নয়, কারণ dircolorsবেশ কয়েকবার একটি ফাইল পুনরায় লোড করার পরেও আমি ভিমের কাছ থেকে কোনও লক্ষণীয় মন্দা বা অপ্রত্যাশিত আচরণ দেখিনি।

যদি এটি আপনার পক্ষে সমস্যা হয় তবে আপনি সিনট্যাক্স প্লাগইন রক্ষণাবেক্ষণকারীকে যোগাযোগ করতে পারেন, তবে ইতিমধ্যে আপনি যদি অটোকিমিডসের সদৃশতা প্রতিরোধ করতে চান তবে আপনি dircolorsফাইলটি ব্যবহার করে আপনার নিজস্ব সিনট্যাক্স প্লাগইন তৈরি করতে পারেন ~/.vim/syntax/dircolors.vim। এর অভ্যন্তরে আপনি মূল সিনট্যাক্স প্লাগইনটির সামগ্রী আমদানি করবেন:

$ vim ~/.vim/syntax/dircolors.vim
:r $VIMRUNTIME/syntax/dircolors.vim

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

autocmd CursorMoved,CursorMovedI <buffer> call s:preview_color('.')
autocmd CursorHold,CursorHoldI   <buffer> call s:reset_colors()

... এইগুলি সহ:

augroup my_dircolors_syntax
    autocmd! * <buffer>
    autocmd CursorMoved,CursorMovedI <buffer> call s:preview_color('.')
    autocmd CursorHold,CursorHoldI   <buffer> call s:reset_colors()
augroup END

নোট করুন যে আপনি যদি dircolorsফাইলটি দিয়ে আপনার সিনট্যাক্স প্লাগইন তৈরি করেন তবে ~/.vim/after/syntax/dircolors.vimএটি কার্যকর হবে না, কারণ ডিফল্ট সিনট্যাক্স প্লাগইনটি আগে উত্সাহিত হত। ব্যবহার করে ~/.vim/syntax/dircolors.vimআপনার সিনট্যাক্স প্লাগইনটি ডিফল্টের আগে তৈরি হয়ে যাবে এবং এটি বাফার-লোকাল ভেরিয়েবল সেট b:current_syntaxকরবে যা ডিফল্ট সিনট্যাক্স প্লাগইনটিকে উত্সাহিত হতে বাধা দেবে কারণ এতে এই রক্ষকটি রয়েছে:

if exists("b:current_syntax")
    finish
endif

সাধারণ নিয়মটি মনে হয়: একটি কাস্টম ফাইল টাইপ / সিনট্যাক্স প্লাগইন তৈরি করতে ~/.vim/ftpluginএবং ~/.vim/syntaxডিরেক্টরিগুলি ব্যবহার করুন এবং রানটাইম পথে পরবর্তী প্লাগইন (একই ফাইল টাইপের জন্য) সর্স করার জন্য (ডিফল্টগুলি সহ) প্রতিরোধ করুন। এবং ব্যবহার করুন ~/.vim/after/ftplugin, ~/.vim/after/syntaxঅন্যান্য প্লাগইনগুলি উত্সাহিত হওয়া থেকে রোধ করতে নয়, তবে কিছু সেটিংসের মান সম্পর্কে সর্বশেষ শব্দটি রাখুন।


1
আমি আশা করি আমি আরও শক্ত করে উঠতে পারতাম।
ধনী

3
@ সমৃদ্ধ আমি আপনার জন্য এটি আরও শক্তিশালী করে তুলেছি। আমার একমাত্র অভিযোগ হ'ল সংক্ষিপ্তসার "tl; dr" এর অভাব। পাঠ্য মিনুটিয়ার পৃষ্ঠাগুলি, যদিও বোঝার পক্ষে অত্যাবশ্যক, আমার বয়সের আত্মাকে বেদনাতে বেঁধে দেয়। প্রতিস্থাপন autocmd!সঙ্গে autocmd! CursorHold <buffer>augroupব্লক একটি বিশেষ সমালোচনামূলক gotcha হয় - এবং আপফ্রন্ট হাইলাইট করা উচিত ছিল। তবুও ... এটি সময়, প্রচেষ্টা এবং রক্তাক্ত অশ্রুগুলির একটি স্পষ্টভাবে আশ্চর্যজনক বিনিয়োগ।
সিসিল কারি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.