Vim'de birden çok farklı oturumu nasıl kaydedebilir ve geri yükleyebilirim?


367

Vim'deki görevime bağlı olarak açık birkaç sekmem var.

Farklı oturumları daha sonra kullanmak üzere nasıl kaydedebilirim?


16
@ldigas Bence ppl burada eski bir okul forumu ya da bir terminal belgelerine göre (büyük yazı tipi, büyük biçimlendirme ile) soruyu bulmak daha rahat hissediyorum, ya da, cennet yasak bir mansayfa
puk

6
@ldigas Ben şahsen her zaman yeterince aptalca şeyler yok adam sayfaları b / c korkmuş. Linux'taki her şey gibi, dik bir öğrenme eğrisi vardır.
puk

45
@Idigas - Sanırım, kolektif akıllılar, google ve yığın taşması metaknowledge yönetimi arasındaki noktayı kaçırıyorsunuz - bu, cevaplarınızı almanın daha iyi bir yoludur - ihtiyacınız olan şey, uzun bir ezoterik seçenek listesi değil, ayrıca bu sayfa tuzakların gerçek dünya deneyimini ve hayatınızı kolaylaştırmak için genellikle şık kısayolları gösterir. Bu, baktığım neredeyse tüm kılavuzlar için de geçerlidir ( belki php çevrimiçi kılavuzu hariç ). Viva yığın akışı!
ErichBSchulz

2
@ldigas ve insanlar ileride başvurmak için kullanabilir, çünkü başka birinin ihtiyacı olabilir.
Mansuro

4
@idigas Bu soruların gerçek olduğunu düşünüyorum, bir vim acemi yardım sistemi ve nasıl kullanılacağı hakkında çok şey bilmiyor, ama daha fazla terbiyeleri varsa vim'de yollarını nasıl bulacağını bilecekler.
Edgar Klerks

Yanıtlar:


494

Gibi bir şey istiyorsun

:mksession ~/mysession.vim

Sonra daha sonra o vim dosyasını kaynak ve eski oturum geri olacak:

:source ~/mysession.vim

veya vS'yi -S seçeneğiyle açın:

$ vim -S ~/mysession.vim

27
Ooo, ve ben neredeyse yazarak geri yükleyebilirsiniz unuttum: gvim -S ~ / mysession.vim
Benj

1
Teşekkürler @ Benj. Vim'de yeniyim. Komut satırında nasıl 'kaynak' yapabilirim?
Jogusa

1
Posta ile gönder Üzgünüm Benj, komut kipi demek istedim. Zaten buldum: ``: kaynak ~ / mysession.vim´´.
Jogusa

8
Kısa: yani ~ / file. Mevcut dosyayı basit bir şekilde kaynaklamak istiyorsanız:% işi sizin için yapar.
Daniel Baulig

14
Bir oturum dosyası adı belirtmezseniz, varsayılan olarak bu dosyaya yazma ve bu dosyadan okuma yapılır Session.vim. Bu nedenle, geçerli dizininizde yalnızca bir oturumun kaydedilmesini istiyorsanız, geçerli oturumunuzu kaydetmek ve sadece açmak için vim'den :mksessionveya :mksvim'den kullanabilirsiniz vim -S.
anishpatel

59

Bu oturum seçeneklerini vimrc'nizde ayarlamak isteyebilirsiniz. Oturumu kaydettikten sonra vimrc'nizi değiştirdiğinizde özellikle seçenekler can sıkıcıdır.

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

1
Harika! Dün tam olarak bu problemi yaşadım. Çok teşekkürler!
Jogusa

40

Unutmayın: mksession, yaptığınız hiçbir dosyadaki değişiklikleri kaydetmeyecektir. Oturumu kaydettikten sonra oradan alacağım varsayılarak vim kapama hatasını yaptım. Ancak oturumu bir sonraki açışımda dosyalarda yaptığım değişiklikler kaybolmuştu.


11
Bu, ilgili herhangi bir cevapla birlikte gelmelidir :mksession.
Morgan Wilde

1
evet muhtemelen takip etmek istersiniz:wqa
JonnyRaa

11
veya sadece :xabir tane daha az tuşa basmak. Yaşasın!
robin

Ayrıca vim'i dosyaları otomatik olarak kaydetmek için ayarlayabilirsiniz (bu tür bir şey isterseniz) .vimrc: vimrc au FocusLost * silent! wa Bu, arabellek odağı her kaybettiğinde otomatik olarak kaydedilecektir.
grego

32

Eğer kullanırsanız NERDTree dosya gezgini / çizgi olarak, ben tavsiye ederim eklentisi Xolox / vim-oturumu mksession komutu: yerine Yerleşik. Nedense: mksession NERDTree arabelleklerini geri yükleyemiyor. Kilometreniz değişebilir, ancak deneyimlerimi paylaşacağımı düşündüm.


Macvim için şunları sağlamalıyım: let g:nerdtree_tabs_open_on_gui_startup=0ve let g:nerdtree_tabs_open_on_new_tab=0xolox / vim-session çalışmasını sağlamak için.
Nianliang

18

Eğer herhangi bir eklenti kullanmadan işlemini otomatikleştirmek istiyorsanız şunu kullanabilirsiniz uzağa git ve geri dönme gelen Vim İpuçları Wiki .

Vim'den her çıktığınızda mevcut oturumu kaydeder ~/.vim/sessionsve Vim açıldıktan sonra tekrar yükler. Aynı zamanda mevcut yolunuza da dayanmaktadır, bu yüzden Vim'i farklı dizinlerden açarsanız farklı oturumlar görürsünüz, bu da farklı projelerde çalışırken oldukça kullanışlıdır.

Sadece ~/.vimrcdosyanızı düzenleyin ve aşağıdakileri ekleyin:

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

Yeni başlayanlar için bile bu komut dosyasını anlamak ve özelleştirmek biraz kolaydır.

Bu komut dosyasının yalnızca Unix sistemleri (MacOS / Linux) için düzgün çalışacağını, Windows üzerinde çalışacak şekilde uyarlanması gerektiğini lütfen unutmayın .


GÜNCELLEME: 0xc0de'nin önerisini ekleyerek , VimEnterVim'in oturumu yalnızca bağımsız değişken sağlanmadıysa yüklemesini istiyorsanız, bu satırların satırını değiştirebilirsiniz :

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

1
Oturumu ancak vim için herhangi bir argüman sağlanmadığında açmak isteyebilirsiniz. if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de

Teşekkürler @ 0xc0de, büyük öneri (hatta kendim kullanmaya başladım). Cevabı güncelledim.
mathielo

bunu nasıl değiştiririm ki argümanlarla vim açarsam da bu oturumu kaydetmez
Dr Manhattan

çok iyi, ama 'exe' kaynak 'b: sessionfile` orada bir noktaya ihtiyacı var? ve sorun, otomatik yükleme oturumunun geçerli giriş dizinine (by by pwd) bağlı olması, çıkış vim'den önceki son çalışma dizini olarak nasıl ayarlayabilirim? böylece altındaki oturum yerine son çalışma oturumunu yükleyebilir ~/?
van abel

Oturumlar yapabilmek ancak yine de dizindeki tek dosyaları üzerine yazmadan açabilmek istiyorsanız, bunun ayrı bir cevapta değiştirilmiş
sürümüme göz atın

6

Yakın zamanda açılan dosyalar vb.Gibi birçok şeyi işleyen bu görev vim-startify için çok yararlı bir eklenti var, çok kolay bir arayüze sahip.

Birkaç günden beri kullanıyorum ve şimdiye kadar mükemmel çalışıyor. Umarım size yardımcı olur.


5

Bu, Google'da benim için (ve muhtemelen diğerlerinde) Vim'deki oturumlarla nasıl çalışılacağı için ilk hit olduğundan, @ mathielo'nun bu otomatikleştirmenin nasıl yapılacağıyla ilgili cevabına biraz eklemeye karar verdim.

Ben onun kodu gibi, ama "sadece args olmadan" çözüm eklenmesi biraz eksik gibi görünüyordu. Bu benim değiştirilmiş sürümüm:

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

Buradaki önemli değişiklik isteğe bağlı geçersiz kılmadır. Vim'i seçenekler olmadan açarsanız, mevcut oturumlar açılır ve ayrıldığınızda yapılan değişikliklerin üzerine yazılır. Vim seçeneklerle açılırsa, yalnızca hiçbir oturum yoksa yeni bir oturum oluşturur; bu, oturumu olan bir dizinde üzerine yazmadan tek dosyaları açabileceğiniz anlamına gelir. Ardından Vim'i oturumu çalıştırma seçenekleri olmadan açabilirsiniz. Bir oturum yoksa, yeni bir oturum oluşturur.


Neovim 0.2.2'de yukarıda belirtilen çözümünüzü denedim ve snippet'inizi yerleştirdim, $HOME/.vim/plugin/sessions.vimancak oturum dosyalarını kaydetmiyor . ¯ \ _ (ツ) _ / ¯
ipatch

Bu iş parçacığı ve özellikle bağlantılı yorum yardımcı olabilir: superuser.com/questions/404686/… .vimrc dosyamda var ve bu iyi çalışıyor.
PMunch

çalışma var, görünüşe göre oturum yazılması için (n) vim çıkmak zorunda kötü şaka eklemek paylaşmak için tekrar teşekkürler ip
ipatch

3

Bu harika eklenti vim-session çağrısı var . Çok güçlü. Yüklemek için:

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

Dosyamdaki işlevselliğini şu şekilde eşledim .vimrc:

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

Şimdi normal modda sadece yazın <leader>ssve böyle bir komut göreceksiniz

:SaveSession 

Şimdi oturumunuzun adını ekleyin

 :SaveSession namesession

ve hepsi bu.

Vim'i kapatıp yeniden açtığınızda

 :OpenSession

ve oturumunuzun açık olduğunu göreceksiniz.

.vimrcDosyanıza eklenecek çok sayıda başka yapılandırma var, örnekler için belgelere bakın:

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'da iyi bir öğretici var.


2

Şahsen ben tanımlamak ve yol yazmaktan kaçınmak için Tim Pope ' Obsession eklentisi üzerine sarın 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

Havayolu eklentisi ve oturumları ile ilgili özel sorunlar yaşadım. Obsession kullanmaya geçmek sorunları düzeltti, haftalarca süren mücadeleden sonra şaşırtıcı bir bulgu oldu. Bkz. Github.com/vim-airline/vim-airline/issues/…
icc97

1

Thanks @mathielo @mathielo örneğini takip ederek, aktif oturumu (varsa) kaydetmek için aşağıdaki satırı .vimrc'ye ekledim:

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

Daha fazla satır koymak istiyorsanız endif kullanmanız gerekir:

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

İle sadece yeni bir oturum kaydetmeniz gerekir

:mks [Session filename]

ve başladıktan sonra

$ vim -S [Session filename]

vim oturumu başlatır ve vim'i her kapatışınızda oturumu kaydetmek için endişelenmenize gerek yoktur.

Etkin bir oturumunuz yoksa .vimrc hiçbir şey yapmaz. Eskisi gibi.

Aradığım şey buydu! Tekrar teşekkürler mathielo!


Ben de aradım. Harika ! Bunun :qyerine seansımı kaç kez kaybettiğimi hatırlayamıyorum :bd... Teşekkürler!
Joel.O

1

Eğer proje için sadece 1 seans almayı planlıyorsanız,

:mks

Session.vimgeçerli dizinde bir dosya oluşturur ve oturumu açmak için (aynı dizinden):

vim -S

Oturumu değiştirir ve kaydetmek isterseniz:

:mks!

Bu, oturumu kaydeder, dosyaların kendisi değil!

Birden çok oturuma sahip olmayı planlıyorsanız , bunları projenin dizinindeki gizli dosyalara kaydetmeyi tercih ederim:

:mks .session-name.vim

Açmak için (aynı dizinden):

vim -S .session-name.vim

Oturumu kaydet:

:mks! .session-name.vim

Oturumlar gizli dosyalara kaydedildiği için görüntülemek için unutma -a

ls -a

0

Oturumu istediğiniz yere kaydedebilirsiniz.

Ör:

:mksession! D:/session.ses

Bu, oturumu D sürücüsünde depolar.

Bu yazı yazarak açılabilir

:so D:/session.ses

vim dosyalarından herhangi birinde.


0

Aşağıda tek konf. bu gerçekten benim için çalıştı. Buradan aldım , burada daha eksiksiz / karmaşık bir versiyon da alabilirsiniz.

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

Birden çok oturumu yönetmek için (dizin / repo temelinde) son zamanlarda vim-session eklentisinden vim-workspace'e geçtim . Oturum yönetimi nispeten basittir ve oldukça iyi çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.