স্বতঃসিএমডি-তে ইভেন্টগুলি করার কোনও উপায় আছে কি?


21

আমি autocmd দুটি ইভেন্টের উপর একটি ট্রিগার করতে চাই তবে এটি সাধারণত কোনওভাবে হয় না, অর্থাত্ যদি ঘটনাগুলির মধ্যে দুটি ঘটে থাকে তবে একটিটিকে ট্রিগার করুন autocmd। উভয় ঘটনা ঘটলে আমি এটিকে ট্রিগার করতে চাই।

উদাহরণস্বরূপ:
এটি করার স্বাভাবিক উপায়

autocmd BufWrite,BufRead *.c *.py *.h :call StripTrailingWhitespaces()

এই কোডটি বুফউইট বা বুফ্রাইডে স্ট্রিপট্রেইলিংহাইটস্পেস () কল করবে

আমি কিছু করতে চাই:

autocmd Filetype c,cpp,python AND BufWrite :call StripTrailingWhiteSpaces()

অন্য কথায় autcmdযখন ফাইল টাইপ সি, সিপিপি, পাইথনগুলির মধ্যে একটি হয় এবং এই বাফারটিতে লেখার ঘটনা ঘটে তখন তা ট্রিগার করে ।

কোন সাহায্য প্রশংসা করা হয়।

উত্তর:


14

একটি ঘটনা ঘটলে একটি স্বতঃসমান্ত কমান্ড কার্যকর করা হয়। আপনি ইভেন্টগুলির ক্রম হওয়ার পরে একটি আদেশ কার্যকর করতে চান। এটি করার একটি উপায় হ'ল:

autocmd FileType c,cpp,python
    \ autocmd BufWritePre <buffer> call StripTrailingWhiteSpaces()

<buffer>প্যাটার্ন যখন বর্তমান বাফার লেখা আছে autocommand ট্রিগার করা যেতে হতে পারে কারণ। দেখ

:help autocmd-buflocal

হালনাগাদ

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

augroup TrailSpace
    autocmd FileType c,cpp,python
        \ autocmd! TrailSpace BufWritePost <buffer> call SkipTrailingWhiteSpaces()
augroup END

Lcd047 পোস্ট করা উত্তরের অনুরূপ আরেকটি সমাধান, এখন মুছে ফেলা, তা হ'ল ফাইল টাইপ ইভেন্টটি উপস্থিত হওয়ার পরে, 'ফাইল টাইপ' বিকল্পটি সেট করা আছে তা সনাক্ত করা। তারপরে আপনি নিম্নলিখিত ফাইলের মতো 'ফাইল টাইপ' এর মান হিসাবে বুফউইটপোস্ট ইভেন্টের প্রতিক্রিয়াটি শর্ত করতে পারেন। এটির অন্যান্য সমাধানগুলির মধ্যে সুবিধা রয়েছে যা কেবলমাত্র একটি স্বতঃপরিমাণ তৈরি হয়।

autocmd BufWritePre * if count(['c','cpp','python'],&filetype)
    \ | call SkipTrailingWhiteSpaces()
    \ | endif

যদি আমি বর্তমানে খোলার সমস্ত ফাইলগুলিতে এটি চালাতে চাই, অর্থাৎ আমি মৃত্যুদন্ড কার্যকর করি: ওয়া?
ফ্ল্যাশবার্ন

যদি ফাইলগুলি সঠিক ফাইল টাইপ দিয়ে খোলা হয়, FileTypeউত্তরে স্বতঃআকোমডি আপনি ইতিমধ্যে BufWritePreসেভ করার সময় দ্বিতীয় অটোকিমডি ( ) ফায়ার করার জন্য সেট করে রেখেছিলেন ।
ভ্যানলেজার

1
FileTypeজন্য ইচ্ছা আগুন উপরে autocmd যে আপনি সঠিক filetype: সঙ্গে খোলা ফাইল, এবং ইচ্ছা সেটআপ একটি বাফার-স্থানীয় জন্য ইভেন্ট প্রতিটি ঐ ফাইল। সুতরাং আপনি যদি চালনা করেন তবে :waভিমে ফাইল সংরক্ষণের আগে প্রতিটি বাফারের জন্য নিবন্ধিত ইভেন্টগুলি চালানো হবে।
ভ্যানলেজার

1
সুতরাং আপনি যদি 5 পাইথন ফাইলগুলি খোলেন তবে আপনার autocmdলিখিতভাবে একটি এককটির পরিবর্তে 5 টি থাকবে । তারপরে, যদি বলুন যে এইগুলির মধ্যে 3 টি ফাইল লুকিয়ে যায়, তবে আবার প্রদর্শিত হবে FileType, পুনরায় ট্রিগার হবে যাতে আপনি আরও 3 টি autocmdলেখেন, লেখার ক্ষেত্রেও। এটি উজ্জ্বল, আমি কেন এই সমাধানটি নিয়ে আসিনি তা ভাবছি। :)
lcd047

1
পারফরম্যান্স কোনও সমস্যা নয়। stripTrailingWhiteSpaces()একই ফাইলটির বিরুদ্ধে বেশ কয়েকবার ফাংশনটি চালানো হলেও অনিচ্ছাকৃত পরিণতি হতে পারে। এছাড়াও, autocmdএকই ফাইলের জন্য আপনার একই ইভেন্টের জন্য যত বেশি পরিমাণে রয়েছে, ততই আপনি কিছু সত্যিকারের জাতি অবস্থার দিকে ঝুঁকছেন। ধারণা পেতে ভিম_দেব সংরক্ষণাগারগুলি অনুসন্ধান করার চেষ্টা করুন। তারপরে আবার, আমি কী জানি, এটি কেবল আপনার পক্ষে কাজ করবে, তাই না?
lcd047

4

আরও সাধারণভাবে, যদি আপনি না জেনে থাকেন কোন ইভেন্টটি প্রথমে ঘটবে, আপনি যখন একজন প্রত্যেকে আগুন জ্বলবেন তখন ট্র্যাক করতে কোনও সহায়ক ব্যবহার করতে পারেন এবং শেষটি যখন আগুন জ্বলে তখন কেবল আপনার আদেশটি কার্যকর করে:

function StripTrailingWhiteSpacesIfReady(event) abort
  if !exists('b:events_for_whitespace')
    let b:events_for_whitespace = {}
  endif
  let b:events_for_whitespace[a:event] = 1
  if has_key(b:events_for_whitespace, 'FileType') && has_key(b:events_for_whitespace, 'Buf')
    " Strip trailing whitespace
    %s/\m\s\+$//
  endif
endfunction
autocmd Filetype c,cpp,python call StripTrailingWhiteSpacesIfReady('FileType')
autocmd BufWrite,BufRead * StripTrailingWhiteSpacesIfReady('Buf')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.