<বাফার> এর এই ব্যবহারটি কি সঠিক?
আমি মনে করি এটি সঠিক, তবে আপনাকে কেবল এটি একটি অগ্রুপের মধ্যে আবদ্ধ করতে হবে এবং পরবর্তীটি পরিষ্কার করতে হবে তা নিশ্চিত করার জন্য যে প্রতিবার আপনি একই আদেশে একই বাফারটি পুনরায় লোড করে এমন কোনও আদেশ প্রয়োগ করলে অটোক্যাম্পটি নকল হবে না।
আপনি যেমন ব্যাখ্যা করেছেন, বিশেষ প্যাটার্ন <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
অন্যান্য প্লাগইনগুলি উত্সাহিত হওয়া থেকে রোধ করতে নয়, তবে কিছু সেটিংসের মান সম্পর্কে সর্বশেষ শব্দটি রাখুন।