विम में कई अलग-अलग सत्रों को कैसे बचाएं और पुनर्स्थापित करें?


367

विम में मेरे कार्य के आधार पर मेरे पास कई टैब खुले हैं।

मैं बाद के उपयोग के लिए विभिन्न सत्रों को कैसे बचा सकता हूं?


16
@ldigas मुझे लगता है कि पीपीएल एक पुराने स्कूल फोरम या टर्मिनल डॉक्यूमेंटेशन की तुलना में यहां (बड़े फॉन्ट, शानदार फॉर्मेटिंग ...) सवाल को खोजने में ज्यादा सहज महसूस करता है, या, स्वर्ग की मनाही, एक manपेज
puk

6
@ बुजुर्ग मुझे व्यक्तिगत रूप से हमेशा डरते रहे हैं कि वे आदमी बी / सी से दूर रहें, वे चीजों को पर्याप्त रूप से गूंगा नहीं करते हैं। लिनक्स में बाकी सब कुछ बहुत पसंद है, इसमें एक सीखने की अवस्था है।
PUK

45
@ इडीगास - मुझे लगता है कि आप इस बात को याद कर रहे हैं कि सामूहिक स्मार्ट के बीच, गूगल, और स्टैक ओवरफ्लो मेटाकॉलेज प्रबंधन - यह आपके उत्तर पाने का एक बेहतर तरीका है - आपको क्या चाहिए, गूढ़ विकल्पों की लंबी सूची नहीं, इस पृष्ठ के रूप में जाल के वास्तविक दुनिया के अनुभव को दिखाता है, और अक्सर अपने जीवन को आसान बनाने के लिए वास्तव में निफ्टी शॉर्टकट। यह मेरे द्वारा देखे गए लगभग किसी भी मैनुअल पर समान रूप से लागू होता है ( शायद php ऑनलाइन मैनुअल को छोड़कर )। चिरायु ढेर!
ErichBSchulz

2
@ldigas और लोग इसे भविष्य में संदर्भ के लिए उपयोग कर सकते हैं, क्योंकि किसी और को इसकी आवश्यकता हो सकती है।
मानसरो

4
@idigas मुझे लगता है कि ये प्रश्न इस अर्थ में वास्तविक हैं, कि एक विम शुरुआतकर्ता को मदद प्रणाली के बारे में बहुत कुछ नहीं पता है और इसका उपयोग कैसे करना है, लेकिन अगर वे अधिक अनुभवी हो जाते हैं, तो उन्हें पता चलेगा कि विम में अपना रास्ता कैसे खोजना है।
एडगर क्लार्क

जवाबों:


494

आप जैसा कुछ चाहते हैं

:mksession ~/mysession.vim

फिर बाद में आप उस विम फ़ाइल को स्रोत बना सकते हैं और आपके पास अपना पुराना सत्र वापस आ जाएगा:

:source ~/mysession.vim

या -S विकल्प के साथ खुला विम:

$ vim -S ~/mysession.vim

27
OOO, और मैं लगभग भूल गया आप टाइप करके वापस इसे लोड कर सकते हैं: जाँचने एस ~ / mysession.vim
Benj

1
धन्यवाद @ बन्ज। मैं नई हूँ। मैं कमांड लाइन में 'सोर्स' कैसे कर सकता हूं?
जोगुसा

1
ओह! सॉरी बेंज, मेरा मतलब था कमांड मोड। मैंने इसे पहले ही पा लिया है: ``: स्रोत ~ / mysession.vim:।
जोगुसा

8
शॉर्ट है: तो ~ / फ़ाइल। यदि आप वर्तमान फ़ाइल को सरल बनाना चाहते हैं, तो% आपके लिए काम करेगा।
डैनियल बॉलीग

14
यदि आप एक सत्र फ़ाइल नाम निर्दिष्ट नहीं करते हैं, तो यह लिखने और पढ़ने के लिए डिफ़ॉल्ट होगा Session.vim। इसलिए यदि आप केवल अपनी वर्तमान निर्देशिका में केवल एक सत्र बचाना चाहते हैं, तो आप अपने वर्तमान सत्र को बचाने के लिए :mksessionया :mksविम का उपयोग कर सकते हैं , और बस vim -Sइसे वापस खोलने के लिए।
अनीशपेटेल

59

आप इन सत्र विकल्पों को अपने vimrc में सेट करना चाह सकते हैं। विशेष रूप से विकल्प तब कष्टप्रद होता है जब आपने सत्र बचाने के बाद अपना vimrc बदल दिया हो।

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
जोनीरा

11
या सिर्फ :xaएक कम कीस्ट्रोक। वाह!
रॉबिन

आप फ़ाइलों को स्वचालित रूप से सहेजने के लिए vim सेट कर सकते हैं (यदि आपको उस तरह की चीज़ पसंद है) आपके में .vimrc: vimrc au FocusLost * silent! wa यह किसी भी समय बफ़र को फोकस खो देता है ऑटो को बचाएगा।
ग्रैगो

32

यदि आप अपनी फ़ाइल एक्सप्लोरर / डैश के रूप में NERDTree का उपयोग करते हैं, तो मैं अंतर्निहित कमांड के बजाय xolox / vim-session प्लगइन की सिफारिश करूंगा । किसी कारण के लिए: NERDTree बफ़र्स को पुनर्स्थापित करने के लिए mksession विफल रहता है। आपका माइलेज अलग हो सकता है, लेकिन मुझे लगा कि मैं अपना अनुभव साझा करूंगा।


मैकविम के लिए, मुझे यह सुनिश्चित करने की आवश्यकता है: let g:nerdtree_tabs_open_on_gui_startup=0और let g:nerdtree_tabs_open_on_new_tab=0xolox / vim-session काम करने के लिए।
नियान्लिअगं

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()

यहां तक ​​कि एक शुरुआत के लिए इस स्क्रिप्ट को समझना और अनुकूलित करना कुछ आसान है।

कृपया ध्यान दें कि यह स्क्रिप्ट केवल यूनिक्स सिस्टम (MacOS / Linux) के लिए ठीक से काम करेगी, इसे विंडोज पर काम करने के लिए अनुकूलित करने की आवश्यकता है।


अद्यतन: जोड़ा जा रहा है 0xc0de के सुझाव, आप की जगह ले सकती VimEnterआप लोड सत्र के लिए विम चाहते हैं, तो इन लोगों के लिए लाइन ही अगर कोई तर्क प्रदान की जाती हैं :

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

1
आप केवल सत्र खोलना चाहते हैं यदि कोई तर्क नहीं दिया जाता है जैसे कि उदाहरण के लिए। if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de

धन्यवाद @ 0xc0de, बढ़िया सुझाव (मैंने खुद भी इसका इस्तेमाल शुरू किया था)। मैंने जवाब अपडेट कर दिया है।
मैथिलियो

मैं इसे कैसे संशोधित करूंगा ताकि अगर मैं तर्कों के साथ खुलता हूं तो यह उस सत्र को भी नहीं बचा सकता है
डॉ। मैनहट्टन

बहुत अच्छा है, लेकिन `exe 'स्रोत' b: sessionfile` को वहां एक डॉट की आवश्यकता है? और समस्या यह है कि ऑटोलैड सत्र वर्तमान होम डायरेक्टरी (द्वारा प्राप्त pwd) पर निर्भर करता है, मैं इसे कैसे बाहर निकलने से पहले अंतिम कार्य निर्देशिका सेट कर सकता हूं? ताकि यह सत्र के बजाय पिछले कार्य सत्र को लोड कर सके ~/?
वैन एबेल

आप सत्र है, लेकिन अभी भी यह अलग जवाब में इस बात का मेरे संशोधित संस्करण की जाँच अधिलेखन बिना निर्देशिका में एकल फ़ाइलें खोलने में सक्षम होना चाहते हैं: stackoverflow.com/questions/1642611/...
PMunch

6

इस कार्य के लिए एक बहुत ही उपयोगी प्लगइन है vim-startify जो हाल ही में खोली गई फ़ाइलों आदि जैसी कई अन्य चीजों को संभालता है, इसमें बहुत आसान इंटरफ़ेस भी है।

मैं कुछ दिनों से और अब तक इसका पूरी तरह से काम कर रहा हूं। आशा है कि यह आपकी मदद करता है।


5

चूँकि यह मेरे (और शायद अन्य) के लिए Google पर पहली हिट है, क्योंकि विम में सत्रों के साथ कैसे काम करना है, मैंने इसे स्वचालित बनाने के लिए @ मैथिलियो के जवाब में थोड़ा जोड़ने का फैसला किया है।

मुझे उसका कोड पसंद है, लेकिन "केवल अगर बिना आर्ग्स के" समाधान के अलावा कुछ कमी लग रही थी। यह मेरा संशोधित संस्करण है:

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

यहां उल्लेखनीय परिवर्तन वैकल्पिक ओवरराइड है। यदि आप विकल्पों के बिना विम खोलते हैं, तो यह किसी भी मौजूदा सत्र को खोलेगा और आपके छोड़ने पर किए गए बदलावों को अधिलेखित कर देगा। यदि विम विकल्पों के साथ खोला जाता है, तो यह केवल एक नया सत्र बनाएगा यदि कोई भी मौजूद नहीं है, इसका मतलब है कि आप एक निर्देशिका में एकल फ़ाइलों को खोल सकते हैं जिसमें एक सत्र बिना अधिलेखित किया गया है। फिर आप सत्र को चलाने के लिए विकल्प के बिना विम को खोल सकते हैं। यदि कोई सत्र मौजूद नहीं है, तो यह एक नया बनाता है।


मैंने अभी आपके उपरोक्त पोस्ट किए गए समाधान को Neovim 0.2.2 में आज़माया और अपना स्निपेट रखा, $HOME/.vim/plugin/sessions.vimलेकिन यह सत्र फ़ाइलों को सहेज नहीं रहा है। ¯ \ _ (ツ) _ / ¯
मरिच

यह धागा, और विशेष रूप से लिंक की गई टिप्पणी, मदद कर सकता है: superuser.com/questions/404686/… मैं इसे अपने .vimrc में रखता हूं और यह ठीक काम करता है।
PM

यह काम कर रहा है, जाहिरा तौर पर मुझे बाहर निकलना है (n) सत्र के लिए विम को गलत चुटकुले लिखे जाने के लिए धन्यवाद फिर से साझा करने के लिए धन्यवाद sharing
ipatch

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

YouTube पर एक अच्छा ट्यूटोरियल है।


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

धन्यवाद @mathielo @mathielo से उदाहरण के बाद, मैंने सक्रिय सत्र (यदि कोई हो) को बचाने के लिए .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]

vim सत्र शुरू होगा और आपको हर बार सत्र को बंद करने के लिए सत्र को बचाने के लिए चिंता करने की आवश्यकता नहीं है।

यदि आपके पास एक सक्रिय सत्र नहीं है तो .vimrc कुछ भी नहीं करेगा। पहले जैसा।

यही तो मैं ढूंढ रहा था! धन्यवाद फिर से @mathielo!


यही मैं भी ढूंढ रहा था। महान ! मुझे याद नहीं है कि मैंने अपना सत्र कितनी बार खो दिया :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

कई सत्रों (प्रति निर्देशिका / रेपो आधार पर) के प्रबंधन के लिए, मैंने हाल ही में विम-सत्र प्लगइन से विम-वर्कस्पेस पर स्विच किया है । इसका सत्र प्रबंधन अपेक्षाकृत सरल है और अच्छी तरह से काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.