ফ্লাইতে অগ্রুপকে কীভাবে সক্ষম / অক্ষম করবেন?


13

আমি augroupআমার .vimrcবেশ কয়েকটিতে একটি তৈরি করেছি autocmdএবং আমাকে এগুলি ফ্লাইতে সক্ষম / অক্ষম করতে autocommandহবে।

ধারণাটি হ'ল একটি ম্যাপিং তৈরি করা যাক ( F4উদাহরণস্বরূপ বলা যাক ) যা একবার চাপলে এই অটোমন্ডমগুলি সক্ষম করে এবং কোনও ফাইল উত্স না করে বা পুনরায় লোড না করে আবার চাপা দেওয়ার পরে এগুলি অক্ষম করে .vimrc

আমি এটা কিভাবে করবো?

উত্তর:


17

আপনার উত্তরের উপর ভিত্তি করে: আপনার রাষ্ট্রের অবস্থা ধরে রাখতে আপনার একটি পরিবর্তনশীলের দরকার নেই augroup, আপনি এটির exists()জন্য ব্যবহার করতে পারেন , তবে আপনি যদি autocmdগ্রুপের অন্তত একটির কমপক্ষে একটির জানেন তবে :

function! ToggleTestAutoGroup()
    if !exists('#TestAutoGroup#BufEnter')
        augroup TestAutoGroup
            autocmd!
            autocmd BufEnter   * echom "BufEnter " . bufnr("%")
            autocmd BufLeave   * echom "BufLeave " . bufnr("%")
            autocmd TabEnter   * echom "TabEnter " . tabpagenr()
            autocmd TabLeave   * echom "TabLeave " . tabpagenr()
        augroup END
    else
        augroup TestAutoGroup
            autocmd!
        augroup END
    endif
endfunction

nnoremap <F4> :call ToggleTestAutoGroup()<CR>

আরে এটিকে উন্নত করার দুর্দান্ত উপায়! আমি জানতাম না যে আপনি এটি করতে পারেন।
স্ট্যাটক্স

1
আপনি গোষ্ঠীটিকে 2 ভাগে বিভক্ত করতে এবং শুরুতে নিঃশর্ত elseচালিয়ে শাখাটি সরিয়ে ফেলতে পারেন autocmd!
ভ্যানলেজার

@ ভ্যানল্যাসার আপনি কি সেভাবে করার চেষ্টা করেছেন? ইঙ্গিত: কি exists('#TestAutoGroup#BufEnter')পরে ফিরে আসবে autocmd!?
সাতো কাতসুরা


1
@ ভ্যানলেজার এবং তারপরে আপনি সেই অপারেশনটিকে রাষ্ট্রবিহীন করতে পারেন, সেই বৈশ্বিক পরিবর্তনশীল থেকে মুক্তি পেয়ে। সম্ভবত একটি ফাংশন আছে যে যত্ন নিতে পারে। এই ফাংশনটির প্রয়োজন হতে পারে ... নিজস্ব। ঠিক। :)
সাতো ক্যাটসুর

9

(আমি আসলে এটি নিজে নিজেই বের করেছিলাম কিন্তু এই সাইটে কোনও উত্তর খুঁজে না পাওয়ায় আমি ভেবেছিলাম যে একটি স্ব-উত্তরযুক্ত প্রশ্ন তৈরি করা উপকারী হতে পারে )

এটি করার জন্য নিম্নলিখিত ফাংশনটি তৈরি করা এবং এটিতে রাখা সম্ভব .vimrc:

function! ToggleTestAutoGroup()
    if !exists('g:TestAutoGroupMarker')
        let g:TestAutoGroupMarker = 1
    endif

    " Enable if the group was previously disabled
    if (g:TestAutoGroupMarker == 1)
        let g:TestAutoGroupMarker = 0

        " actual augroup
        augroup TestAutoGroup
            autocmd! BufEnter   * echom "BufEnter " . bufnr("%")
            autocmd! BufLeave   * echom "BufLeave " . bufnr("%")
            autocmd! TabEnter   * echom "TabEnter " . tabpagenr()
            autocmd! TabLeave   * echom "TabLeave " . tabpagenr()
        augroup END
    else    " Clear the group if it was previously enabled
        let g:TestAutoGroupMarker = 1

        " resetting the augroup
        augroup TestAutoGroup
            autocmd!
        augroup END
    endif
endfunction

ফাংশনটি গ্রুপটি আগে সক্রিয় ছিল কি না তা নির্ধারণ করতে ব্যবহৃত একটি ভেরিয়েবল তৈরি করে।

যখন এটি সক্ষম করা হয়নি, গোষ্ঠীটি ওয়ান্টিকোম্যান্ডস চেয়েছিল with গোষ্ঠীটি আগে সক্ষম থাকলে আমরা autocmd!এটি "পুনরায় সেট করতে" অর্থাত্ এর মধ্যে পূর্বে প্রবেশ করা কমান্ডটি মোছা ব্যবহার করি।

একটি প্রাসঙ্গিক ডকুমেন্টেশন এখানে

অবশেষে ফলোভিং ম্যাপিং তৈরি করা সম্ভব:

nnoremap <F4> :call ToggleTestAutoGroup()<CR>

F4ফাংশন কল করতে ব্যবহার করতে।

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

এখানে কার্লের উন্নত ফাংশন, তাকে অনেক ধন্যবাদ:

function! ToggleTestAutoGroup()
    " Switch the toggle variable
    let g:TestAutoGroupToggle = !get(g:, 'TestAutoGroupToggle', 1)

    " Reset group
    augroup TestAutoGroup
        autocmd!
    augroup END

    " Enable if toggled on
    if g:TestAutoGroupToggle
        augroup TestAutoGroup
            autocmd! BufEnter   * echom "BufEnter " . bufnr("%")
            autocmd! BufLeave   * echom "BufLeave " . bufnr("%")
            autocmd! TabEnter   * echom "TabEnter " . tabpagenr()
            autocmd! TabLeave   * echom "TabLeave " . tabpagenr()
        augroup END
    endif
endfunction

এই সংস্করণে গোষ্ঠীটি সর্বদা পুনরায় সেট করা থাকে এবং যদি এটি সক্ষম না করা হয় তবে এটি ওয়ান্টিকোমন্ডমগুলি চেয়েছিল


7

আমি সহজ উপায়টি গ্লোবাল ভেরিয়েবল ব্যবহার করা সন্ধান করি। উদাহরণ:

augroup TestAutoGroup
  autocmd!
  autocmd BufEnter * |
        \ if get(g:, 'toggle_autocmd', 1) |
        \   echom "BufEnter " . bufnr("%") |
        \ endif
augroup END

nnoremap <f4> :<c-u>let g:toggle_autocmd = !get(g:, 'toggle_autocmd', 1)<cr>

আরও সহায়তার জন্য দেখুন:

:h g:
:h get()
:h :if
:h :bar
:h line-continuation

আপনি কেন এটি সহজ উপায় বলে মনে করছেন তা আমি নিশ্চিত তা নিশ্চিত নই: আমি কোনও ভিমস্প্রিপ্ট মাস্টার নই তাই আপনার বাক্য গঠনটি আমার কাছে একটু বেশিই জড়িত বলে মনে হচ্ছে। আপনার পদ্ধতির সুবিধা কি?
স্ট্যাটক্স

পেশাদাররা: 1) কোন ফাংশন। 2) সহজেই গ্লোবাল ভেরিয়েবলের পরিবর্তে বাফার / উইন্ডো লোকাল ভেরিয়েবলগুলি ব্যবহার করতে অভিযোজিত হতে পারে। 3) সাধারণ ম্যাপিং
পিটার রিনকার

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