কীভাবে ভিমে একাধিক বিভিন্ন সেশন সংরক্ষণ এবং পুনরুদ্ধার করবেন?


367

ভিমে আমার কাজের উপর নির্ভর করে আমার বেশ কয়েকটি ট্যাব খোলা আছে।

পরে ব্যবহারের জন্য আমি কীভাবে বিভিন্ন সেশন সংরক্ষণ করতে পারি?


16
@ldigas আমি মনে করি পিপিএল এখানে একটি পুরানো স্কুল ফোরাম বা টার্মিনাল ডকুমেন্টেশন, বা স্বর্গ নিষিদ্ধ, একটি manপৃষ্ঠার চেয়ে প্রশ্নটি (বৃহত ফন্ট, দুর্দান্ত ফর্ম্যাটিং সহ ...) খুঁজে পেতে আরও স্বাচ্ছন্দ্য বোধ করছে
puk

6
@ldigas আমি ব্যক্তিগতভাবে সর্বদা মানুষ পৃষ্ঠাগুলি দ্বারা ভয়ে ভয়ে থাকি / বি সি তারা যথেষ্ট পরিমাণে বোবা জিনিস রাখে না। লিনাক্সের সমস্ত কিছুর মতো, এটিতে খাড়া শেখার বক্রতা রয়েছে।
puk

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

2
@ldigas এবং লোকেরা এটি ভবিষ্যতের রেফারেন্সের জন্য ব্যবহার করতে পারে, যেহেতু অন্য কারওর প্রয়োজন হতে পারে।
মনসুরো

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

উত্তর:


494

আপনি কিছু চান

:mksession ~/mysession.vim

তারপরে আপনি সেই ভিএম ফাইলটি উত্স করতে পারবেন এবং আপনার পুরানো সেশনটি ফিরে আসবে:

:source ~/mysession.vim

অথবা -S বিকল্পের সাথে ভিমটি খুলুন:

$ vim -S ~/mysession.vim

27
ওও, এবং আমি প্রায় ভুলে গেছি আপনি টাইপ করে এটিকে আবার লোড করতে পারেন: gvim -S my / mysession.vim
বেঞ্জ

1
ধন্যবাদ @ বেঞ্জ। আমি ভিমে নতুন কমান্ড লাইনে আমি কীভাবে 'উত্স' করতে পারি?
জোগুসা

1
ওপস! দুঃখিত বেনজ, আমি কমান্ড মোড বলতে চাইছি। আমি ইতিমধ্যে এটি খুঁজে পেয়েছি: ´´ `: উত্স ~ / mysession.vim´´ ´´
জোগুসা

8
সংক্ষিপ্তটি: তাই file / ফাইল। আপনি যদি বর্তমান ফাইলটিকে একটি সাধারণ উত্স হিসাবে উত্সাহ করতে চান তবে:% আপনার জন্য কাজ করবে।
ড্যানিয়েল বাউলিগ

14
আপনি যদি কোনও সেশন ফাইলের নাম নির্দিষ্ট না করে থাকেন তবে এটি লেখার এবং পাঠ করার ক্ষেত্রে ডিফল্ট হবে Session.vim। তাই আপনি যদি শুধুমাত্র শুধুমাত্র একটি অধিবেশন আপনার বর্তমান ডিরেক্টরির মধ্যে সংরক্ষণ করা করতে চান, আপনি ব্যবহার করতে পারেন :mksessionবা :mksতেজ থেকে আপনার বর্তমান সেশন সংরক্ষণ করতে, এবং শুধুমাত্র vim -Sএটা ব্যাক আপ খুলুন।
আনিসপেটেল

59

আপনি আপনার ভিএমআরসিতে এই সেশন বিকল্পগুলি সেট করতে চাইতে পারেন। বিশেষ করে বিকল্পগুলি বিরক্তিকর যখন আপনি সেশনটি সংরক্ষণ করার পরে আপনার ভিএমআরসি পরিবর্তন করেছেন।

set ssop-=options    " do not store global and local values in a session
set ssop-=folds      " do not store folds

1
গ্রেট! আমি গতকাল ঠিক এই সমস্যা ছিল। অনেক ধন্যবাদ!
জোগুসা

40

দ্রষ্টব্য: mksession আপনার তৈরি করা কোনও ফাইলের পরিবর্তনগুলি সংরক্ষণ করবে না। আমি সেখান থেকে গ্রহণ করব এই ধারণা করে সেশনটি সংরক্ষণ করার পরে ভিএম বন্ধ করার এই ভুলটি করেছি। তবে পরের বার আমি অধিবেশনটি খোলার পরে ফাইলগুলিতে আমার যে পরিবর্তনগুলি হয়েছিল তা চলে গেল।


11
এটি সম্পর্কিত কোনও উত্তর নিয়ে আসা উচিত :mksession
মরগান উইল্ড

1
হাঁ আপনি সম্ভবত সঙ্গে অনুসরণ করতে চান:wqa
JonnyRaa

11
বা কেবল :xaএকটি কম কীস্ট্রোক। হ্যাঁ!
রবিন

আপনি নিজের মধ্যে ফাইলগুলি স্বয়ংক্রিয়ভাবে সংরক্ষণ করতে (আপনি যদি এই ধরণের জিনিস পছন্দ করেন) ভিএম সেট করতে পারেন .vimrc: vimrc au FocusLost * silent! wa এটি বাফারের ফোকাস হারিয়ে যে কোনও সময় স্বয়ংক্রিয়ভাবে সংরক্ষণ করবে।
গ্রেগো

32

আপনি যদি নিজের ফাইল এক্সপ্লোরার / ড্যাশ হিসাবে NERDTree ব্যবহার করেন তবে আমি বিল্ট-ইন: mksession কমান্ডের পরিবর্তে xolox / vim-सत्र প্লাগইনটি সুপারিশ করব । কোনও কারণে,: এমকেসিওশন NERDTree বাফারগুলি পুনরুদ্ধার করতে ব্যর্থ। আপনার মাইলেজটি ভিন্ন হতে পারে তবে আমি ভেবেছিলাম আমার অভিজ্ঞতাটি ভাগ করে নিই।


ম্যাকভিমের জন্য, আমাকে নিশ্চিত করতে হবে: let g:nerdtree_tabs_open_on_gui_startup=0এবং let g:nerdtree_tabs_open_on_new_tab=0xolox / vim- সেশনের কাজ করতে।
নিলিয়ানিয়ং

18

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

প্রতিবার আপনি যখন ভিম থেকে প্রস্থান করবেন এটি বর্তমান সেশনটির নীচে সংরক্ষণ করবে ~/.vim/sessionsএবং ভিম খোলার পরে এটি আবার লোড করবে। এটি আপনার বর্তমান পাথের উপরও নির্ভর করে, সুতরাং আপনি যদি ভিমকে বিভিন্ন ডিরেক্টরি থেকে খুলেন তবে আপনার বিভিন্ন সেশন থাকবে, যা বিভিন্ন প্রকল্পে কাজ করার সময় বেশ কার্যকর।

আপনার ~/.vimrcফাইলটি সম্পাদনা করুন এবং নিম্নলিখিতগুলি যুক্ত করুন:

function! MakeSession()
  let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
  if (filewritable(b:sessiondir) != 2)
    exe 'silent !mkdir -p ' b:sessiondir
    redraw!
  endif
  let b:filename = b:sessiondir . '/session.vim'
  exe "mksession! " . b:filename
endfunction

function! LoadSession()
  let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
  let b:sessionfile = b:sessiondir . "/session.vim"
  if (filereadable(b:sessionfile))
    exe 'source ' b:sessionfile
  else
    echo "No session loaded."
  endif
endfunction

" Adding automatons for when entering or leaving Vim
au VimEnter * nested :call LoadSession()
au VimLeave * :call MakeSession()

এমনকি কোনও শিক্ষানবিশের জন্যও এই স্ক্রিপ্টটি কিছুটা সহজ বোঝা এবং কাস্টমাইজ করা সহজ।

দয়া করে মনে রাখবেন এই স্ক্রিপ্টটি কেবল ইউনিক্স সিস্টেমের জন্য সঠিকভাবে কাজ করবে (ম্যাকস / লিনাক্স), এটি উইন্ডোতে কাজ করার জন্য খাপ খাইয়ে নেওয়া দরকার।


আপডেট: যোগ করার পদ্ধতি 0xc0de এর প্রস্তাবনা, আপনি প্রতিস্থাপন করতে পারি VimEnterআপনি লোড সেশনের তেজ চান তাহলে এই বেশী জন্য লাইন শুধুমাত্র যদি কোন যুক্তি প্রদান করা হয় :

if(argc() == 0)
  au VimEnter * nested :call LoadSession()
endif

1
ভিএম যেমন কোনও যুক্তি সরবরাহ না করা হয় তবে আপনি সেশনটি খুলতে চাইতে পারেন। if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de

ধন্যবাদ @ 0xc0de, দুর্দান্ত পরামর্শ (আমি নিজেও এটি ব্যবহার শুরু করেছি)। আমি উত্তর আপডেট করেছি।
মাথিওলো

আমি এটি কীভাবে সংশোধন করব যাতে আমি যদি যুক্তি দিয়ে ভিএম খুলি তবে এটিও সেই অধিবেশনটি বাঁচাতে পারে না
ডাঃ ম্যানহাটন

খুব ভাল, তবে `EXE 'উত্স' বি: সেশনফিল` সেখানে একটি বিন্দু দরকার? এবং সমস্যাটি হ'ল অটোল্যাড সেশনটি বর্তমান হোম ডিরেক্টরিতে নির্ভর করে (দিয়ে যান pwd) কীভাবে আমি প্রস্থান করার আগে ভিএম থেকে বেরিয়ে আসার আগে এটি শেষ কার্যক্ষম ডিরেক্টরি হতে পারি? যাতে এটি অধিবেশনটির চেয়ে শেষ কার্যক্ষম অধিবেশনটি লোড করতে পারে ~/?
ভ্যান আবেল

আপনি সেশন আছে কিন্তু এখনও এটি পৃথক উত্তরে এই আমার পরিমার্জিত সংস্করণ খুঁজে বার করো মুছে যাওয়ার ছাড়া ডিরেক্টরির মধ্যে একক ফাইল খুলতে পাবে চাইলে: stackoverflow.com/questions/1642611/...
PMunch

6

এই কাজের জন্য একটি খুব দরকারী প্লাগইন আছে vim-startify যা সম্প্রতি খোলা ফাইলগুলি ইত্যাদির মতো অন্যান্য অনেক কিছুই পরিচালনা করে, এটির খুব সহজ ইন্টারফেসও রয়েছে।

আমি কয়েক দিন ধরে এটি ব্যবহার করছি এবং এখন পর্যন্ত এটি পুরোপুরি কার্যকরভাবে কাজ করছে। আশা করি এটি আপনাকে সহায়তা করবে।


5

যেহেতু ভিমের সেশনগুলির সাথে কীভাবে কাজ করবেন তার জন্য এটি আমার (এবং সম্ভবত অন্যদের) জন্য গুগলের প্রথম হিট আমি কীভাবে এই স্বয়ংক্রিয়ভাবে তৈরি করব সে সম্পর্কে @ মাথেলিওর উত্তরে কিছুটা যুক্ত করার সিদ্ধান্ত নিয়েছি।

আমি তার কোডটি পছন্দ করি তবে "আরগস ছাড়াই কেবল যদি" ​​সমাধানটি যুক্ত করা কিছুটা অভাবজনক বলে মনে হয়েছিল। এটি আমার পরিবর্তিত সংস্করণ:

function! MakeSession(overwrite)
  let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
  if (filewritable(b:sessiondir) != 2)
    exe 'silent !mkdir -p ' b:sessiondir
    redraw!
  endif
  let b:filename = b:sessiondir . '/session.vim'
  if a:overwrite == 0 && !empty(glob(b:filename))
    return
  endif
  exe "mksession! " . b:filename
endfunction

function! LoadSession()
  let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
  let b:sessionfile = b:sessiondir . "/session.vim"
  if (filereadable(b:sessionfile))
    exe 'source ' b:sessionfile
  else
    echo "No session loaded."
  endif
endfunction

" Adding automatons for when entering or leaving Vim
if(argc() == 0)
  au VimEnter * nested :call LoadSession()
  au VimLeave * :call MakeSession(1)
else
  au VimLeave * :call MakeSession(0)
endif

এখানে উল্লেখযোগ্য পরিবর্তনটি হ'ল alচ্ছিক ওভাররাইড। আপনি যদি বিকল্পগুলি ছাড়াই ভিমটি খোলেন এটি কোনও বিদ্যমান সেশন খুলবে এবং আপনি চলে যাওয়ার সময় পরিবর্তনগুলি ওভাররাইট করবে। যদি ভিএম অপশন সহ খোলা হয় তবে এটি কেবলমাত্র একটি নতুন সেশন তৈরি করবে যদি কোনটিই না থাকে তবে এর অর্থ আপনি একটি ডিরেক্টরিতে ওভাররাইট না করে একটি অধিবেশন থাকতে পারে এমন একটি ডিরেক্টরিতে খুলতে পারবেন। তারপরে আপনি সেশনটি চালানোর বিকল্প ছাড়া ভিমটি খুলতে পারেন। যদি কোনও অধিবেশন উপস্থিত না থাকে তবে এটি একটি নতুন ইভেন্ট তৈরি করে।


আমি নিওভিম ০.২.২ এ আপনার উপরের পোস্ট সলিউশনটি চেষ্টা করেছি এবং আপনার স্নিপেটটি রেখেছি $HOME/.vim/plugin/sessions.vimতবে এটি সেশন ফাইলগুলি সংরক্ষণ করছে না। ¯ \ _ (ツ) _ / ¯
আইপ্যাচ

এই থ্রেড, এবং বিশেষত লিঙ্কযুক্ত মন্তব্যটি সাহায্য করতে পারে: superuser.com/questions/404686/… আমার এটি আমার .vimrc এ আছে এবং এটি দুর্দান্ত কাজ করে।
PMunch

এটি কাজ করে উঠেছে, স্পষ্টতই আমার সেশনটি খারাপ রসিকতা
writtenোকানোর

3

এই দুর্দান্ত প্লাগইন কলটি ভিএম-সেশন রয়েছে । এটা খুব শক্তিশালী। এটি ইনস্টল করতে:

cd ~/.vim/bundle
git clone https://github.com/xolox/vim-session.git

আমি আমার .vimrcফাইলে এর কার্যকারিতাটি ম্যাপ করেছি :

nnoremap <leader>so :OpenSession 
nnoremap <leader>ss :SaveSession 
nnoremap <leader>sd :DeleteSession<CR>
nnoremap <leader>sc :CloseSession<CR>

এখন সাধারণ মোডে কেবল টাইপ করুন <leader>ssএবং আপনি এরকম একটি কমান্ড দেখতে পাবেন

:SaveSession 

এখন আপনার সেশনের নাম যুক্ত করুন

 :SaveSession namesession

এবং যে সব.

আপনি যখন ভিমটি বন্ধ করেন এবং এটি আবার খোলেন ঠিক তেমন করুন

 :OpenSession

এবং আপনি আপনার সেশনটি উন্মুক্ত দেখতে পাবেন।

আপনার .vimrcফাইলটিতে যুক্ত করার জন্য আরও অনেকগুলি কনফিগারেশন রয়েছে উদাহরণের জন্য ডকুমেন্টেশন দেখুন:

let g:session_directory = "~/.vim/tmp/session"  // the directory must be created before the sessions will be saved there
let g:session_autoload = "no"                   // automatic reload sessions
let g:session_autosave = "no"                   // autosave
let g:session_command_aliases = 1

ইউটিউবে একটি ভাল টিউটোরিয়াল আছে।


2

ব্যক্তিগতভাবে আমি টিম পোপের অবসেশন প্লাগইনটি কেবলমাত্র একটি সংজ্ঞায়িত করতে sessiondirএবং পথটি টাইপ করা এড়ানোর জন্য আবদ্ধ করি:

let g:sessiondir = $HOME . ".vim/sessions"

command! -nargs=1 MkSession call MkSession(<f-args>)
function! MkSession(sessionfile)
  if !isdirectory(g:sessiondir)
    call mkdir(g:sessiondir, "p")
  endif
  exe 'Obsession' g:sessiondir . '/' . a:sessionfile
endfunction

command! -nargs=1 LoadSession call LoadSession(<f-args>)
function! LoadSession(sessionfile)

  let a:sessionpath = g:sessiondir . a:sessionfile
  if (filereadable(a:sessionpath))
    exe 'source ' a:sessionpath
  else
    echo "No session loaded."
  endif
endfunction

এয়ারলাইন প্লাগইন এবং সেশনগুলির সাথে আমার নির্দিষ্ট সমস্যা ছিল। অবসেশন ব্যবহারে স্যুইচ করা বিষয়গুলির সমাধান করেছে, কয়েক সপ্তাহের লড়াইয়ের পরে এটি একটি আশ্চর্যজনক আবিষ্কার। Github.com/vim-airline/vim-airline/issues/…
icc97

1

ধন্যবাদ @ মথিওলো @ মথেলিওর উদাহরণ অনুসরণ করে, আমি সক্রিয় সেশনটি সংরক্ষণ করার জন্য নীচের লাইনটি .vimrc এ যুক্ত করেছি (যদি থাকে):

au VimLeave * if this_session != "" | exe "mksession! ".this_session

আপনি যদি আরও লাইন রাখতে চান তবে আপনাকে এন্ডিফ ব্যবহার করতে হবে:

au VimLeave * if v:this_session != ""
au VimLeave *   exe "mksession! ".this_session
au VimLeave * endif

আপনার সাথে কেবলমাত্র একটি নতুন সেশনটি সংরক্ষণ করতে হবে

:mks [Session filename]

এবং পরে শুরু

$ vim -S [Session filename]

ভিএম অধিবেশনটি শুরু করবে এবং প্রতিবার আপনি যখন ভিএমটি বন্ধ করবেন তখন সেশনটি সংরক্ষণ করার জন্য আপনাকে চিন্তা করার দরকার নেই।

আপনার যদি সক্রিয় অধিবেশন না থাকে v Vimrc কিছুই করবে না। পূর্বের মত.

এটাই আমি খুঁজছিলাম! আবার ধন্যবাদ @ মাথেলিও!


এটি আমিও খুঁজছিলাম। দুর্দান্ত! আমি মনে করতে পারি না যে আমি তার :qপরিবর্তে কতবার আমার সেশন হারিয়েছি :bd... ধন্যবাদ!
জোয়েল.ও

1

আপনি যদি প্রকল্পের জন্য কেবলমাত্র 1 টি অধিবেশন থাকার পরিকল্পনা করেন তবে ঠিক করুন

:mks

যা Session.vimবর্তমান ডিরেক্টরিতে একটি ফাইল তৈরি করবে এবং তারপরে সেশনটি খুলতে হবে (একই ডিরেক্টরি থেকে):

vim -S

আপনি যদি সেশনটি পরিবর্তন করেন এবং এটি সংরক্ষণ করতে চান:

:mks!

এটি সেশনটি সংরক্ষণ করে, ফাইলগুলি নিজেরাই নয়!

আপনি যদি একাধিক সেশন করার পরিকল্পনা করেন তবে আমি তাদের প্রকল্পের ডিরেক্টরিতে লুকানো ফাইলগুলিতে সংরক্ষণ করতে পছন্দ করি:

:mks .session-name.vim

এটি খুলতে (একই ডিরেক্টরি থেকে):

vim -S .session-name.vim

সেশন সংরক্ষণ করুন:

:mks! .session-name.vim

যেহেতু সেশনগুলি লুকানো ফাইলগুলিতে সংরক্ষিত হয় সেগুলি দেখার জন্য ভুলবেন না -a

ls -a

0

আপনি যেখানেই সেশন সংরক্ষণ করতে পারেন।

উদা:

:mksession! D:/session.ses

এটি সেশনটি ডি ড্রাইভে সঞ্চয় করে।

এটি টাইপ করে খোলা যেতে পারে

:so D:/session.ses

যে কোনও ভিএম ফাইলের মধ্যে।


0

নীচে একমাত্র কনফ। এটা সত্যিই আমার জন্য কাজ করেছে। আমি এটি এখান থেকে নিয়ে এসেছি যেখানে আপনি আরও একটি সম্পূর্ণ / জটিল সংস্করণ নিতে পারেন।

set viewoptions+=cursor,folds,slash,unix
set viewoptions-=options

augroup vimrc
    autocmd BufWritePost *
    \   if expand('%') != '' && &buftype !~ 'nofile'
    \|      mkview
    \|  endif
    autocmd BufRead *
    \   if expand('%') != '' && &buftype !~ 'nofile'
    \|      silent loadview
    \|  endif
augroup END

0

একাধিক সেশন পরিচালনার জন্য (প্রতিটি ডিরেক্টরি / রেপো ভিত্তিতে), আমি সম্প্রতি ভিআইএম-সেশন প্লাগইন থেকে ভিআইএম-ওয়ার্কস্পেসে স্যুইচ করেছি । এটির সেশন ম্যানেজমেন্ট তুলনামূলক সহজ এবং বেশ ভাল কাজ করে।

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