Bagaimana cara menyimpan dan mengembalikan beberapa sesi yang berbeda di Vim?

367

Tergantung pada tugas saya di Vim saya memiliki beberapa tab terbuka.

Bagaimana saya bisa menyimpan sesi yang berbeda untuk digunakan nanti?

Jogusa
sumber
16
@ldigas Saya pikir ppl merasa lebih nyaman menemukan pertanyaan di sini (dengan font besar, format hebat ...) daripada di forum sekolah tua atau dokumentasi terminal, atau, astaga, manhalaman
puk
6
@ldigas Saya pribadi selalu takut pergi oleh halaman buku b / c mereka tidak cukup bodoh. Sama seperti yang lainnya di linux, ia memiliki kurva belajar yang curam.
puk
45
@Idigas - Saya pikir Anda kehilangan titik bahwa antara kecerdasan kolektif kita, google, dan manajemen metaknowledge stack overflow - ini hanyalah cara yang lebih baik untuk mendapatkan jawaban Anda - apa yang Anda butuhkan, bukan daftar panjang opsi esoterik, juga seperti halaman ini menggambarkan pengalaman jebakan dunia nyata, dan sering kali benar-benar jalan pintas untuk membuat hidup Anda lebih mudah. Ini berlaku sama untuk hampir semua manual yang pernah saya lihat (kecuali mungkin manual php online). Viva stackoverflow!
ErichBSchulz
2
@ldigas dan orang-orang dapat menggunakannya untuk referensi di masa mendatang, karena orang lain mungkin membutuhkannya.
Mansuro
4
@ Idigas Saya pikir pertanyaan-pertanyaan ini nyata dalam arti, bahwa seorang pemula vim tidak tahu banyak tentang sistem bantuan dan bagaimana menggunakannya, tetapi jika mereka semakin berpengalaman mereka akan tahu bagaimana menemukan jalan mereka dalam vim.
Edgar Klerks

Jawaban:

494

Anda menginginkan sesuatu seperti

:mksession ~/mysession.vim

Kemudian nanti Anda dapat sumber file vim itu dan Anda akan memiliki sesi lama Anda kembali:

:source ~/mysession.vim

atau buka vim dengan opsi -S:

$ vim -S ~/mysession.vim
Benj
sumber
27
Ooo, dan saya hampir lupa Anda dapat memuatnya kembali dengan mengetik: gvim -S ~ / mysession.vim
Benj
1
Terima kasih @Benj. Saya baru di vim. Bagaimana saya bisa 'sumber' di baris perintah?
Jogusa
1
Ups! Maaf Benj, maksudku mode perintah. Saya sudah menemukannya: ``: source ~ / mysession.vim´´.
Jogusa
8
Pendek adalah: jadi ~ / file. Jika Anda ingin sumber file saat ini sederhana: jadi% akan melakukan pekerjaan untuk Anda.
Daniel Baulig
14
Jika Anda tidak menentukan nama file sesi, itu akan menjadi default untuk menulis dan membaca dari Session.vim. Jadi jika Anda hanya ingin menyimpan satu sesi di direktori Anda saat ini, Anda dapat menggunakan :mksessionatau :mksdari vim untuk menyimpan sesi Anda saat ini, dan hanya vim -Suntuk membukanya kembali.
anishpatel
59

Anda mungkin ingin mengatur opsi sesi ini di vimrc Anda. Khususnya opsi menjengkelkan ketika Anda telah mengubah vimrc Anda setelah Anda menyimpan sesi.

set ssop-=options    " do not store global and local values in a session
set ssop-=folds      " do not store folds
Jan Christoph
sumber
1
Bagus! Saya memiliki masalah ini kemarin. Terima kasih banyak!
Jogusa
40

Perhatikan bahwa: mksession tidak akan menyimpan perubahan ke file apa pun yang Anda buat. Saya membuat kesalahan dengan menutup vim setelah menyimpan sesi dengan asumsi saya akan mengambil dari sana. Tapi lain kali saya membuka sesi, perubahan yang saya buat pada file-file itu hilang.

Deepanshu
sumber
11
Ini harus disertai dengan jawaban yang terkait dengan :mksession.
Morgan Wilde
1
ya Anda mungkin ingin mengikuti dengan:wqa
JonnyRaa
11
atau hanya :xaSatu penekanan tombol kurang. Yay!
robin
Anda juga dapat mengatur vim untuk secara otomatis menyimpan file (jika Anda suka hal semacam itu) di .vimrc: Anda vimrc au FocusLost * silent! wa ini akan secara otomatis menghemat kapan saja buffer kehilangan fokus.
grego
32

Jika Anda menggunakan NERDTree sebagai file explorer / dash Anda, saya akan merekomendasikan plugin xolox / vim-session alih-alih perintah built-in: mksession. Untuk beberapa alasan,: mksession gagal mengembalikan buffer NERDTree. Jarak tempuh Anda mungkin berbeda, tetapi saya pikir saya akan membagikan pengalaman saya.

gdso
sumber
Untuk macvim, saya perlu memastikan: let g:nerdtree_tabs_open_on_gui_startup=0dan let g:nerdtree_tabs_open_on_new_tab=0untuk membuat sesi xolox / vim berfungsi.
Nianliang
18

Jika Anda ingin mengotomatiskan proses tanpa menggunakan plugin apa pun, Anda dapat menggunakan Go away dan kembali dari Vim Tips Wiki .

Setiap kali Anda keluar dari Vim itu akan menyimpan sesi saat ini di bawah ~/.vim/sessionsdan memuatnya kembali setelah Vim dibuka. Ini juga berdasarkan jalur Anda saat ini, jadi jika Anda membuka Vim dari direktori yang berbeda, Anda akan memiliki sesi yang berbeda, yang cukup berguna ketika mengerjakan proyek yang berbeda.

Cukup edit ~/.vimrcfile Anda dan tambahkan berikut ini:

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

Bahkan untuk seorang pemula, skrip ini agak mudah dipahami dan disesuaikan.

Harap dicatat skrip ini hanya akan berfungsi dengan baik untuk sistem Unix (MacOS / Linux), itu perlu disesuaikan untuk bekerja pada Windows.


UPDATE: Menambahkan saran 0xc0de , Anda dapat mengganti VimEnterbaris untuk yang ini jika Anda ingin Vim memuat sesi hanya jika tidak ada argumen yang diberikan :

if(argc() == 0)
  au VimEnter * nested :call LoadSession()
endif
mathielo
sumber
1
Anda mungkin ingin membuka sesi hanya jika tidak ada argumen untuk vim misalnya. if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de
Terima kasih @ 0xc0de, saran bagus (Saya bahkan mulai menggunakannya sendiri). Saya telah memperbarui jawabannya.
mathielo
bagaimana saya memodifikasi ini sehingga jika saya membuka vim dengan argumen itu juga tidak menyimpan sesi itu
Dr Manhattan
sangat bagus, tetapi `exe 'sumber' b: sessionfile` perlu sebuah titik di sana? dan masalahnya adalah bahwa sesi autoload tergantung pada direktori home saat ini (dapatkan pwd) bagaimana saya bisa mengaturnya menjadi direktori kerja terakhir sebelum keluar dari vim? sehingga bisa memuat sesi kerja terakhir daripada sesi di bawah ~/?
van abel
Jika Anda ingin dapat memiliki sesi tetapi masih membuka file tunggal di direktori tanpa menimpanya, periksa versi saya yang dimodifikasi ini di jawaban terpisah: stackoverflow.com/questions/1642611/…
PMunch
6

Ada plugin yang sangat berguna untuk tugas ini vim-startify yang menangani banyak hal lain seperti file yang baru dibuka dll, ia juga memiliki antarmuka yang sangat mudah.

Saya menggunakannya sejak beberapa hari dan sampai sekarang ini berfungsi dengan baik. Semoga ini bisa membantu Anda.

vivek
sumber
5

Karena ini adalah hit pertama di Google untuk saya (dan mungkin yang lain) untuk cara bekerja dengan sesi di Vim, saya memutuskan untuk menambahkan sedikit pada jawaban @ mathielo tentang cara membuat ini otomatis.

Saya suka kode nya, tetapi penambahan solusi "hanya jika tanpa arg" tampaknya agak kurang. Ini adalah versi saya yang dimodifikasi:

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

Perubahan penting di sini adalah penggantian opsional. Jika Anda membuka Vim tanpa opsi, itu akan membuka sesi yang ada dan menimpa perubahan yang dibuat saat Anda pergi. Jika Vim dibuka dengan opsi, itu hanya akan membuat sesi baru jika tidak ada, ini berarti Anda dapat membuka file tunggal dalam direktori yang memiliki sesi tanpa menimpanya. Maka Anda dapat membuka Vim tanpa opsi untuk menjalankan sesi sebagai gantinya. Jika tidak ada sesi, maka sesi akan dibuat yang baru.

Siang
sumber
Saya baru saja mencoba solusi Anda yang diposting di atas di Neovim 0.2.2 dan menempatkan cuplikan Anda $HOME/.vim/plugin/sessions.vimtetapi tidak menyimpan file sesi. ¯ \ _ (ツ) _ / ¯
ipatch
Utas ini, dan khususnya komentar yang ditautkan, dapat membantu: superuser.com/questions/404686/... Saya memilikinya di .vimrc saya dan itu berfungsi dengan baik.
PMunch
berhasil, rupanya saya harus keluar (n) vim agar sesi dapat ditulis masukkan lelucon buruk Terima kasih lagi untuk berbagi 👍
ipatch
3

Ada vim-sesi panggilan plugin yang luar biasa ini . Ini sangat kuat. Untuk menginstalnya:

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

Saya telah memetakan fungsinya dalam .vimrcfile saya seperti ini:

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

Sekarang dalam mode normal ketik saja <leader>ssdan Anda akan melihat perintah seperti ini

:SaveSession 

Sekarang tambahkan nama sesi Anda

 :SaveSession namesession

dan itu saja.

Ketika Anda menutup Vim dan membukanya kembali lakukan saja

 :OpenSession

dan Anda akan melihat sesi Anda terbuka.

Ada banyak konfigurasi lain untuk ditambahkan dalam .vimrcfile Anda lihat dokumentasi sebagai contoh:

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

Ada tutorial yang bagus di YouTube.

WALID BELRHALMIA
sumber
2

Secara pribadi saya hanya membungkus plugin Obsesi Tim Pope untuk memungkinkan mendefinisikan sessiondirdan menghindari mengetik jalan:

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
Archf
sumber
saya punya masalah khusus dengan plugin dan sesi Maskapai. Beralih ke menggunakan Obsesi memperbaiki masalah, itu adalah penemuan yang luar biasa setelah berminggu-minggu berjuang. Lihat github.com/vim-airline/vim-airline/issues/…
icc97
1

Terima kasih @mathielo Mengikuti contoh dari @mathielo, saya menambahkan baris di bawah ini ke .vimrc untuk menyimpan sesi aktif (jika ada):

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

Jika Anda ingin meletakkan lebih banyak baris, Anda perlu menggunakan endif:

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

Anda hanya perlu menyimpan sesi baru di vim with

:mks [Session filename]

dan setelah mulai dengan

$ vim -S [Session filename]

vim akan memulai sesi dan Anda tidak perlu khawatir untuk menyimpan sesi setiap kali Anda menutup vim.

Jika Anda tidak memiliki sesi aktif .vimrc tidak akan melakukan apa pun. Seperti sebelumnya.

Itu yang saya cari! Terima kasih lagi @mathielo!

oml
sumber
Ini yang saya cari juga. Bagus ! Saya tidak ingat berapa kali saya kehilangan sesi saya :qalih - alih :bd... Terima kasih!
Joel.O
1

Jika Anda berencana hanya memiliki 1 sesi untuk proyek, lakukan saja

:mks

yang akan membuat Session.vimfile di direktori saat ini, dan kemudian membuka sesi (dari direktori yang sama):

vim -S

Jika Anda mengubah sesi dan ingin menyimpannya:

:mks!

Ini menyimpan sesi, bukan file itu sendiri!

Jika Anda berencana memiliki beberapa sesi , saya lebih suka menyimpannya dalam file tersembunyi di direktori proyek:

:mks .session-name.vim

Untuk membukanya (dari direktori yang sama):

vim -S .session-name.vim

Simpan sesi:

:mks! .session-name.vim

Karena sesi disimpan dalam file tersembunyi, untuk melihatnya jangan lupa -a

ls -a
cute_ptr
sumber
0

Anda dapat menyimpan sesi di mana pun Anda inginkan.

Ex:

:mksession! D:/session.ses

Ini menyimpan sesi dalam drive D.

Ini bisa dibuka dengan mengetik

:so D:/session.ses

di salah satu file vim.

Sagar Jain
sumber
0

Di bawah ini adalah satu-satunya conf. itu benar-benar bekerja untuk saya. Saya mengambilnya dari sini , di mana Anda juga dapat mengambil versi yang lebih lengkap / kompleks.

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
John Torugo
sumber
0

Untuk mengelola beberapa sesi (berdasarkan per direktori / repo), saya baru saja beralih dari plugin vim-session ke vim-workspace . Manajemen sesinya relatif sederhana dan bekerja dengan cukup baik.

Jaybay
sumber