ভিমে কীভাবে পূর্বাবস্থায় ফিরে আসবেন?


11

আমি যখন আঘাত করব তখন কোনও কোনও সময়ে আমার ভিম একটি সম্পূর্ণ শব্দটি পূর্বাবস্থায় ফেরত দেবে u

[i]typing some words[C-c][u]

ফলাফল হবে

typing some

তবে, পূর্বাবস্থায় ফিরে আসা গ্র্যানুলারিটি একবারে একটি করে চিঠি মুছতে পরিবর্তিত হয়েছে বলে মনে হয়।

[i]typing some words[C-c][u]

ফলাফল স্বরূপ

typing some word

আমি প্রাকটিকাল ভিমে পূর্বাবস্থায় ফিরে আসা গ্রানুলারিটি সম্পর্কে কিছু পড়ার কথা মনে করি তবে কীভাবে এটি নিয়ন্ত্রণ করতে হয় তা মনে করতে পারি না। কোন সাহায্য প্রশংসা!


2
আপনার ভিএমআরসি-তে সম্ভবত এমন কিছু রয়েছে যা এটি করে। আমি এটির অনুলিপি করতে পারি না, এবং এটি সম্পর্কিত :helpফাইলগুলিতে কিছুই খুঁজে পাচ্ছি না ... দেখুন: আমি কীভাবে আমার ভিএমআরসি ফাইলটি ডিবাগ করব? ... এছাড়াও, <C-c>সন্নিবেশ মোডে প্রস্থান করার জন্য পার্শ্ব-প্রতিক্রিয়া থাকতে পারে (এটি দেখুন ) এবং সমস্যার অংশ হতে পারে ... আমি ব্যবহার করার পরামর্শ দিচ্ছি Escবা <C-[>(এটি দেখুন )
মার্টিন টর্নিজ

উত্তর:


11

পূর্বাবস্থায় ফিরে আসা ক্রমটি ম্যানুয়ালি ভাঙ্গা

আপনি ম্যানুয়ালি দিয়ে সন্নিবেশ মোডে পূর্বাবস্থায় ফিরে আসা সিকোয়েন্সটি ভাঙ্গতে পারেন <C-G>u। থেকে সাহায্যের :

CTRL-G u        break undo sequence, start new change

উদাহরণ

iHello<C-G>u world!<Esc>u

এটি আপনাকে পাঠ্যটি ছাড়বে

Hello

কমান্ড ভাঙ্গা

i                           " Enter Insert mode
 Hello                      " Type 'Hello'
      <C-G>u                " Break the undo sequence
             world!         " Type ' world!'
                   <Esc>    " Return to Normal mode
                        u   " Undo

স্বয়ংক্রিয় সমাধান

সূক্ষ্ম-দানাদার পূর্বে স্তর নিয়ন্ত্রণ control

এখানে উইমস্ক্রিপ্টের একটি ছোট স্নিপেট রয়েছে যা <C-G>uআপনি পাঠ্য মোছা শুরু করার সময়, এবং আপনি যখন মুছে ফেলার পরে আবার পাঠ্য প্রবেশ করা শুরু করেন তখন পূর্বে বিরতি তৈরি করতে ব্যবহার করে।

function! s:start_delete(key)
    let l:result = a:key
    if !s:deleting
        let l:result = "\<C-G>u".l:result
    endif
    let s:deleting = 1
    return l:result
endfunction

function! s:check_undo_break(char)
    if s:deleting
        let s:deleting = 0
        call feedkeys("\<BS>\<C-G>u".a:char, 'n')
    endif
endfunction

augroup smartundo
    autocmd!
    autocmd InsertEnter * let s:deleting = 0
    autocmd InsertCharPre * call s:check_undo_break(v:char)
augroup END

inoremap <expr> <BS> <SID>start_delete("\<BS>")
inoremap <expr> <C-W> <SID>start_delete("\<C-W>")
inoremap <expr> <C-U> <SID>start_delete("\<C-U>")

মন্তব্য

এই জন্য কাজ করবে <BS>, <C-W>(ক শব্দ মুছতে), এবং <C-U>(লাইন শুরুতে মোছা)। যদি সন্নিবেশ মোডে মুছে ফেলার আরও উপায় থাকে তবে এগুলি inoremapশেষে অতিরিক্ত কল যুক্ত করে সমর্থন করা যেতে পারে ।


4
কেবল সমস্যাটি হ'ল, আপনি পূর্বেই পূর্বাবস্থায় ফিরতে যাচ্ছেন এমন পূর্বাভাস দেবেন না (অন্যথায় আপনি এটি প্রথম স্থানে করবেন না)। সুতরাং আপনি সাধারণত এমন পরিস্থিতি শেষ করেন যেখানে আপনি ইচ্ছা করেন যে আপনি ব্যবহার করেছেন <C-G>u, যা ইতিমধ্যে অনেক দেরিতে।
শাহবাজ

4
হ্যাঁ. আসলে আমি নিজেকে হারিয়ে যাচ্ছি কিছু হ'ল এটি। কখনও কখনও আমি এটি করি iদীর্ঘ বাক্যটি অনুসরণ করে ব্যাকস্পেসের পরে আমি যা লিখেছি তার অংশটি সরাতে (সমস্ত সন্নিবেশ মোডে)। তখন আমি বুঝতে পারি আমার ব্যাকস্পিড করা উচিত নয় এবং আমি যা লিখেছিলাম তা ঠিক ছিল। আমি পূর্বাবস্থায় ফেরা, তবে তারপরে পুরো textোকানো পাঠ্যটি পূর্বাবস্থায় ফিরে আসে। সুতরাং হয় আমার দীর্ঘ বাক্যটির কোনওটিই বাকী নেই, বা যে অংশটি ব্যাকস্পিড হয় না। ব্যাকস্পিড অংশটি ফিরে পাওয়া অসম্ভব। ব্যাকস্পেসের উপর পূর্বাবস্থায় ফিরে আসা অনুক্রমটি ভাঙতে ভিমকে বলার কোনও উপায় আছে কি? (এখন যেহেতু আমি এটি বলছি, mapব্যাকস্পেস আইএনএন করা অবশ্যই একটি বিকল্প)।
শাহবাজ

2
ভবিষ্যতের দর্শনার্থীদের জন্য, আমি আরও যোগ inoremap <CR> <C-G>u<CR>করেছি যাতে প্রতিটি পূর্বাবস্থা একক লাইনের মধ্যে থাকে (আপনি যে ননস্টপটি টাইপ করছিলেন পুরো অনুচ্ছেদটি আর পূর্বাবস্থায় ফেরাবেন না)।
শাহবাজ

1
@ শাহবাজ, একেবারে :)
টমমকডো

1
@ শাহবাজ "আমাকে কি অনুলিপি দেওয়ার অনুমতি আছে?" পৃষ্ঠার নীচে লিঙ্কটি দেখুন: "ব্যবহারকারীর অবদানগুলি সিসি বাই-সা 3.0 এর অধীন লাইসেন্সের সাথে এট্রিবিউশনের প্রয়োজনীয়তা সহ প্রয়োজনীয়"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.