Làm cách nào để lưu và khôi phục nhiều phiên khác nhau trong Vim?


367

Tùy thuộc vào nhiệm vụ của tôi trong Vim, tôi có một vài tab đang mở.

Làm thế nào tôi có thể lưu các phiên khác nhau để sử dụng sau này?


16
@ldigas Tôi nghĩ ppl cảm thấy thoải mái hơn khi tìm câu hỏi ở đây (với phông chữ lớn, định dạng tuyệt vời ...) so với trên một diễn đàn trường học cũ hoặc tài liệu đầu cuối, hoặc, trời cấm, một mantrang
puk

6
@ldigas Cá nhân tôi luôn sợ hãi bởi những trang nam b / c họ không đủ để làm mọi thứ ngớ ngẩn. Giống như mọi thứ khác trong linux, nó có một đường cong học tập dốc.
puk

45
@Idigas - Tôi nghĩ rằng bạn đang thiếu điểm giữa các thông minh tập thể của chúng tôi, google và quản lý metaknowledge ngăn xếp - đây đơn giản là một cách tốt hơn để nhận câu trả lời của bạn - những gì bạn cần, không phải là một danh sách dài các tùy chọn bí truyền, cũng như trang này minh họa kinh nghiệm thực tế về bẫy và thường là các phím tắt thực sự tiện lợi để làm cho cuộc sống của bạn dễ dàng hơn. Điều này áp dụng như nhau cho hầu hết mọi hướng dẫn mà tôi đã xem (ngoại trừ có thể là hướng dẫn trực tuyến php). Viva stackoverflow!
ErichBSchulz

2
@ldigas và mọi người có thể sử dụng nó để tham khảo trong tương lai, vì người khác có thể cần nó.
Mansuro

4
@idigas Tôi nghĩ rằng những câu hỏi này là có thật, rằng người mới bắt đầu vim không biết nhiều về hệ thống trợ giúp và cách sử dụng nó, nhưng nếu họ dày dạn hơn, họ sẽ biết cách tìm đường trong vim.
Edgar Klerks

Câu trả lời:


494

Bạn muốn một cái gì đó như

:mksession ~/mysession.vim

Sau đó, bạn có thể nguồn tệp vim đó và bạn sẽ quay lại phiên cũ:

:source ~/mysession.vim

hoặc mở vim với tùy chọn -S:

$ vim -S ~/mysession.vim

27
Ooo, và tôi gần như quên bạn có thể tải nó trở lại bằng cách gõ: gvim -S ~ / mysession.vim
Benj

1
Cảm ơn @Benj. Tôi mới vào vim. Làm thế nào tôi có thể 'nguồn' trong dòng lệnh?
Jogusa

1
Ôi trời! Xin lỗi, tôi có nghĩa là chế độ lệnh. Tôi đã tìm thấy nó rồi: ``: source ~ / mysession.vim tầm hung.
Jogusa

8
Viết tắt là: so ~ / file. Nếu bạn tình cờ muốn tìm nguồn tệp hiện tại một cách đơn giản: vì vậy% sẽ thực hiện công việc cho bạn.
Daniel Baulig

14
Nếu bạn không chỉ định tên tệp phiên, nó sẽ mặc định ghi và đọc từ đó Session.vim. Vì vậy, nếu bạn chỉ muốn có một phiên được lưu trong thư mục hiện tại của mình, bạn có thể sử dụng :mksessionhoặc :mkstừ vim để lưu phiên hiện tại của mình và chỉ cần vim -Smở lại sao lưu.
anishpatel 17/03/2015

59

Bạn có thể muốn đặt các tùy chọn phiên này trong vimrc của mình. Đặc biệt là các tùy chọn gây khó chịu khi bạn thay đổi vimrc sau khi bạn đã lưu phiên.

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

1
Tuyệt quá! Tôi đã có chính xác vấn đề này ngày hôm qua. Cảm ơn rất nhiều!
Jogusa

40

Lưu ý rằng: mksession sẽ không lưu các thay đổi vào bất kỳ tệp nào bạn đã thực hiện. Tôi đã phạm sai lầm này khi đóng vim sau khi lưu phiên với giả định rằng tôi sẽ tiếp tục từ đó. Nhưng lần sau khi tôi mở phiên, những thay đổi tôi đã thực hiện đối với các tệp đã biến mất.


11
Điều này sẽ đi kèm với bất kỳ câu trả lời liên quan đến :mksession.
Morgan Wilde

1
vâng, bạn có thể muốn theo dõi với:wqa
JonnyRaa 11/03/2015

11
hoặc chỉ :xamột cú gõ phím ít hơn. Yay!
cướp

Bạn cũng có thể đặt vim để tự động lưu tệp (nếu bạn thích loại đó) trong phần này .vimrc: vimrc au FocusLost * silent! wa Điều này sẽ tự động lưu bất cứ khi nào bộ đệm mất tiêu điểm.
grego

32

Nếu bạn sử dụng NERDTree làm trình thám hiểm tệp / dash của bạn, tôi sẽ khuyên dùng plugin xolox / vim-session thay vì lệnh tích hợp: mksession. Vì một số lý do ,: mksession không khôi phục bộ đệm NERDTree. Số dặm của bạn có thể thay đổi, nhưng tôi nghĩ tôi sẽ chia sẻ kinh nghiệm của mình.


Đối với macvim, tôi cần đảm bảo: let g:nerdtree_tabs_open_on_gui_startup=0let g:nerdtree_tabs_open_on_new_tab=0để làm cho xolox / vim-session hoạt động.
Nianliang

18

Nếu bạn muốn tự động hóa quy trình mà không cần sử dụng bất kỳ plugin nào, bạn có thể sử dụng Go Away và quay lại từ Vim Tips Wiki .

Mỗi lần bạn thoát Vim, nó sẽ lưu phiên hiện tại bên dưới ~/.vim/sessionsvà tải lại lần nữa sau khi Vim được mở. Nó cũng dựa trên đường dẫn hiện tại của bạn, vì vậy nếu bạn mở Vim từ các thư mục khác nhau, bạn sẽ có các phiên khác nhau, điều này khá hữu ích khi làm việc trên các dự án khác nhau.

Chỉ cần chỉnh sửa ~/.vimrctệp của bạn và thêm vào như sau:

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

Ngay cả đối với người mới bắt đầu, kịch bản này có phần dễ hiểu và tùy chỉnh.

Xin lưu ý rằng tập lệnh này sẽ chỉ hoạt động đúng cho các hệ thống Unix (MacOS / Linux), nó cần được điều chỉnh để hoạt động trên Windows.


CẬP NHẬT: Thêm đề xuất của 0xc0de , bạn có thể thay thế VimEnterdòng cho những đề xuất này nếu bạn muốn Vim chỉ tải phiên nếu không có đối số nào được cung cấp :

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

1
Bạn có thể muốn mở phiên chỉ khi không có đối số được cung cấp cho vim, vd. if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de

Cảm ơn @ 0xc0de, gợi ý tuyệt vời (tôi thậm chí đã bắt đầu sử dụng nó cho mình). Tôi đã cập nhật câu trả lời.
mathielo

Làm thế nào để tôi sửa đổi điều này để nếu tôi mở vim bằng các đối số thì nó cũng không lưu phiên đó
Tiến sĩ Manhattan

rất tốt, nhưng 'exe' source 'b: sessionfile` cần một dấu chấm ở đó? và vấn đề là phiên tự động tải phụ thuộc vào thư mục chính hiện tại (get by pwd) làm thế nào tôi có thể đặt nó làm thư mục làm việc cuối cùng trước khi thoát vim? để nó có thể tải phiên làm việc cuối cùng thay vì phiên dưới ~/?
van abel

Nếu bạn muốn có thể có phiên nhưng vẫn mở các tệp đơn trong thư mục mà không ghi đè, hãy kiểm tra phiên bản sửa đổi của tôi trong câu trả lời riêng: stackoverflow.com/questions/1642611/
PMunch

6

Có một plugin rất hữu ích cho tác vụ này vim-startify xử lý nhiều thứ khác như các tệp được mở gần đây, v.v., nó cũng có giao diện rất dễ dàng.

Tôi đang sử dụng nó từ vài ngày và cho đến bây giờ nó hoạt động hoàn hảo. Hy vọng nó sẽ giúp bạn.


5

Vì đây là lần đầu tiên trên Google đối với tôi (và có lẽ là những người khác) về cách làm việc với các phiên trong Vim, tôi đã quyết định thêm một chút vào câu trả lời của @ mathielo về cách thực hiện tự động này.

Tôi thích mã của anh ấy, nhưng việc bổ sung giải pháp "chỉ khi không có đối số" có vẻ hơi thiếu. Đây là phiên bản sửa đổi của tôi:

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

Sự thay đổi đáng chú ý ở đây là ghi đè tùy chọn. Nếu bạn mở Vim mà không có tùy chọn, nó sẽ mở bất kỳ phiên hiện có nào và ghi đè lên các thay đổi được thực hiện khi bạn rời khỏi. Nếu Vim được mở với các tùy chọn, nó sẽ chỉ tạo một phiên mới nếu không tồn tại, điều này có nghĩa là bạn có thể mở các tệp duy nhất trong một thư mục có phiên mà không ghi đè lên nó. Sau đó, bạn có thể mở Vim mà không có tùy chọn để chạy phiên thay thế. Nếu không tồn tại một phiên thì nó sẽ tạo một phiên mới.


Tôi vừa thử giải pháp được đăng ở trên của bạn trong Neovim 0.2.2 và đặt đoạn mã của bạn vào $HOME/.vim/plugin/sessions.vimnhưng nó không lưu các tệp phiên. ¯ \ _ (ツ) _ / ¯
ipatch

Chủ đề này, và đặc biệt là nhận xét được liên kết, có thể giúp: superuser.com/questions/404686/ nam Tôi có nó trong .vimrc của tôi và nó hoạt động tốt.
PMunch

Làm cho nó hoạt động, rõ ràng tôi phải thoát (n) vim để phiên được viết chèn câu chuyện dở khóc Cảm ơn một lần nữa vì đã chia sẻ 👍
ipatch

3

Có plugin gọi vim-session tuyệt vời này . Nó rất mạnh mẽ. Để cài đặt nó:

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

Tôi đã ánh xạ chức năng của nó trong .vimrctập tin của mình như thế này:

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

Bây giờ trong chế độ bình thường chỉ cần gõ <leader>ssvà bạn sẽ thấy một lệnh như thế này

:SaveSession 

Bây giờ thêm tên phiên của bạn

 :SaveSession namesession

và đó là tất cả.

Khi bạn đóng Vim và mở lại, bạn chỉ cần làm

 :OpenSession

và bạn sẽ thấy phiên của bạn mở.

Có rất nhiều cấu hình khác để thêm vào .vimrctệp của bạn, xem tài liệu để biết ví dụ:

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

Có một hướng dẫn tốt trên YouTube.


2

Cá nhân tôi chỉ gói qua plugin Nỗi ám ảnh của Tim Pope để cho phép xác định a sessiondirvà tránh gõ đường dẫn:

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

tôi gặp vấn đề cụ thể với plugin và phiên Airline. Chuyển sang sử dụng Nỗi ám ảnh đã khắc phục các vấn đề, đó là một phát hiện đáng kinh ngạc sau nhiều tuần vật lộn. Xem github.com/vim-airline/vim-airline/issues/ từ
icc97

1

Cảm ơn @mathielo Ví dụ sau từ @mathielo, tôi đã thêm dòng dưới đây vào .vimrc để lưu phiên hoạt động (nếu có):

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

Nếu bạn muốn đặt nhiều dòng hơn, bạn cần sử dụng endif:

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

Bạn chỉ cần lưu một phiên mới trong vim với

:mks [Session filename]

và sau khi bắt đầu với

$ vim -S [Session filename]

vim sẽ bắt đầu phiên và bạn không cần phải lo lắng để lưu phiên mỗi khi bạn đóng vim.

Nếu bạn không có phiên hoạt động .vimrc sẽ không làm gì cả. Như trước.

Đó là những gì tôi đang tìm kiếm! Cảm ơn một lần nữa @mathielo!


Đây là những gì tôi đang tìm kiếm quá. Tuyệt quá ! Tôi không thể nhớ mình đã mất bao nhiêu lần :qthay vì :bd... Cảm ơn!
Joel.O

1

Nếu bạn có kế hoạch chỉ có 1 phiên cho dự án, hãy làm

:mks

sẽ tạo một Session.vimtệp trong thư mục hiện tại và sau đó để mở phiên (từ cùng thư mục):

vim -S

Nếu bạn thay đổi phiên và muốn lưu nó:

:mks!

Điều này lưu phiên, không phải các tập tin chính mình!

Nếu bạn dự định có nhiều phiên , tôi thích lưu chúng trong các tệp ẩn trong thư mục của dự án:

:mks .session-name.vim

Để mở nó (từ cùng thư mục):

vim -S .session-name.vim

Lưu phiên:

:mks! .session-name.vim

Vì các phiên được lưu trong các tệp ẩn, để xem chúng, đừng quên -a

ls -a

0

Bạn có thể lưu trữ phiên bất cứ nơi nào bạn muốn.

Ví dụ:

:mksession! D:/session.ses

Điều này lưu trữ phiên trong ổ D.

Điều này có thể được mở bằng cách gõ

:so D:/session.ses

trong bất kỳ tập tin vim.


0

Dưới đây là conf duy nhất. điều đó thực sự hiệu quả với tôi Tôi đã lấy nó từ đây , nơi bạn cũng có thể có một phiên bản hoàn chỉnh / phức tạp hơn.

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

Để quản lý nhiều phiên (trên cơ sở mỗi thư mục / repo), gần đây tôi đã chuyển từ plugin vim-session sang vim-workspace . Quản lý phiên của nó là tương đối đơn giản và hoạt động khá tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.