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?
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?
Câu trả lời:
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
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 :mksession
hoặc :mks
từ vim để lưu phiên hiện tại của mình và chỉ cần vim -S
mở lại sao lưu.
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
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.
:mksession
.
:wqa
:xa
một cú gõ phím ít hơn. Yay!
.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.
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.
let g:nerdtree_tabs_open_on_gui_startup=0
và let g:nerdtree_tabs_open_on_new_tab=0
để làm cho xolox / vim-session hoạt động.
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/sessions
và 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 ~/.vimrc
tệ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ế VimEnter
dò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
if argc() == 0 au VimEnter * nested :call LoadSession() end
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 ~/
?
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.
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.
$HOME/.vim/plugin/sessions.vim
nhưng nó không lưu các tệp phiên. ¯ \ _ (ツ) _ / ¯
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 .vimrc
tậ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>ss
và 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 .vimrc
tệ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.
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 sessiondir
và 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
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!
:q
thay vì :bd
... Cảm ơn!
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.vim
tệ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
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.
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
Để 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.
man
trang