আমি যখন আনফিলিটি থেকে পরিবর্তনগুলি পূর্বাবস্থায় আছি তখন আমাকে অবহিত করা যাবে?


15

আমি কিছুক্ষণের জন্য ভিমের অনডফিল বৈশিষ্ট্যটি ব্যবহার করছি । এটি খুব সুন্দর বৈশিষ্ট্য।

তবে, একটি বিরক্তি হ'ল দুর্ঘটনাক্রমে পরিবর্তনগুলি পূর্বাবস্থায় ফেলা খুব সহজ যে আমি ফাইলটি শেষ বার খুলতে গিয়েছিলাম; যা 2 মিনিট আগে, এক ঘন্টা আগে, গত সপ্তাহে বা এক মাস আগে হতে পারে।

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

পূর্বে, uভিম "ইতিমধ্যে প্রাচীনতম পরিবর্তন" না হওয়া পর্যন্ত আমি কীটি ধরে রাখতে পারি :wq, এবং সম্পন্ন হবে। তবে এখন ফাইলটি খোলার সময় আমি যে পরিবর্তনগুলি করেছি তা পূর্বাবস্থায় না ফেরাতে আমাকে খুব যত্নবান হতে হবে। আপনি কখন এটি করছেন তা দেখার কোনও সুস্পষ্ট উপায় নেই।

এটি আরও সুস্পষ্ট করার কোনও উপায় আছে কি? উদাহরণস্বরূপ এটি কোথাও দেখিয়ে, একটি সতর্কতা জারি করে বা একটি নিশ্চিতকরণ জিজ্ঞাসা করে।


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

উত্তর:


8

আমার এই সঠিক সমস্যা ছিল। এটি আমার জন্য ঠিক করার জন্য আমি আমার ভিএমআরসি-তে যা যুক্ত করেছি তা এখানে:

" Always write undo history, but only read it on demand
" use <leader>u to load old undo info
" modified from example in :help undo-persistence

if has('persistent_undo')
  set undodir=~/.vim/undo " location to store undofiles
  nnoremap <leader>u :call ReadUndo()<CR>
  au BufWritePost * call WriteUndo()
endif

func! ReadUndo()
  let undofile = undofile(expand('%'))
  if filereadable(undofile)
    let undofile = escape(undofile,'% ')
    exec "rundo " . undofile
  endif
endfunc

func! WriteUndo()
  let undofile = escape(undofile(expand('%')),'% ')
  exec "wundo " . undofile
endfunc

মনে রাখবেন যে আপনি বিকল্পটি সেট করেন নাundofile ; আপনার যদি এটি থাকে তবে আপনার ভিএমআরসি থেকে সরিয়ে ফেলতে হবে।

পূর্বাবস্থায় ফেরা এখন "স্বাভাবিক" হিসাবে কাজ করে। কিন্তু আমরা কি নিজে সঙ্গে পূর্বাবস্থা ফাইল লিখতে wundoকমান্ড BufWritePost

ReadUndo()ফাংশন ম্যানুয়ালি সঙ্গে পূর্বাবস্থা ফাইল সার্চ rundoএবং সেট undofileবিকল্প। এখন আমরা uইতিহাসে আরও ফিরে যেতে ব্যবহার করতে পারি। আমি এটিকে ম্যাপ করেছি <Leader>u

এটি সম্ভবত আরও ভাল হতে পারে। এটি পূর্ববর্তী পূর্বাবস্থায় ফিরিয়ে নেওয়া তথ্যগুলিকে ওভাররাইট করে, সুতরাং আপনি ফাইলটি সম্পাদনা করে আগের আগের সময়টিতে ফিরে যেতে পারবেন না। তবে আমার নিজের দরকার নেই।


দ্রষ্টব্য আমি এতে একটি সমস্যা লক্ষ্য করেছি: আপনি কেবলমাত্র বর্তমান সেশনের সামগ্রীগুলি পূর্বাবস্থায় ফাইলে সংরক্ষণ করবেন save এটি ডিফল্ট আচরণের থেকে পৃথক, যেখানে পূর্ববর্তী সেশনের বিষয়বস্তু + ইতিমধ্যে পূর্বাবস্থায় ফাইলে থাকা সমস্ত তথ্য সংরক্ষিত আছে ... এটি ঠিক করার উপায়টি হ'ল পূর্বাবস্থায় ফাইলটি পড়া, পূর্বাবস্থায় ফিরে আসা পরিবর্তনগুলি মার্জ করা এবং তারপরে লিখুন পূর্বাবস্থায় ফেলা ফাইল ... তবে এটি সম্ভব বলে মনে হচ্ছে না ...: - /
মার্টিন টর্নোইজ

নিবন্ধন করুন এটি সম্ভব হলে এটি করা ভাল হবে। যেহেতু এটি ঘটে এটি আমার জন্য দীর্ঘকাল ধরে যথেষ্ট ভাল কাজ করেছে। YMMV।
সুপারজার

5

ওহ, ওহ, অবশেষে এই নিফটি আদেশটি দেখানোর সুযোগ !

ভিম "সময়মতো ফিরে যেতে" পারে। এটি একটি :earlierকমান্ড আছে ...

                                                        :ea :earlier            
:earlier {count}        Go to older text state {count} times.                   
:earlier {N}s           Go to older text state about {N} seconds before.        
:earlier {N}m           Go to older text state about {N} minutes before.        
:earlier {N}h           Go to older text state about {N} hours before.          
:earlier {N}d           Go to older text state about {N} days before.           

:earlier {N}f           Go to older text state {N} file writes before.          
                        When changes were made since the last write             
                        ":earlier 1f" will revert the text to the state when    
                        it was written.  Otherwise it will go to the write      
                        before that.                                            
                        When at the state of the first file write, or when      
                        the file was not written, ":earlier 1f" will go to      
                        before the first change.                                

... যা ফাইলটিকে আগের অবস্থায় ফিরিয়ে দিতে পারে। এটি বিভিন্ন উপায়ে ব্যবহার করা যেতে পারে।

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

    :earlier 1d
    
  • আপনি যে পরিবর্তনগুলি পূর্বাবস্থায় রাখতে চান তার পরে যদি আপনি কেবল একবার ফাইলটি (সংরক্ষণ করে) লিখে থাকেন বা আপনি ফাইলটি সংরক্ষণ করেননি তবে আপনি ব্যবহার করতে পারেন

    :earlier 1f
    

    :helpপাঠ্যটিতে বর্ণিত হিসাবে , আপনি সবেমাত্র ফাইলটি লিখলে এটি পূর্ববর্তী লিখিত সংস্করণে ফিরে যাবে, বা আপনার যদি কোনও সংরক্ষিত পরিবর্তন না থাকে তবে এটি সংরক্ষণ করা হয়েছিল সর্বশেষে ফিরে আসবে।

এটি আপনার প্রশ্নের সুনির্দিষ্ট উত্তর দেয় না, তবে এটি কিছুটা XY সমস্যার মতো মনে হচ্ছে।


1
এটি কিছুটা XY সমস্যার মতো মনে হচ্ছে : কেন? আমি এর সাথে পূর্বাবস্থায় ফিরে এসেছি uএবং আমি এখনই ঘটনাক্রমে আমার যে পরিবর্তনগুলি করেছি তা পেরেছি ... আমি নিশ্চিত না যে মূল "এক্স-সমস্যা" এখানে কী হতে পারে?
মার্টিন টর্নয়েজ

1
আমি এখন :earlierপথে যাই, তবে আমার এখনও অনুমান করা দরকার ; যেমনটি ব্যবহার করার সময় আমার যেমন অনুমান করা দরকার u... তবে এটি সম্ভবত কিছুটা ভাল, তবে আমি আরও স্পষ্ট কিছু পছন্দ করতে (যদি সম্ভব হয়) would
মার্টিন টর্নয়েজ

1
@ কার্পেটসমোকার "এক্স" হ'ল "আমি সম্প্রতি এই পরিবর্তনগুলি কেবল পূর্ববর্তী করতে চাই ।" "ওয়াই" হ'ল "আমি কীভাবে পরিবর্তনগুলি পূর্বাবস্থায় ফেরাতে এবং আন-ফাইলে উপেক্ষা করতে পারি?" আপনার এখনও বাছাই করতে হবে তবে আপনি নিজের প্রশ্নে বলেছেন যে আপনি সর্বশেষ পরিবর্তনগুলি গত সপ্তাহে বা তার আগে হয়েছিল তাই আপনি ঠিক এর মতো কিছু করতে পারেন :ea 5d। আপনি ব্যবহার করতে পারেন :ea 1f। যাইহোক, এটি অনেক কম দানাদার।
ডোরকনব

"এক্স" এবং "ওয়াই" আমার কাছে একই সমস্যার পুনরায় প্রশ্রয় বলে মনে হচ্ছে? আমি আমার প্রশ্নে উল্লেখ "সপ্তাহ" করেনি, কিন্তু এটি ঘন্টা, বা মিনিট (সংশোধিত) যে ... এই নয় একটি খারাপ উত্তর হতে পারে যেমন উপায় দ্বারা, আমার বয়স (এবং টা) শুধু প্রত্যাশী কিছু উত্তম ...
মার্টিন টর্নয়েজ

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

4

আপডেট 2015-06-28 : আমি একটি ছোট বাগ ঠিক করেছি, এবং এটি একটি প্লাগইন হিসাবে প্রকাশ করেছি । প্লাগইন কোডটি কিছুটা ভাল, কার্সারটি সরিয়ে দেওয়ার পরে এটি আবার সতর্ক করে; আমি আপনাকে প্লাগইন ব্যবহার করার পরামর্শ দিচ্ছি।



সুপারজারের উত্তরটি দুর্দান্ত কাজ করে তবে দুর্ভাগ্যজনক পার্শ্ব-প্রতিক্রিয়া রয়েছে যা আপনি কেবল সর্বশেষ ভিম সেশন থেকে পরিবর্তনগুলি পূর্বাবস্থায় রাখতে পারেন, এবং সমস্ত পূর্ববর্তী ভিম সেশনগুলি নয়।

এটি হ'ল wundoপূর্বাবস্থায় ফিরিয়ে দেওয়া ফাইলগুলি; এটি একীভূত হয়নি আমি যতদূর জানি, এটি ঠিক করার কোনও উপায় নেই।

সুতরাং আমার বিকল্প সমাধানটি এখানে, আপনি যখন পূর্বাবস্থায় ফিরে আসা ফাইল থেকে পরিবর্তনগুলি পূর্বাভাস করছেন তখন এটি একটি বড় লাল সতর্কতা বার্তা প্রদর্শন করবে।

এটি ইনগো কারকাতের উত্তরের অনুরূপ , তবে এটিতে একটি বাহ্যিক প্লাগইন প্রয়োজন হয় না এবং এর কিছু সূক্ষ্ম পার্থক্য রয়েছে (বীপের পরিবর্তে সতর্কতা প্রদর্শন করে, আপনাকে uদুবার টিপতে হবে না )।

উল্লেখ্য এই শুধুমাত্র মডিফাই uএবং <C-r>শুশ্রূষা এবং নাU , :undoএবং :redoকমান্ড।

" Use the undo file
set undofile

" When loading a file, store the curent undo sequence
augroup undo
    autocmd!
    autocmd BufReadPost,BufCreate,BufNewFile * let b:undo_saved = undotree()['seq_cur'] | let b:undo_warned = 0
augroup end 

" Remap the keys
nnoremap u :call Undo()<Cr>u
nnoremap <C-r> <C-r>:call Redo()<Cr>


fun! Undo()
    " Don't do anything if we can't modify the buffer or there's no filename
    if !&l:modifiable || expand('%') == '' | return | endif

    " Warn if the current undo sequence is lower (older) than whatever it was
    " when opening the file
    if !b:undo_warned && undotree()['seq_cur'] <= b:undo_saved
        let b:undo_warned = 1
        echohl ErrorMsg | echo 'WARNING! Using undofile!' | echohl None
        sleep 1
    endif
endfun

fun! Redo()
    " Don't do anything if we can't modify the buffer or there's no filename
    if !&l:modifiable || expand('%') == '' | return | endif

    " Reset the warning flag
    if &l:modifiable && b:undo_warned && undotree()['seq_cur'] >= b:undo_saved
        let b:undo_warned = 0
    endif
endfun

3

আমার নিম্নলিখিতটি রয়েছে, যা থামানো এবং বীপগুলি পূর্বাবস্থায়িত বাফার সামগ্রীগুলিতে পৌঁছালে s

runtime autoload/repeat.vim " Must load the plugin now so that the plugin's mappings can be overridden.
let s:undoPosition = []
function! s:StopAtSavedPosition( action )
    " Buffers of type "nofile" and "nowrite" never are 'modified', so only do
    " the check for normal buffers representing files. (Otherwise, the warning
    " annoyingly happens on every undo.)
    if ingo#buffer#IsPersisted() && ! &l:modified && s:undoPosition != ingo#record#PositionAndLocation(1)
        " We've reached the undo position where the buffer contents correspond
        " to the persisted file. Stop and beep, and only continue when undo is
        " pressed again at the same position.
        call ingo#msg#WarningMsg(a:action . ' reached saved buffer state')
        execute "normal! \<C-\>\<C-n>\<Esc>" | " Beep.

        let s:undoPosition = ingo#record#PositionAndLocation(1)
        return 1
    else
        let s:undoPosition = []
        return 0
    endif
endfunction
nnoremap <silent> u     :<C-U>if ! &l:modifiable<Bar>execute 'normal! u'<Bar>elseif ! <SID>StopAtSavedPosition('Undo')<Bar>call repeat#wrap('u',v:count)<Bar>endif<CR>
nnoremap <silent> <C-R> :<C-U>if ! &l:modifiable<Bar>execute "normal! \<lt>C-R>"<Bar>elseif ! <SID>StopAtSavedPosition('Redo')<Bar>call repeat#wrap("\<Lt>C-R>",v:count)<Bar>endif<CR>

এটি পুনরুক্ত.ভিম প্লাগইনের সাথে সংহত করে; এটির জন্য আমার ইনগো-লাইব্রেরি প্লাগইন প্রয়োজন


"বাফার লোড করার সময় ফাইলটি যে অবস্থায় ছিল" তার মানে কি আপনি "স্থির" ব্যবহার করছেন? আমি সাধারণত ডিস্কে সংরক্ষণ করা ফাইলটির স্থিতি বোঝাতে "জেদী" থাকতাম।
ধনী

@ রিচ: না, আমাদের একই সংজ্ঞা রয়েছে। আমার ম্যাপিংগুলি প্রশ্নটি যা জিজ্ঞাসা করে ঠিক তেমন করে না তবে আমি এটি এখনও খুব দরকারী বলে মনে করি।
ইনগো কারকাত

2

আমি মনে করি আমি এমন একটি উত্তরও মেনে নেব যা একটি আদেশ দিয়েছে যা ফাইলটি যে অবস্থায় রেখেছিল তা সেই রাজ্যে ফিরিয়ে দিয়েছে যখন আপনি এটি শেষ বার খুললেন। (বা আরও ভাল, ফিরে ফিরে ফিরে ফিরে যায়।)

> সমৃদ্ধ

আমি উদ্ধৃত ধারণাটি সত্যই পছন্দ করেছি তাই আমি :Revertআদেশ দিয়েছি । আমি আশা করি আপনি এটি আপনার প্রশ্নের সাথে প্রাসঙ্গিক পাবেন।

function! s:Real_seq(inner, outer) abort
  let node = a:outer
  for i in a:inner
    if has_key(i, 'alt')
      call s:Real_seq(i.alt, deepcopy(node))
    endif
    if has_key(i, 'curhead')
      return {'seq': node.seq}
    endif
    let node.seq  = i.seq
  endfor
endfunction

function! s:Get_seq(tree) abort
  let query = s:Real_seq(a:tree.entries, {'seq': 0})
  if (type(query) == 4)
    return query.seq
  else
    return undotree()['seq_cur']
  endif
endfunction

au BufReadPost,BufNewFile * if !exists('b:undofile_start') 
      \ | let b:undofile_start = s:Get_seq(undotree()) | endif

command! -bar Revert execute "undo " . get(b:, 'undofile_start', 0)

আনডোট্রি ভিত্তিক সহায়ক ফাংশন Get_seqএবং প্রয়োজনীয়, কারণ কখনও কখনও পূর্বাবস্থায় থাকা গাছের বর্তমান অবস্থান নির্ধারণ করার জন্য পর্যাপ্ত নয়। আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন ।Real_sequndotree()['seq_cur']


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